В этом примере мы посмотрим на то, как установить параметры вида в 3-х мерной системе координат.
Чтобы не быть голословным я предлагаю скомпилить и запустить пример. Разок, другой нажать левую кнопку мыши, а потом раз 9-10 правую кнопку. Что получится вы увидите сами. А вот почему ... сейчас посмотрим. И так функция 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); glPushMatrix(); glFrustum (-1, 1, -1, 1, 3, 10); glTranslatef(0.0, 0.0, -5.0); glClearColor (0.5, 0.5, 0.75, 1.0); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 0.5); glBegin (GL_TRIANGLES); glVertex3f (-1, -1, 0); glVertex3f (-1, 1, 0); glVertex3f (1, 0, m_Height); glEnd(); glPopMatrix(); SwapBuffers(pDC->m_hDC); }
Переменная m_Height задает глубину одной из вершин треугольника, она как обычно объявлена как член класса C...View и изменяется в двух обработчиках OnLButtonDown(...) и OnRButtonDown(...). Но главное в функции OnDraw(...).
Основная последовательность команд заключена между командами glPushMatrix, glPopMatrix. Если не делать этого, то изменения пространства в предыдущем вызове OnDraw будут влиять на преобразования в следующем вызове.
В примере появилась новая команда glFurstum. Эта команда задает как бы параллелепипед в пространстве, в котором будет отображаться наш треугольник. Если треугольник выходит за пределы этого пространства, то он автоматически отсекается (что и происходит если подольше понажимать на правую кнопку).
Как вы помните из курса начертательной геометрии, то существует много видов проекцирования 3D координат в 2D.
В "чистом" варианте OpenGL поддерживает 2 вида проекции: Ортогональную и Перспективную. Разумеется никто не запрещает вам пользоваться другими видами проекций, но для этого вам придется вручную загрузить матрицу проекции. Позже мы посмотрим как это можно сделать.
Параметры glFurstum вполне очевидны: левая, правая, нижняя, верхняя, ближняя, дальняя плоскости отсечения. Последние 2 параметра задают бижнее и дальнее расстояние от глаз наблюдателя.
Если вы посмотрите MSDN по команде glFurstum, то обнаружите, что второй с конца параметр, задающий заднюю плоскость отсечения должен быть не нулевым и положительным. Это важно и об этом не стоит забывать. Связано это с некоторыми формулами OpenGL, в которых просходит умножение или деление far на near (см. MSDN)
И последнее, командой glTranslate мы отодвигаем систему координат на 5 единиц в глубь экрана. Попробуйте сдвинуть на значение меньше 3-х, больше 10, на 3 и на 10.