Проблема с переворотом камеры - PullRequest
5 голосов
/ 13 января 2010

Я программирую игру на C # с использованием движка XNA3.1. Однако у меня небольшая проблема с камерой, в основном, моя камера имеет тенденцию «переворачиваться», когда она поворачивается более чем на 180 градусов при повороте (когда камера достигает 180 градусов, кажется, что она переворачивается на 0 градусов). Код для получения матрицы вида выглядит следующим образом:

Globals.g_GameProcessingInfo.camera.viewMat = Matrix.CreateLookAt(Globals.g_GameProcessingInfo.camera.target.pos, Globals.g_GameProcessingInfo.camera.LookAt, up);                //Calculate the view matrix

Переменная Globals.g_GameProcessingInfo.camera.LookAt определяет позицию 1 непосредственно перед камерой относительно поворота камеры, а переменная "вверх" получается с помощью следующей функции:

static Vector3 GetUp()      //Get the up Vector of the camera
{
    Vector3 up = Vector3.Zero;
    Quaternion quat = Quaternion.Identity;
    Quaternion.CreateFromYawPitchRoll(Globals.g_GameProcessingInfo.camera.target.rot.Y, Globals.g_GameProcessingInfo.camera.target.rot.X, Globals.g_GameProcessingInfo.camera.target.rot.Z, out quat);

    up.X = 2 * quat.X * quat.Y - 2 * quat.W * quat.Z;       //Set the up x-value based on the orientation of the camera
    up.Y = 1 - 2 * quat.X * quat.Z - 2 * quat.Z * quat.Z;   //Set the up y-value based on the orientation of the camera
    up.Z = 2 * quat.Z * quat.Y + 2 * quat.W * quat.X;       //Set the up z-value based on the orientation of the camera
    return up;      //Return the up Vector3
}

Ответы [ 5 ]

1 голос
/ 18 января 2010

У меня такие же проблемы в OpenGL с gluLookAt. Я исправил эту проблему с моим собственным классом камеры:

void Camera::ComputeVectors()
{
    Matrix4x4 rotX, rotZ;
    Quaternion q_x, q_y, q_z;
    Quaternion q_yx, q_yz;
    q_x.FromAngleAxis(radians.x, startAxisX);
    q_y.FromAngleAxis(radians.y, startAxisY);
    q_z.FromAngleAxis(radians.z, startAxisZ);
    q_yx = q_y * q_x;
    q_yx.ToMatrix(rotZ);
    q_yz = q_y * q_z;
    q_yz.ToMatrix(rotX);
    axisX = startAxisX;
    axisZ = startAxisZ; 
    axisX.Transform(rotX);
    axisZ.Transform(rotZ);
    axisY = axisX.Cross(axisZ);

    position = startPosition;
    position -= center;
    position.Transform(q_yx);
    position += center;
}

Это может быть слишком сложно, но работает. axisY - твой восходящий вектор. Полный список кодов находится по адресу: http://github.com/filipkunc/opengl-editor-cocoa/blob/master/PureCpp/MathCore/Camera.cpp

Надеюсь, это поможет.

1 голос
/ 15 января 2010

Это, вероятно, медленнее, но единственный способ, которым я знаю, это использовать матрицу вращения для 3D. Ссылка на Википедию

alt text

Где

alt text

и U = (Camera.position - Camera.lookat) .norm

... Теперь, я полагаю, это даст вам часть поворота матрицы вида. Однако я не на все 100%. Я все еще изучаю это все же.

0 голосов
/ 08 декабря 2011

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

То, что я обнаружил, это на самом деле довольно просто. Просто сделай это:

Matrix ypr = Matrix.CreateFromYawPitchRoll(yaw, pitch, roll);
Vector3 up = Vector3.Transform(Vector3.Up, ypr);

«вверх» - это направление, которое вы хотите.

0 голосов
/ 13 января 2010

Я немного не уверен насчет математики в вашем GetUp методе. Не могли бы вы рассказать о математике за этим?

В моей фотокамере я инициализирую свой вектор повышения, а затем поворачиваю этот вектор с помощью кватерниона. Это исключает возможность создания перекрестного произведения на параллельных векторах для вычисления вектора роста.

Какой-то полукод, чтобы уточнить, возможно:

var up = Vector3.Up;
var target = <some point in space>;
var rotation = <current rotation quaternion>;

var forward = target - position;
forward = Vector3.Transform(forward, rotation);

var updatedPosition = target - forward;
var updatedUp = Vector3.Transform(up, rotation);

var view = Matrix.CreateLookAt(updatedPosition, target, updatedUp);
0 голосов
/ 13 января 2010

Мех надеялся увидеть где-то там загар.

Можете ли вы указать, откуда вы получили свое уравнение, пожалуйста? (я нахожусь на работе и действительно не хочу садиться и выводить это)

как вы настраиваете вращение камеры? ты уверен, что там ничего не происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...