我正在开发一款Unity游戏,其中玩家的欧拉角显示出一些我无法理解的奇怪行为。似乎有两个完整的360度旋转,一个是正的,一个是负的。根据您在yaw
度时的方向,它将采用负路径或正路径。这意味着玩家可以拥有完全不同的// make player the origin, so the target is relative to the player
Vector3 delta = player.angles - target.angles;
float magnitude = delta.Length();
float pitch = asin((delta.y) / magnitude) * (180 / M_PI);
float yaw = -atan2(delta.x, -delta.z) * (180 / M_PI);
值,具体取决于它是否采用绿色或红色路径。请参阅下图以了解正在发生的事情:
当我想要计算玩家在3d世界空间中查看某个特定对象的新角度时,问题就出现了。我用一些简单的数学计算这个角度:
0 to 180
这会让我回到正确的角度,但是偏航来自-180 to 0
,然后是// this makes sure the calculated angle is from 0-360
if (yaw < 0) {
yaw += 360; // normalize yaw
}
。我这样做是正确的:
// normalize angles for when using negative rotation
if (localAngles[1] < 0)
{
angles[1] -= 360;
}
double diffPitch = (angles[0] - localAngles[0]);
double diffYaw = (angles[1] - localAngles[1]);
// this makes sure we always take the shortest amount of degrees to target
if (diffYaw < -180)
{
diffYaw += 360;
}
if (diffYaw > 180)
{
diffYaw -= 360;
}
所以,现在这与上图所示的红色旋转线对齐。如果我将球员旋转设置为新计算的角度,它将直接正确地看待目标对象。但是,只有当玩家处于红色旋转路径时。
如果播放器位于绿色旋转路径上,则计算出的角度不适合当前用户旋转。如果我现在设置轮换,事情会变得古怪。不知何故,我需要补偿计算出的新玩家角度。
这里发生了什么?是否可以操纵新计算的角度(范围始终为0-360),因此它基于当前玩家的旋转路径(绿色或红色)?
我希望我的问题有道理,我发现很难跟踪发生的事情。我希望有人可以解释我的情况并最终帮助我修复新的计算角度,以便调整到当前玩家的旋转路径!
感谢任何帮助,提前谢谢!
修改 所以我想出了以下内容,以确保玩家总是旋转最短的量,同时考虑绿色和红色旋转路径:
%in%
我将不得不再测试一下以确保这是解决方案。