如何防止使用四元数的FPS相机倾斜和弄乱?


17

我正在使用类似FPS的相机,并且使用四元数。但是,每当我尝试向上看然后向侧面倾斜时,它都会倾斜,有时它会上下颠倒。我怎样才能解决这个问题?


3
(将在7个小时内自动答复)...
Aeodyn 2012年

Answers:


16

您可以将四元数分解为一组偏航角/俯仰角/滚动角,但这通常是过大的。

而不是像这样构成四元数:

cameraOrientation = cameraOrientation * framePitch * frameYaw;

尝试这个:

cameraOrientation = framePitch * cameraOrientation * frameYaw;

这样就永远不会产生倾斜/滚动,等效于分别存储偏航和俯仰


3
这个。这正是我想要的。一口气解决了我的问题。真好!
aardvarkk

1
framePitchframeYaw float类型?另外,对于您的第一句话,我将不胜感激。
sirdank 2015年

1
@sirdank cameraOrientationframePitchframeYaw都是四元数(每个四元数是4个浮点数或双精度数)。
Dan

8

这是我有一段时间的问题了,我找不到任何答案,所以我想将其发布在这里。

实际上很简单。您最有可能进行旋转的方式是这样的:

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;

出于某种原因,第一种方法具有相对于当前横向方向的旋转,而您想要上下旋转,但是您不希望横向旋转具有当前的横向方向,因此需要第二阶。


我不得不等待7个小时才能回答自己的问题……
Aeodyn 2012年

抱歉,您可以用一些屏幕截图对此进行解释吗?“一阶”和“二阶”有点令人困惑-谢谢!
Atav32

使用四元数时,顺序很重要,因为3D旋转总是如此。在我的示例中,“方向* = newRotation”与“方向=方向* newRotation”相同。但是,随着左右旋转,我们希望反过来。这使其不依赖于向上和向下倾斜,从而导致滚动。
Aeodyn 2012年

哦,尽管我要说的是四分之一点是它避免了万向节锁定,并且旋转都是独立的,但是我可能误读了教科书。因此,为了澄清一下,您是说如果反转旋转变换的顺序,可以防止相机倾斜?还是在旋转偏航时将滚动和俯仰转换手动设置为0?
Atav32 2012年

5

对于FPS相机,您通常不希望滚动,并且俯仰角度限制为+/- 90度,因此,我仅使用偏航角和俯仰角度来跟踪当前状态。四元数的全部功能实际上并没有帮助。

如果要使用四元数关键帧插值或类似方法在FPS摄像机和动画摄像机之间转换,仍可以在四元数之间来回转换偏航角/俯仰角。


0

另一个简单的技巧是将摄影机放置在GameObject中,并通过偏航角旋转控制游戏对象,而子摄影机则配置有Pitch坐标:

playerCameraHolder.transform.Rotate(0, rotationYaw, 0);
playerCamera.transform.Rotate(rotationPitch, 0, 0);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.