Понимание gluLookAt

Я рисую оси в начале координат и фиксирую их положение, я пытаюсь повернуть камеру с помощью glLookAt:

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
DrawAxes();     // Draws X-axis in red, Y in green, Z in blue
glRotated( m_dRotX, 1.0, 0.0, 0.0 );
glRotated( m_dRotY, 0.0, 1.0, 0.0 );
glRotated( m_dRotZ, 0.0, 0.0, 1.0 );
gluLookAt( m_dCameraPos_X, m_dCameraPos_Y, m_dCameraPos_Z, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
SwapBuffers( m_pDC->m_hDC );

Начиная с позиции ( 0, 0, 100 ), я вращаюсь вокруг оси Y и ожидаю, что красная полоса (ось X) станет короткой, а синяя полоса (ось Z) станет длиннее, но ничего не движется . Что мне не хватает?


person IssamTP    schedule 05.12.2014    source источник
comment
вы рисуете, прежде чем делать какое-либо вращение   -  person ratchet freak    schedule 05.12.2014


Ответы (1)


Ваша проблема вызвана порядком ваших операций в коде: вы сбрасываете стек матрицы, рисуете все, а затем устанавливаете параметры камеры. Но они сбрасываются glLoadIdentity перед следующим вызовом отрисовки.

Исправленная версия вашего кода будет выглядеть следующим образом

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_MODELVIEW );

//Reset stack
glLoadIdentity();

//Set viewmatrix from camera
glRotated( m_dRotX, 1.0, 0.0, 0.0 );
glRotated( m_dRotY, 0.0, 1.0, 0.0 );
glRotated( m_dRotZ, 0.0, 0.0, 1.0 );
gluLookAt( m_dCameraPos_X, m_dCameraPos_Y, m_dCameraPos_Z, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );

//Draw using the viewmatrix
DrawAxes();     // Draws X-axis in red, Y in green, Z in blue

SwapBuffers( m_pDC->m_hDC );
person BDL    schedule 05.12.2014
comment
Ну, я могу ошибаться, но... Разве вы не вращаете оси вот так? Как мне повернуть только камеру? - person IssamTP; 05.12.2014
comment
В принципе, это одно и то же. Поворот камеры вправо — это то же самое, что поворот объекта влево. Кроме того, в OpenGL нет такого понятия, как камера. Я объяснил в ответе здесь еще немного о системах координат OpenGL. - person BDL; 05.12.2014
comment
Ну, я говорю камера, чтобы сказать параметры глаза gluLookAt. Нет ли способа зафиксировать оси (и другие чертежи) и перемещать только глаза/gluLookAt? - person IssamTP; 05.12.2014
comment
Выхода нет. Как было сказано ранее, преобразование камеры должно применяться к вещам, которые вы рисуете. - person BDL; 05.12.2014
comment
ОООК. Спасибо за помощь. - person IssamTP; 05.12.2014
comment
Еще один связанный с этим вопрос: нормально ли, что ось перемещается за пределы поля зрения? - person IssamTP; 05.12.2014