相机翻转问题

时间:2010-01-13 14:38:19

标签: c# xna

我正在使用XNA3.1引擎在C#中编写游戏。然而,我的相机问题很小,基本上我的相机在其转动时旋转超过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单位直接在摄像机前面,相对于摄像机的旋转,“up”变量通过以下功能获得:

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 个答案:

答案 0 :(得分:1)

这可能比较慢,但我知道的唯一方法就是使用3D的旋转矩阵。 Wikipedia Link

alt text

其中

alt text

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

...现在,我相信这会给你视图矩阵的旋转部分。但是,我不是百分之百。我仍在调查这个。

答案 1 :(得分:1)

我在使用gluLookAt的OpenGL中遇到了同样的问题。我用自己的相机类解决了这个问题:

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

希望它有所帮助。

答案 2 :(得分:0)

meh希望在那里看到棕褐色。

你可以链接到你的方程式吗? (我正在工作而且真的不喜欢;我想坐下来自己开始吧)

你是如何设置相机旋转的?你确定那里什么也没发生?

答案 3 :(得分:0)

我对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);

答案 4 :(得分:0)

由于我对这里的答案不满意,我不得不自己解决这个问题。

我发现它实际上非常简单。就这样做:

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

“向上”是你想要的方向。