Моя камера вращается вокруг точки, когда я пытаюсь изменить ориентацию.Если я поверну камеру, скажем, на 30 градусов по оси Y, а камера не будет смотреть на 30 градусов вправо, камера будет вращаться вокруг точки, на которую она смотрела.
o is the camera, A and B are 3D models. The lines show line-of-sight.
This is what I expect:
A B
| > /
| /
| /
|/
o
This is what actually happens:
A B
|\
| \
| \
| > \
o
Теперь из моегопонимая, что для того, чтобы переместить камеру, я должен перевернуть мир на обратную величину.Поэтому, если я хочу переместиться на +1 по оси Z, я перевожу мир -1 на ось Z.Поскольку я использую кватернионы для представления ориентации, я использую инверсию кватерниона камеры (поскольку ориентации всегда являются единичными кватернионами, я оптимизирую с помощью сопряжения вместо вычисления обратного), чтобы вращать мир на нужную величину.* Вот как я конвертирую кватернион в матрицу, где q - инвертированный кватернион:
[1 - 2 * (q.y * q.y + q.z * q.z) 2 * (q.x * q.y - q.w * q.z) 2 * (q.x * q.z + q.w * q.y) 0]
|2 * (q.x * q.y + q.w * q.z) 1 - 2 * (q.x * q.x + q.z * q.z) 2 * (q.y * q.z - q.w * q.x) 0|
|2 * (q.x * q.z - q.w * q.y) 2 * (q.y * q.z + q.w * q.z) 1 - 2 * (q.x * q.x + q.y * q.y) 0|
[0 0 0 1]
После этого я устанавливаю компонент перевода матрицы:
[... ... ... -x]
|... ... ... -y|
|... ... ... -z|
[0 0 0 1]
Инаконец, я умножаю это на стек матрицы представления модели, а затем отрисовываю все мои объекты.Я уверен, что эта математика верна, но она не дает ожидаемых результатов.Очевидно, что прямой и правый векторы являются проблемой, поэтому мой единственный вопрос - почему они ошибаются и как их следует устанавливать, если я хочу получить ожидаемые результаты.Спасибо.
РЕДАКТИРОВАТЬ: Я нашел решение из класс камеры этого парня кватерниона .Сначала я строю матрицу вращения, как раньше, но затем я беру векторы столбцов матрицы из первого, второго и третьего столбцов (xa, ya и za соответственно).Затем я устанавливаю трансляционную составляющую матрицы следующим образом:
[... ... ... -xa.dotProduct(cameraPos)]
|... ... ... -ya.dotProduct(cameraPos)|
|... ... ... -za.dotProduct(cameraPos)|
[... ... ... ... ]
Затем полученная матрица может быть умножена на стек матриц вида модели, и она отлично работает.