В этом шаге рассмотрим перенос вещества в пространстве. Создадим проект и приготовимся вращать руками и головой. Добавим в файл stdafx.h следующие строки:
#include <math.h> #define Pi 3.14159
Как вы понимаете, это для синусов и косинусов. Все остальные изменения проекта будут касаться только функции OnDraw(...). Её код теперь таков:
void CExampleView::OnDraw(CDC* pDC) { CRect clientRect; CExampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here GetClientRect(&clientRect); glViewport(0, 0, clientRect.right, clientRect.bottom); glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета glColor3f (1.0, 0.0, 0.5); // текущий цвет примитивов for(int i=0; i<6; i++) { glTranslatef (-0.7f * (float)cos (Pi * i / 3), 0.7f * (float)sin (Pi * i / 3), 0.0); glRotatef (-60.0f * i, 0, 0, 1); glBegin (GL_POLYGON); glVertex2f (-0.25f, -0.25f); glVertex2f (-0.25f, 0.25f); glVertex2f (0.25f, 0.25f); glVertex2f (0.25f, -0.25f); glEnd(); glRotatef (60.0f * i, 0, 0, 1); glTranslatef (0.7f * (float)cos (Pi * i / 3), -0.7f * (float)sin (Pi * i / 3), 0.0); } SwapBuffers(pDC->m_hDC); }
Здесь мы рисуем шесть квадратиков. Но смысл не в том, что мы рисуем, а как. В примере мы шесть раз как бы переносим систему координат. Если быть более точным, то мы 6 раз изменяем матрицу модели, но о матрицах модели и других типах матриц чуть позже. Пока главное понять последовательность действий. Логика такова:
Не знаю кому как, но мне очень помогает рисование преобразований объекта на бумаге. Попробуйте, например, поменять местами glTranslate и glRotate и потом разобраться почему так получилось.
Как я уже говорил когда-то, операции glTranslate и glRotate одни из самых важных в библиотеке OpenGL, поэтому имеет смысл разобраться что тут к чему на примере 2D, чтобы в 3D к этому не возвращаться.