在过去的几个小时里,我在网上经历了很多问题,试图弄清楚如何使用最小距离计算两个向量之间的旋转。另外,使用 Atan2 和使用点积有什么区别?我最常看到他们。
目的是仅根据 X/Z 位置的差异在 y 轴上旋转(想想 3D 世界中的自上而下旋转)。
选项 1:使用 Atan2。似乎工作得很好,除非它将弧度从正数切换为负数。
float radians = (float)Math.Atan2(source.Position.X - target.Position.X, source.Position.Z - target.Position.Z); npc.ModelPosition.Rotation = new Vector3(0, npc.ModelPosition.Rotation.Y + (radians), 0);
这工作得很好,除了在某个时候它开始抖动然后以另一种方式摆动。
使用点积。似乎无法使其正常工作,它总是朝同一个方向转动 - 是否有可能让它朝最小的方向摆动?我知道它的范围从 0 到 pi - 我可以使用它吗?
float dot = Vector3.Dot(Vector3.Normalize(source.Position), Vector3.Normalize(target.Position)); float angle = (float)Math.Acos(dot); npc.ModelPosition.Rotation = new Vector3(0, npc.ModelPosition.Rotation.Y + (angle), 0);
谢谢,詹姆斯