Да и Нет : Да, вы можете инвертировать преобразование вида модели, и нет, вы не получите точно все три вектора одинаково.
Преобразование вида модели lookAt
очень похоже на операцию connectTo
, используемую в моделях CSG. Он монтирует вашу сцену перед вашей камерой. Это делается с помощью перевода и трех осевых вращений. Точка eye
переводится в (0,0,0)
, и все дальнейшее вращение выполняется вокруг нее. Вы можете легко получить точку зрения, преобразовав (0,0,0)
с обратной матрицей.
Но центральная точка используется только для регулировки оси зрения вдоль оси -Z
. В openGL глаз обращен к -Z
. Расстояние между центром и глазом потеряно. Таким образом, вы можете легко получить центральную точку вдоль вашей оси зрения, если вы сами определите расстояние. Допустим, мы хотим расстояние d
. Тогда нам просто нужно преобразовать (0,0,-d)
с обратной матрицей, и мы получим правильную центральную точку, но не совсем то же самое. Центральная точка определяет только два угла поворота: панорамирование и наклон камеры.
Еще хуже восстановление вектора вверх. Он используется только для угла наклона камеры и, следовательно, только для одного скалярного значения. Таким образом, для обратного преобразования вы можете не только выбрать любое положительное значение вдоль оси Y, вы можете выбрать любую точку в плоскости YZ с положительным значением Y. Чтобы получить вектор роста, совершенно нормальный к оси просмотра и размера 1, мы просто преобразуем (0,1,0)
с обратной матрицей. Не забудьте преобразовать как вектор на этот раз (не как точку).
Теперь у нас есть глаз, центр и верх, реконструированные таким образом, чтобы в следующий раз получить точно такой же результат, как и lookAt
. Но поскольку эта матрица содержит только 6 значений информации (перемещение, панорамирование, наклон, вращение), нам пришлось выбрать 3 потерянных значения (расстояние от центра до глаза, размер и угол наклона вектора в плоскости YZ камеры).
Матрица вида модели может, конечно, выполнять другие преобразования (любые аффинные), но функция lookAt использует эту матрицу только для перемещения и вращения. Он корректирует сцену перед камерой, не искажая ее.