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);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.