Каркас Windows-приложения. Особенности нового каркаса. Перемещение в пространстве (с текстурированными стенами), страница 17

float

height = 1,   // Height Of Ball From Floor

angleX, angleY,  // X, Y Rotation

xv, yv,       // X, Y Rotation Speed

z = -4,       // Z Position

ambient[] = {0.7f, 0.7f, 0.7f, 1}, // Light Parameters

diffuse[] = {1, 1, 1, 1},

position[] = {4, 4, 6, 1};

GLUquadricObj *q; // Used to generate quadric objects

UINT texture[3];

TCHAR

curDir[MAX_PATH], *pFile[3], // Bitmap files pointers

*files[3] = { "/Data/Floor.bmp", "/Data/Ball.bmp", "/Data/Lights.bmp" };

Функцию LoadTexture оставьте без изменений, замените лишь режим фильтрации на GL_LINEAR. Мы собираемся изобразить пляжный мяч, в котором будут отражаться блики света. Для этой цели понадобятся две текстуры, третья текстура будет использована для изображения плоской поверхности пола. Таким образом функция Init должна загрузить 3 bitmap-файла. Так как для рассматриваемой технологии подойдут не любые текстуры, то файловый диалог не будет использован.

bool Init ()

{

::GetCurrentDirectory (MAX_PATH-1, curDir);

if (pFile[0] == 0)

{

for (int i=0; i<3; i++)

{

pFile[i] = strcpy (new TCHAR[MAX_PATH], curDir);

pFile[i] = strcat (pFile[i], files[i]);

}

}

for (int i=0; i<3; i++)

{

if (!LoadTexture (pFile[i], texture + i))

return false;

}

glClearColor (0.2f, 0.5f, 1, 1);

glShadeModel (GL_SMOOTH);

glEnable (GL_DEPTH_TEST);

glClearDepth (1);

glDepthFunc (GL_LEQUAL);

glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

glEnable (GL_LIGHT0);

glLightfv (GL_LIGHT0, GL_AMBIENT, ambient);

glLightfv (GL_LIGHT0, GL_DIFFUSE, diffuse); 

glLightfv (GL_LIGHT0, GL_POSITION, position);

glEnable(GL_TEXTURE_2D);

q = gluNewQuadric();

gluQuadricNormals (q, GL_SMOOTH);

gluQuadricTexture (q, GL_TRUE);

glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);

return true;

}

Библиотека GL Utility позволяет создавать некоторые стандартные трехмерные объекты, точнее поверхности, которые описываются уравнениями второго порядка (quadric equations).

Функции, имеющие отношение к таким объектам, включают в свое имя корень Quadric. Например, функция gluNewQuadric создает новый объект (quadric object), с помощью которого производится генерация и настройка поверхности. После создания quadric-объекта q, его надо настроить. Функция gluQuadricNormals задает способ вычисления нормали. Как вы видели на примере икосаэдра, мягкая нормаль (см. установку GL_SMOOTH) сглаживает грани примитивов, из которых составлена поверхность.

Функция gluQuadricTexture позволяет включить в процесс генерации поверхности текстуру. Непосредственное создание поверхности происходит в недрах функций: gluSphere, gluCylinder, gluDisk и gluPartialDisk. Как видите, их не так много. Мультитекстурированный мяч создается внутри функции DrawBall двойным вызовом gluSphere.

void DrawBall()

{

glBindTexture (GL_TEXTURE_2D, texture[1]);

gluSphere (q, 0.35f, 32, 16); // Draw a sphere using texture

glBindTexture (GL_TEXTURE_2D, texture[2]);

glEnable (GL_TEXTURE_GEN_S); // Now spheric texture generation is on

glEnable (GL_TEXTURE_GEN_T);

glEnable (GL_BLEND);        // Now blending is on

glBlendFunc (GL_SRC_ALPHA, GL_ONE);

//=== Draw another sphere using new texture. Textures will mix creating a multiTexture mffect (a kind of reflection)

gluSphere (q, 0.35f, 32, 16);

glDisable (GL_TEXTURE_GEN_S);

glDisable (GL_TEXTURE_GEN_T);

glDisable (GL_BLEND);

}

Плоская поверхность пола создается стандартным способом, суть которого в сопоставлении текстурных координат координатам вершин.

void DrawFloor()

{

glBindTexture (GL_TEXTURE_2D, texture[0]);

glBegin(GL_QUADS);

glNormal3f (0, 1, 0);

glTexCoord2f (0, 1); glVertex3f (-2, 0, 2);  // Left Bottom Corner

glTexCoord2f (0, 0); glVertex3f (-2, 0,-2);  // Left Top

glTexCoord2f (1, 0); glVertex3f ( 2, 0,-2);  // Right Top

glTexCoord2f (1, 1); glVertex3f ( 2, 0, 2);  // Right Bottom

glEnd();

}

Функция Draw использует эти функции для создания сцены

void Draw ()

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);