3D-камера смотрит в произвольную точку, но никогда не поворачивается, чтобы сделать это - PullRequest
1 голос
/ 29 декабря 2010

(в C # / XNA 4.0)

У меня есть Vector3 cameraPosition, Vector3 targetPosition

Я хочу, чтобы моя камера смотрела на цель, всегда «лицом» к ней, но никогда не катится

Так что крен всегда нейтрален, чтобы увидеть цель, камера всегда либо регулирует высоту, либо рыскание

Я пробовал бесчисленное множество комбинаций методов и информации, которую я нашел здесь и нав Интернете, но я не нашел ничего, что работает должным образом.Я думаю, что моей проблемой может быть мой вектор «вверх» (который я пробовал. Up, 1,0,0, 0,1,0, 0,0,1)

Когда я перемещаю свою камеру, яdo:

  CameraPosition += moveSpeed * vectorToAdd;
  UpdateViewMatrix();

UpdateViewMatrix () ... ну, я перепробовал все, что видел.Самое простое ...

   View = Matrix.CreateLookAt(CameraPosition, targetPosition, upVector);

Где upVector был Vector3.Up, 1, 0, 0;0, 1, 0;0, 0, 1 или другие более «правильные» попытки получить мой фактический вектор повышения.Это звучит так, как будто это моя проблема ..

Это должно быть очень просто, помогите!

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Заканчивается. Я где-то путался с тем, как должны выглядеть вещи, и что я на самом деле рассматривал "вверх" в своем мировом пространстве. Мне пришлось использовать вектор (0, 0, 1), и все работало замечательно

0 голосов
/ 29 декабря 2010

Предполагая, что мировое пространство Y-up, отсутствие крена означает, что боковой вектор камеры имеет Y = 0. Вы должны получить вектор направления обзора (normalize(targetPos - cameraPos)) и получить такой боковой вектор, чтобы он был ортогональным для просмотра Y = 0, другими словами view.x * side.x + view.z * side.z = 0, view.y = 0. Это простой 2D перпендикуляр, side = normalize(vector3(-view.z, 0, view.x)).

После того, как у вас есть боковой вектор, вы можете получить up = cross(view, side) и построить матрицу вида.

В зависимости от управляемости вашей системы координат вам может потребоваться отменить боковой вектор.

Обратите внимание, что в view.y = +-1 есть особенность (сторона - это вектор нулевой длины); это связано с тем, что для этого угла наклона крен не определен - любое значение крена дает такое же преобразование.

...