В этом шаге мы возьмем предыдущий пример и сделаем пару изменений.
Во-первых сделаем еще один пункт в меню View, назовем его скажем Projection. Добавим еще переменную, например BOOL m_bProj.
Сделаем обработчик нового пункта меню:
void CExampleView::OnViewProjection() { // TODO: Add your command handler code here if(m_bProj) m_bProj = FALSE; else m_bProj = TRUE; InvalidateRect(NULL, FALSE); }
И допишем несколько строк в 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); glLoadIdentity(); if(m_bProj) glFrustum (-1, 1, -1, 1, 3, 10); else glOrtho(-2, 2, -2, 2, 0, 15); glTranslatef(0.0, 0.0, -8.0); glRotatef(30.0, 1.0, 0.0, 0.0); glRotatef(70.0, 0.0, 1.0, 0.0); switch(m_iMode) { case 0: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); break; case 1: glEnable(GL_POINT_SMOOTH); glPointSize(10); glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); break; case 2: glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); break; } DrawCube(); SwapBuffers(pDC->m_hDC); }
В зависимости от состояния флага m_bProj мы устанавливаем либо перспективную либо ортогональную проекцию модели. Попереключайте флаг, посмотрите отличия.