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

glColor4f (1, 1, 1, 0.5f);// Full Brightness.  50% Alpha

glBlendFunc (GL_SRC_ALPHA, GL_ONE); // Set The Blending Function For Translucency

return true;

}

Степень непрозрачности (opacity) куба задана с помощью glColor4f (1, 1, 1, 0.5f);. Метод смешивания задан с помощью двух констант: GL_SRC_ALPHA и GL_ONE. Они говорят OpenGL, что источник полупрозрачен, а мишень непрозрачна. Трактуйте это так. Передняя стенка полупрозрачна, а задняя — нет. Функцию перерисовки оствьте без изменений. В функцию Update внесите изменения, как показано ниже. Обратите внимание на новую регулировку (клавиша A — Ambient). Она задает интенсивность фонового освещения и работает только если освещение включено (клавиша L).

void Update (DWORD ms)

{

if (gInfo.keys[VK_ESCAPE])

{

gInfo.bQuit = true;

PostMessage (gInfo.hWnd, WM_QUIT, 0, 0);

}

if (gInfo.keys[VK_F1])

PostMessage (gInfo.hWnd, WM_TOGGLEFULLSCREEN, 0, 0);

if (gInfo.keys['L'] && !lp)

{

lp = true;    light = !light;

if (!light)

glDisable(GL_LIGHTING);

else

glEnable(GL_LIGHTING);

return;

}

if (!gInfo.keys['L'])

lp = false;

if (gInfo.keys['F'] && !fp)

{

fp = true;    filter = (filter + 1) % 3;

gInfo.title =

filter == 0 ? "Nearest Filtered Texture" :

filter == 1 ? "Linear Filtered Texture" :

"MipMapped Filtered Texture";

SetWindowText (gInfo.hWnd, gInfo.title);

return;

}

if (!gInfo.keys['F'])

fp = false;

if (gInfo.keys['B'] && !bp) // Blending Code Starts Here

{

bp = true;    blend = !blend;

if (blend)

{

glEnable (GL_BLEND);    // Turn Blending On

glDisable (GL_DEPTH_TEST);// Turn Depth Testing Off

}

else

{

glDisable (GL_BLEND);   // Turn Blending Off

glEnable (GL_DEPTH_TEST);// Turn Depth Testing On

}

}

if (!gInfo.keys['B'])

bp = false;

if (gInfo.keys['A'] && !ap)

{

ap = true;    amb = !amb;

if (amb)

{

ambient[0] = 1;  ambient[1] = 1;  ambient[2] = 1;

}

else

{

ambient[0] = 0.2f; ambient[1] = 0.2f; ambient[2] = 0.2f;

}

glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambient);

}

if (!gInfo.keys['A'])

ap = false;

if (gInfo.keys[VK_PRIOR])

z -= 0.02f;

if (gInfo.keys[VK_NEXT])

z += 0.02f;

if (gInfo.keys[VK_UP])

xspeed -= 0.01f;

if (gInfo.keys[VK_DOWN])

xspeed += 0.01f;

if (gInfo.keys[VK_RIGHT])

yspeed += 0.01f;

if (gInfo.keys[VK_LEFT])

yspeed -= 0.01f;

}

Запустите приложение и проверьте управление прозрачностью, светом и методом наложения текстуры. Обратите внимание на то, что цвета поверхностей куба смешиваются только друг с другом, и не смешиваются с цветом фона. Это происходит благодаря особой логике включения-выключения теста глубины. (см. код в Update, начиная с if (blend)). Временно выключите этот алгоритм управления тестом глубины и сравните результаты.

Другие варианты сочетания констант, задающих метод смешивания, вы исследуете самостоятельно. Их количество достаточно велико, если учесть, что эффект смешивания можно исследовать при разных значениях непрозрачности источника и мишени. Бездумный перебор вариантов вас разочарует, так как далеко не все комбинации имеют смысл. В качестве отправной точки для анализа сообщим, что самый простой вариант (отсутствие смешивания) дает сочетание glBlendFunc (GL_ONE, GL_ZERO);.

Перемещение в пространстве (с текстурированными стенами)

Задача перемещения в пространстве (моделирование полета в 3-хмерном пространстве или даже просто ходьбы по горизонтальной поверхности) представляет для начинающего определенную проблему, так как требуют использовать матричные преобразования координат. Различают два подхода в реализации перемещения:

q  Изменение параметров функции gluLookAt, которая позволяет управлять позицией глаза наблюдателя, а также центром сцены (позицией точки, куда взгляд направлен), и направлением вверх (то есть, направлением оси, перпендикулярной плоскости перемещения).

q  Изменение параметров функций glTranslate*, glRotate*, которые создают матрицы смещения и вращения. Они готовят, тем самым матрицу преобразования координат для всех объектов.