Answers:
您可以将四元数分解为一组偏航角/俯仰角/滚动角,但这通常是过大的。
而不是像这样构成四元数:
cameraOrientation = cameraOrientation * framePitch * frameYaw;
尝试这个:
cameraOrientation = framePitch * cameraOrientation * frameYaw;
这样就永远不会产生倾斜/滚动,等效于分别存储偏航和俯仰
framePitch
和frameYaw
float
类型?另外,对于您的第一句话,我将不胜感激。
cameraOrientation
,framePitch
和frameYaw
都是四元数(每个四元数是4个浮点数或双精度数)。
这是我有一段时间的问题了,我找不到任何答案,所以我想将其发布在这里。
实际上很简单。您最有可能进行旋转的方式是这样的:
currentDirection * newRotation;
但是,这样做是行不通的。
newRotation * currentDirection;
您要做的是,以第一顺序进行向上和向下旋转,然后以第二顺序进行侧向旋转。
对我来说,就像这样:
if (keyboard.IsKeyDown(Keys.Up))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Down))
Direction = Direction * Quaternion.CreateFromAxisAngle(new Vector3(-1, 0, 0), TurnSpeed);
if (keyboard.IsKeyDown(Keys.Left))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, 1), TurnSpeed) * Direction;
if (keyboard.IsKeyDown(Keys.Right))
Direction = Quaternion.CreateFromAxisAngle(new Vector3(0, 0, -1), TurnSpeed) * Direction;
出于某种原因,第一种方法具有相对于当前横向方向的旋转,而您想要上下旋转,但是您不希望横向旋转具有当前的横向方向,因此需要第二阶。
对于FPS相机,您通常不希望滚动,并且俯仰角度限制为+/- 90度,因此,我仅使用偏航角和俯仰角度来跟踪当前状态。四元数的全部功能实际上并没有帮助。
如果要使用四元数关键帧插值或类似方法在FPS摄像机和动画摄像机之间转换,仍可以在四元数之间来回转换偏航角/俯仰角。