gluLookAt() лучшее использование, на матрице GL_PROJECTION или на матрице GL_MODELVIEW
В документации OpenGL говорится, что вызовы gluLookAt() должны выполняться в матрице GL_MODELVIEW:
http://www.opengl.org/resources/faq/technical/viewing.htm
На самом деле документы ссылаются на статью, в которой говорится, что использование gluLookAt() в матрице GL_PROJECTION крайне плохо:
Помогите искоренить злоупотребление GL_PROJECTION
С другой стороны, существует множество учебных пособий и примеров, в которых функция gluLookAt() фактически вызывается в матрице GL_PROJECTION. И в то же время, хотя в упомянутой выше статье говорится, что НЕ использовать ее в матрице GL_PROJECTION, в ней говорится, что в большинстве таких случаев видимых проблем при этом нет.
Мои вопросы: как лучше использовать gluLookAt() в реальных проектах? Неужели так много нет нет, чтобы использовать его в матрице GL_PROJECTION?
3 ответа
Функция gluLookAt() предоставляет вам матрицу преобразования, которая преобразует вращение объекта в вашей сцене. Так что это явно модельное преобразование, и оно должно войти в матрицу GL_MODELVIEW.
Что касается того, почему, это становится понятнее, когда вы делаете это самостоятельно в вершинном шейдере:
Хотя положение вершин действительно просто v.pos * modelview * projection
матрица вида модели необходима без проекционной составляющей для других расчетов (например, освещения и тумана). Вот почему конвейер с фиксированной функцией разделяет эти две матрицы.
Таким образом, вы должны придерживаться парадигм, указанных в API, и особенно никогда не доверяйте множеству плохих opengl "учебников".
Я не уверен, что понимаю вопрос. Вы спрашиваете, почему страница говорит вам не делать то, что работает только "большую часть времени"?
Это действительно не так сложно понять. "Большинство таких обычаев" по определению означает, что есть некоторые такие обычаи , которые имеют проблемы.
Таким образом, вы можете сделать то, что будет работать иногда, а потом сломаться, или вы можете сделать то, что всегда будет работать.
Это не сложный выбор. Более того, правильная работа означает буквальное перемещение одной строки кода на пару строк.
Мои вопросы: как лучше использовать gluLookAt() в реальных проектах? Неужели так много нет нет, чтобы использовать его в матрице GL_PROJECTION?
Всегда используйте матрицу вида модели для позиционирования точки обзора. Это даже в названии модели матрицы (т.е. размещение геометрии) и представлении (размещение точки обзора).
Матрица проекции является своего рода объективом OpenGL "камера". Вы не двигаете объектив вашей камеры, удерживая корпус камеры на месте, чтобы установить вид, не так ли? Перемещение объектива имеет свои приложения, такие как реализация эффектов наклона / сдвига.