Это маленький шаг, в котором я просто решил показать как можно обойтись без операций начального сдвига и поворотов.
В дополнительной библиотеке 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