Перспективная проекция
void _stdcall OnDraw() { glClear(GL_COLOR_BOFFER_BIT I GL_DEPTH_BUFFER_BIT); //== Будем пользоваться услугами матрицы моделирования glMatrixMode <GL_MODELVIEW); glLoadldentity (); //=== Задаем смещение координат точек будущих примитивов glTranslated(gdTransX, gdTransY, gdTransZ); //=== Задаем вращение координат точек будущих примитивов glRotated(gdAngleY, 0.,1.,0.); glRotated(gdAngleX, 1.,0.,0.); //====== Координаты точек куба (центр его в нуле) static float v[8][3] = { -1, 1.,-1., //4 точки задней грани задаются 1., 1., -1., //в порядке против часовой стрелки 1-, -1-, -1., -1, -1., -1., -1, 1,, 1., //4 фронтальные точки -1-, -1., 1., 1, -1., 1., 1, 1., 1. }; //====== 6 нормалей для 6-ти граней куба static double norm[6][3] = { 0., 0., -1., // Rear 0., 0., 1., // Front -1., 0., 0., // Left 1., 0., 0., // Right 0., 1., 0., // Top 0., -1., 0. // Bottom }; //====== Индексы вершин static GLuint id[6][4] = { 0.1.2.3,// Rear (обход CCW – counterclockwise) 4.5.6.7, // Front 0.3.5.4, // Left 7.6.2.1, // Right 0.4.7.1, // Top 5.3.2, 6, // Bottom }; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glColorSd (1., 0.4, 1.); glBegin(GL_QUADS); //====== Долго готовились – быстро рисуем for (int i = 0; i < 6; i++) { glNormal3dv(norm[i]); for (int j = 0; j < 4; j++) glVertex3fv(v[id[i] [j]]); } glEnd(); glFlush (); }
Запустите и отладьте приложение. Вы должны увидеть совсем плоский квадрат, несмотря на обещанную трехмерность объекта. Пока ничего вразумительного, никакого трехмерного эффекта. Закомментируйте или удалите (или измените на GL_SMOOTH) настройку glShadeModel (GL_FLAT), так как теперь мы хотим интерполировать цвета при изображении полигонов. Это работает при задании разных цветов вершинам. Попробуйте задать всем вершинам разные цвета.
Попробуйте покрутить изображение, изменяя значения переменных gdAngleX, gdAngleY. Например, вместо нулевых значений, присваиваемых глобальным переменным по умолчанию, задайте:
double gdAngleX=20, gdAngleY=20;
Посмотрите в справке смысл всех параметров функции glRotated и опробуйте одновременное вращение вокруг двух осей, задав большее число единиц в качестве параметров. Позже мы автоматизируем процесс сдвигов и вращений, а сейчас, пока мы не умеем реагировать на сообщения мыши, просто измените значение какого-либо угла поворота и запустите музыку. Объясните результаты. Попробуйте отодвинуть изображение, изменив регулировку gdTransZ. Объясните знак смещения.