旋转相机视图速度的意外变化

Unwanted change in speed of rotating camera view

我在 Xna 4,0 中有以下代码:

void Rotate(Axis destination, float Speed)
    {
        if(destination == Axis.X)
        {
            if(CameraLookAt.X >= 0.0f - CameraPosition.X && CameraLookAt.Z < 0.0f - CameraPosition.Z)
            {

                CameraLookAt.X += Speed;
                CameraLookAt.Z += Speed;
            }
            if(CameraLookAt.X >= 0.0f - CameraPosition.X && CameraLookAt.Z > 0.0f - CameraPosition.Z)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z -= Speed;
            }
            if(CameraLookAt.X < 0.0f - CameraPosition.X && CameraLookAt.Z >= 0.0f - CameraPosition.Z)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z += Speed;
            }
            if(CameraLookAt.X < 0.0f - CameraPosition.X && CameraLookAt.Z < 0.0f - CameraPosition.Z)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z -= Speed;
            }
        }

        if(destination == Axis.Z)
        {
            if (CameraLookAt.X >= 0.0f && CameraLookAt.Z < 0.0f)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z += Speed;
            }
            if (CameraLookAt.X > 0.0f && CameraLookAt.Z >= 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z += Speed;
            }
            if (CameraLookAt.X < 0.0f && CameraLookAt.Z >= 0.0f)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z += Speed;
            }
            if (CameraLookAt.X < 0.0f && CameraLookAt.Z < 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z += Speed;
            }
        }

        if (destination == Axis.MX)
        {
            if(CameraLookAt.X > 0.0f && CameraLookAt.Z <= 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z -= Speed;
            }
            if(CameraLookAt.X <= 0.0f && CameraLookAt.Z < 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z += Speed;
            }
            if(CameraLookAt.X > 0.0f && CameraLookAt.Z > 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z += Speed;
            }
            if(CameraLookAt.X <= 0.0f && CameraLookAt.Z > 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z -= Speed;
            }
        }

        if(destination == Axis.MZ)
        {
            if(CameraLookAt.X > 0.0f && CameraLookAt.Z <= 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z -= Speed;
            }
            if(CameraLookAt.X < 0.0f && CameraLookAt.Z <= 0.0f)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z -= Speed;
            }
            if(CameraLookAt.X <= 0.0f && CameraLookAt.Z > 0.0f)
            {
                CameraLookAt.X -= Speed;
                CameraLookAt.Z -= Speed;
            }
            if(CameraLookAt.X > 0.0f && CameraLookAt.Z > 0.0f)
            {
                CameraLookAt.X += Speed;
                CameraLookAt.Z -= Speed; 
            }
        }
    }

当玩家改变方向时,它必须转动相机视图。我在更新方法中调用它,例如 Rotattion(Rotation_Task, 20.0f); Rotation_Task 是变量,它指定相机必须观看的位置,并且每次按下键盘上的箭头按钮时都会更改。第一次按下箭头键时相机转动没有问题,但接下来的每一次转动都慢得多,就像 Speed 变量在 1.0f 左右。 您是否发现此方法中的问题可能导致速度变慢。

玩家的移动速度没有变化所以不是电脑速度的问题

P.s 轴是枚举 P.s1是第1个人,玩家只是摄像头

假设您正在看屏幕中央。现在你将你的 lookAt 点向右移动 10 厘米,这样你的眼睛角度就会改变一些值。现在假设您已经这样做了数十次,所以您的 lookAt 点在右侧 10 米处 - 当您再次将其移动 10 厘米时,您的视角变化会小得多。

这就是为什么您的 lookAt 方法不是第一人称相机的最佳方法。你可以尝试用一些三角函数来解决这个问题,用 tangens 函数计算所需的 lookAt 偏移量,这样你就可以得到正确的角度变化,但是你会在无穷大附近和最后遇到问题你会得到很多复杂的 ifs,因为你已经有了 :)。

我建议将您的 X/Z 旋转角度存储在某处。然后在您的函数中,您将从 X 或 Z 角度 add/subtract 您的 Speed。然后,根据你的确切 API(我不知道 Xna)你有这样的选择:

  • 如果您可以直接设置相机旋转(使用 'look at' 相机可能无法这样做),您只需设置 X/Z 值或构建一个旋转他们使用的矩阵。

  • 如果您需要坚持当前的 lookAt 方法 - 您可以构建一个单位向量并绕两个轴旋转它,然后将它添加到您的相机位置,您将获得正确的 lookAt 点。

如果您在 Xna 中仍然遇到问题 and/or 您缺少一些功能,请告诉我您在那里可以使用什么,我会尽力提供帮助。