GluLookAt(), в GL_PROJECTION-матрице или в матрице GL_MODELVIEW

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

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

Фактически ссылка docs на статью, в которой говорится, что использование gluLookAt() в матрице GL_PROJECTION крайне плохое:

Помогите искоренить злоупотребление GL_PROJECTION

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

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

3 ответа

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

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

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

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


Я не уверен, что понимаю этот вопрос. Вы спрашиваете, почему страница говорит вам не делать что-то, что работает только "большинство" времени?

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

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

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


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

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

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

licensed under cc by-sa 3.0 with attribution.