2012-03-02 2 views
8

документация OpenGL сказать, что gluLookAt() вызовы должны быть сделаны на матрице GL_MODELVIEW:gluLookAt() лучшее использование, на GL_PROJECTION матрицы или матрицы GL_MODELVIEW

http://www.opengl.org/resources/faq/technical/viewing.htm

На самом деле документы ссылка на статьи, которые говорят, что использование gluLookAt() на матрице GL_PROJECTION экстремально плохо:

Help stamp out GL_PROJECTION abuse

с другой стороны, есть много руководств и примеров, где gluLookAt() является я n, вызванный матрицей GL_PROJECTION. И в то же время, хотя упомянутая выше статья говорит, что НЕ использовать ее в матрице GL_PROJECTION, это говорит о том, что в большинстве таких обычаев нет видимой проблемы.

Мои вопросы: тогда как наилучшим образом использовать gluLookAt() в реальных проектах? Неужели это не так, чтобы использовать его в матрице GL_PROJECTION?

+4

«С другой стороны, есть много учебников и примеров, где gluLookAt() фактически вызывается в матрице GL_PROJECTION». В учебниках GL есть много примеров, которые делают глупые вещи. Это не оправдание для их выполнения. В самом деле, это еще одна причина, чтобы избежать уроков GL, которые не используют шейдеры; по крайней мере, учебники шейдеров написаны людьми, которые знают вещи. –

ответ

8

Функция gluLookAt() дает матрицу преобразования, которая преобразует поворот объекта в вашей сцене. Таким образом, это явно трансформация модели, и должен перейти в матрицу GL_MODELVIEW.

Что касается, почему это становится яснее, когда вы делаете это самим в вершинном шейдере:

Хотя положение вершин действительно просто v.pos * modelview * projection, то видовая матрица необходима без компонента проекции для других расчетов (например, освещение и туман). Вот почему контур фиксированной функции разделяет эти две матрицы.

Таким образом, вы должны придерживаться парадигм, указанных в API, и, в частности, никогда не доверять никому из мириад неправильных «урок».

+0

Порядок операций при преобразовании вершины обычно является иным способом: 'projection * modelview * v.pos', если вы это делаете, нужно транспонировать все матрицы и векторы. – datenwolf

2

Я не уверен, что понял вопрос. Вы спрашиваете, почему страница говорит вам не делать то, что работает только «большинство» времени?

Это действительно не так сложно понять. «Большинство таких обычаев», по определению, означает, что есть таких обычаев do проблемы с выставкой.

Таким образом, вы можете либо делать то, что будет работать иногда, а затем ломать другие времена, или вы можете делать то, что будет всегда работать.

Это не сложный выбор. Даже moreso, так как делает это правильно, означает буквально перемещение одной строки кода на пару строк.

1

Мои вопросы: тогда как наилучшим образом использовать gluLookAt() в реальных проектах? Неужели это не так, чтобы использовать его в матрице GL_PROJECTION?

Всегда используйте матрицу вида модели, чтобы расположить точку обзора. Это даже в матрице «имя модель (т. Е. Размещение геометрии) и вид (размещение точки обзора).

Проекционная матрица - это вид объектива камеры «OpenGL». Вы не двигаете объектив камеры, удерживая корпус камеры на месте, чтобы установить вид, не так ли? Перемещение объектива имеет свои приложения, такие как реализация эффектов наклона/сдвига.