我在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人,玩家只是相机
答案 0 :(得分:1)
假设您正在查看屏幕中心。现在你将lookAt
点向右移动10厘米,这样你的眼角就会改变一些值。现在让我们说你做了几十次,所以你的lookAt
点在右边10米处 - 当你再移动10厘米时,你的眼睛角度变化会小得多。
这就是为什么你的lookAt
方法不是第一人称相机的最佳选择。你可以试着用一些三角函数来解决这个问题,用lookAt
函数计算所需的tangens
偏移量,这样你就可以得到正确的角度变化,但是你会在无限远和最后得到问题你会得到许多复杂的ifs:)。
我建议将X / Z旋转角度存储在某处。然后在您的函数中,您只需从X或Z角度添加/减去Speed
。然后,根据您的确切API(我不知道Xna),您有这样的选择:
如果您可以直接设置相机旋转(您可能无法通过'查看'相机进行设置),您只需设置X / Z值或构建旋转矩阵即可使用。< / p>
如果您需要坚持使用当前的lookAt
方法 - 您可以构建一个单位矢量并围绕两个轴旋转它,然后将其添加到您的相机位置,您将获得正确的{{ 1}}点。
如果您在Xna中仍然遇到问题和/或您缺少某些功能,请告诉我您可以在那里使用什么,我会尽力帮助。