Шаг 32 - Ортогональная и перспективная проекции

В этом шаге мы возьмем предыдущий пример и сделаем пару изменений.

Во-первых сделаем еще один пункт в меню 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 мы устанавливаем либо перспективную либо ортогональную проекцию модели. Попереключайте флаг, посмотрите отличия.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 29.05.2000