Загрузка ModelViewMatrix с использованием glulookat

Я определил матрицу, которая содержит положение и ориентацию камеры, аналогично матрице GL_MODELVIEW:

Матрица 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.

Если ваш первый метод действительно дает "правильные" результаты, вы, похоже, ошибаетесь.

Другие вопросы по тегам