我正在使用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
}
答案 0 :(得分:1)
这可能比较慢,但我知道的唯一方法就是使用3D的旋转矩阵。 Wikipedia Link
其中
和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)
你可以链接到你的方程式吗? (我正在工作而且真的不喜欢;我想坐下来自己开始吧)
你是如何设置相机旋转的?你确定那里什么也没发生?
答案 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);
“向上”是你想要的方向。