Есть ли обратная функция lookat для glMatrix? - PullRequest
2 голосов
/ 27 января 2012

Я использую glMatrix для кодирования Webgl и хочу получить положение глаза, фокус и направление вверх из существующей матрицы проекции и вида (что-то вроде функции обратного просмотра). Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Я не реализовал, нет. Я даже не уверен, что вы могли бы разложить его на исходные векторы. Точка lookAt может находиться где-нибудь вдоль луча от начала координат, и как бы вы определили, какой был соответствующий вектор вверх? Я думаю, что это односторонний алгоритм (слишком ленив, чтобы доказать это!)

Кроме того, я спрашиваю вас, хотите ли вы сделать это, даже если бы был способ для этого. Я готов поспорить, что почти всегда выгоднее отслеживать используемые вами значения и манипулировать ими, чем пытаться перетаскивать их назад и вперед от матрицы к векторам и обратно.

2 голосов
/ 02 апреля 2013

Да и Нет : Да, вы можете инвертировать преобразование вида модели, и нет, вы не получите точно все три вектора одинаково.

Преобразование вида модели 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 использует эту матрицу только для перемещения и вращения. Он корректирует сцену перед камерой, не искажая ее.

...