在过去的几个小时里,我在网上经历了很多问题,试图找出如何使用最小距离来计算两个向量之间的旋转。另外,使用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);
谢谢, 詹姆斯
答案 0 :(得分:0)
您计算两个不同的角度:
角度α是用atan2计算的角度(等于opposite side / adjacent side
)。角度beta是用点积计算的。
您可以使用带
的点积获得类似的结果(与atan一样)angle = acos(dot(normalize(target - source), -z))
(-z
是负z方向的单位向量)
然而,你将失去这个标志。