旋转摄像机视图的速度发生不必要的变化

时间:2016-07-05 10:12:17

标签: c# 3d xna xna-4.0

我在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是Variable,它指定相机必须在哪里观看,并且每次按下键盘上的箭头按钮时都会更改。当按下箭头键时第一次关闭相机时没有问题,但是每下一个转弯都要慢得多,就像Speed变量大约是1.0f一样。 你是否看到这种方法存在问题,导致这种情况变慢。

播放器的移动速度不会改变,因此问题不在于电脑的速度

P.s轴是枚举 P.s1是第1人,玩家只是相机

1 个答案:

答案 0 :(得分:1)

假设您正在查看屏幕中心。现在你将lookAt点向右移动10厘米,这样你的眼角就会改变一些值。现在让我们说你做了几十次,所以你的lookAt点在右边10米处 - 当你再移动10厘米时,你的眼睛角度变化会小得多。

这就是为什么你的lookAt方法不是第一人称相机的最佳选择。你可以试着用一些三角函数来解决这个问题,用lookAt函数计算所需的tangens偏移量,这样你就可以得到正确的角度变化,但是你会在无限远和最后得到问题你会得到许多复杂的ifs:)。

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

  • 如果您可以直接设置相机旋转(您可能无法通过'查看'相机进行设置),您只需设置X / Z值或构建旋转矩阵即可使用。< / p>

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

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