0

在过去的几个小时里,我在网上经历了很多问题,试图弄清楚如何使用最小距离计算两个向量之间的旋转。另外,使用 Atan2 和使用点积有什么区别?我最常看到他们。

目的是仅根据 X/Z 位置的差异在 y 轴上旋转(想想 3D 世界中的自上而下旋转)。

  1. 选项 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);
    

这工作得很好,除了在某个时候它开始抖动然后以另一种方式摆动。

  1. 使用点积。似乎无法使其正常工作,它总是朝同一个方向转动 - 是否有可能让它朝最小的方向摆动?我知道它的范围从 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);
    

谢谢,詹姆斯

4

1 回答 1

0

你计算两个不同的角度:

可视化

角度 alpha 是使用 atan2 计算的角度(等于opposite side / adjacent side)。角 beta 是用点积计算的。

您可以使用点积获得类似的结果(如使用 atan)

angle = acos(dot(normalize(target - source), -z))

(-z是负z方向的单位向量)

但是,您将失去标志。

于 2013-05-14T19:07:36.527 回答