Загрузка ModelViewMatrix с использованием glulookat
Я определил матрицу, которая содержит положение и ориентацию камеры, аналогично матрице GL_MODELVIEW:
(m3 = 0; m7 = 0; m11 = 0; m15 = 1)
Я пытаюсь загрузить эти данные в ModelViewMatrix. Я думаю об этом в двух возможных вариантах:
Используя функцию glLoadTransposeMatrixf():
Если я использую это решение, я получаю правильную позицию и ориентацию. Проблема в том, что мне нужно использовать второе решение, потому что я изменяю векторы Left/Up/Forward/Translation в моем коде, чтобы изменить представление.
Используя функцию gluLookAt():
gluLookAt(Translation->X, Translation->Y, Translation->Z, Translation->X-Forward->X, Translation->Y-Forward->Y, Translation->Z-Forward->Z, Up->X, Up->Y, Up->Z);
Моя проблема в том, что матрица GL_MODELVIEW, которую я получаю с этим, отличается от другого случая. В частности, вектор трансляции неверен, но векторы Left / Up / Forward верны.
Я действительно смущен этим. Может кто-нибудь объяснить, если есть различия между этими двумя вариантами и что я делаю неправильно, пожалуйста?
РЕДАКТИРОВАТЬ
Полученные результаты:
Я использую матрицу M, как это:
M = (Lx Upx Fwx tx)
(Ly Upy Fwy ty)
(LZ Upz Fwz tz)
(0 0 0 1 )
С первым методом я получаю правильную матрицу GL_MODELVIEW:
N = (Lx Upx Fwx tx)
(Ly Upy Fwy ty)
(Lz Upz Fwz tz)
(0 0 0 1 )
но со вторым методом я получаю следующую матрицу GL_MODELVIEW:
N = (Lx Upx Fwx tx')
(Ly Upy Fwy ty')
(Lz Upz Fwz tz')
(0 0 0 1 )
Обратите внимание, что tx'!= Tx, ty'!= Ty, tz'!= Tz. Это очень сбивает с толку...
1 ответ
Есть различия между двумя вариантами. Давайте назовем вашу матрицу М. Что на самом деле делает М? Он не трансформируется из мирового пространства в пространство глаза, но в точности наоборот. Думаю об этом. Вы предполагаете, что ваша камера находится в точке "перевода". Давайте предположим, что остальная часть M является тождественной, поэтому точку точно в месте расположения камеры следует перевести в начало координат. Но это в конечном итоге в translation.xyz+translation.xyz, так что на самом деле ваша камера находится в точке -translation.xyz.
Если ваш первый метод действительно дает "правильные" результаты, вы, похоже, ошибаетесь.