旋转相机视图速度的意外变化
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 您缺少一些功能,请告诉我您在那里可以使用什么,我会尽力提供帮助。
我在 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 您缺少一些功能,请告诉我您在那里可以使用什么,我会尽力提供帮助。