Шаг 34 - gluLookAt

Это маленький шаг, в котором я просто решил показать как можно обойтись без операций начального сдвига и поворотов.

В дополнительной библиотеке OpenGL glu32.lib существует функция gluLookAt, которая принимает 9! аргументов.

Первые 3 - координаты позиции глаза налюдателя, вторые 3 - координаты точки, распологающейся в центре экрана, третьи 3 - направление вектора, задающего поворот сцены.

Для демонстрации этой функции я, как обычно, сделал простой пример. Опять сделал пункт меню, который будет вызвать диалог для установки всех 9-ти параметров этой функции. Сделал сам диалог и установил соответствующие переменные для полей ввода. В классе C...View сделал массив GLfloat m_Par[9]. Сюда в обработчике пункта меню заношу преобразованные в числовой вид значения полей ввода из диалога.

В функции 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();
	gluPerspective(70.0, clientRect.right / clientRect.bottom, 2.0, 10.0);
	gluLookAt (m_Par[0], m_Par[1], m_Par[2], m_Par[3], 
		m_Par[4], m_Par[5], m_Par[6], m_Par[7], m_Par[8]);

	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	DrawCube();

	SwapBuffers(pDC->m_hDC);
}

Обработчик меню выглядит так:

void CExampleView::OnViewParam() 
{
	// TODO: Add your command handler code here
	CParDlg dlg;
	
	if(dlg.DoModal()==IDOK)
	{
		m_Par[0] = (float)atof(dlg.m_Eyes_X);
		m_Par[1] = (float)atof(dlg.m_Eyes_Y);
		m_Par[2] = (float)atof(dlg.m_Eyes_Z);
		m_Par[3] = (float)atof(dlg.m_Point_X);
		m_Par[4] = (float)atof(dlg.m_Point_Y);
		m_Par[5] = (float)atof(dlg.m_Point_Z);
		m_Par[6] = (float)atof(dlg.m_Vector_X);
		m_Par[7] = (float)atof(dlg.m_Vector_Y);
		m_Par[8] = (float)atof(dlg.m_Vector_Z);
	}
	InvalidateRect(NULL, FALSE);
}

На этом все сложности закончились. Поэкспериментируйте с цифрами, можно добится интересных результатов ;) Не забудьте включить заголовочный файл диалога в файл ...View.cpp


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