用两个向量旋转最小量

时间:2013-05-13 04:49:36

标签: vector xna rotation angle

在过去的几个小时里,我在网上经历了很多问题,试图找出如何使用最小距离来计算两个向量之间的旋转。另外,使用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);
    
  2. 这样可以正常工作,除非一度开始抖动,然后向另一方向摆动。

    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);
      
    2. 谢谢, 詹姆斯

1 个答案:

答案 0 :(得分:0)

您计算两个不同的角度:

Visualization

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

您可以使用带

的点积获得类似的结果(与atan一样)
angle = acos(dot(normalize(target - source), -z))

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

然而,你将失去这个标志。