case VK_D0WN: ZNab- - StepMen; break; case VKJ-EFT: XNab- - StepMen; break: case VK_RIGHT: XNab+ - StepMen; break; case VK_PRI0R: Alpha+ - AngleMen; break; case VKJIEXT: Alpha- - AngleMen; break; }
SetViewO;
//После изменения положения наблюдателя вызывается функция перевода
//в систему наблюдателя.
}
Деление на три матрицы является условным. Можно было сформировать изображение одной матрицей, занести ее в матрицу мира, а матрицы проецирования и видовую матрицу оставить единичными.
Отображение средствами OpenGL
При использовании библиотеки OpenGL необходимо сначала отобразить мир симметрично плоскости XY, после чего выполнить описанные ранее преобразования.
Геометрические преобразования
Кроме того, после проецирования при помощи сдвига и масштабирования выполняется перевод сцены в границы (-1< z <+ 1), а не (0, 1). Пример отображения сцены дан в проекте OpenGL_Proj. В проекте отображается макет застройки городского квартала, который можно рассматривать с разных сторон.
Структура данных для описания вершин многогранников описана в файле GLDat.h. Код этой структуры приведен в листинге 24.6.
Листинг 24.6
typedef struct JJSEVERTEXl {
GLdouble x; GLdouble y; GLdouble z; GLdouble Nx; GLdouble Ny; GLdouble Nz; } USEVERTEX1;
Структура содержит координаты и нормаль к вершине. Для задания точек привязки и цвета объектов сцены в этом же файле описана структура ekzmpl, определение которой приведено в листинге 24.7.
Листинг 24.7
typedef struct _ekzmpl {
GLfloat Pos[4]; int color: } ekzmpl;
Файл InitGLcpp содержит функции, которые выполняются однократно при инициализации системы. Исходный код этого модуля приведен в листинге 24.8.
Листинг 24.8
#include <windows.h> #include <gl/gl.h> #include <gl/glu.h> #include <gl/glaux.h> #include "Main.h" extern HGLRC hGLRC; extern HDC hDC;
//Координаты и направление источника света
float pos[4] - {-1.0.0.-1.0}: W-0: //Источник бесконечно далеко
float dir[3] - {1.1.1}:
//Функция создания и включения источника света
void InitLight(void)