Полагаю, вы хотели, чтобы камера представляла собой матрицу однородного преобразования 4x4
Для правильной реализации взгляда вам нужно:
положение камеры pos
как для игрока, так что ваша позиция фиксирована и известна ...
целевая позиция target
направление просмотра dir
может быть просто вычислено:
dir = target-pos
dir /= |dir|
некоторое направление выравнивания (например, UP)
это зависит от вашей игры ... для игр на местности можно использовать вектор UP (например, (0,1,0)
) или нормаль к поверхности и т. Д. ... для 6 приложений на основе DOF вы можете использовать локальный вектор какого-то игрока ... Будьте внимательны, этот вектор выравнивания не должен быть параллельным dir
, иначе последнее перекрестное произведение не будет работать должным образом. В таком случае вы можете выбрать другой вектор выравнивания, например, RIGHT, NORT и т. Д.
Чтобы построить матрицу трехмерного преобразования, вам нужны позиции O
и 3 базисных вектора (X,Y,Z
), которые являются единичными и перпендикулярными друг другу. Позиция - pos
, а один из базовых векторов - dir
(который зависит от того, какая ось у вас выглядит, например, перспектива, которую OpenGL использует обычно -Z
). Итак, вам нужно вычислить два других базисных вектора. Давайте рассмотрим, что мы будем смотреть в направлении -Z
так:
-Z = dir
Z = -dir
чтобы получить 2 других базисных вектора, просто используйте кросс-произведение ...
X = cross(UP,Z)
X /= |X|
Y = cross(Z,X)
Y /= |Y|
и источником является просто положение камеры:
O = pos
Порядок операндов внутри cross
будет определять знак результата, поэтому, если вы перевернули какую-либо ось, просто поменяйте местами операнды ...
Теперь просто введите O,X,Y,Z
в матрицу блока 4x4. Как зависит от обозначения вашего двигателя. Поскольку камера обычно инвертируется (также зависит от обозначений), инвертируйте ее, и вы получите свою результирующую матрицу. Здесь макет OpenGL:
Если вам нужны углы Эйлера, извлеките их из матрицы с помощью гониометрии ...