Vector 使用两个向量旋转最小的量

Vector 使用两个向量旋转最小的量,vector,xna,rotation,angle,Vector,Xna,Rotation,Angle,在过去的几个小时里,我在网上问了很多问题,试图找出如何用最小距离计算两个向量之间的旋转。另外,使用Atan2和使用点积有什么区别?我最常见到他们 其目的是仅基于X/Z位置的差异在y轴上旋转(考虑三维世界中的自上而下旋转) 选项1:使用Atan2。似乎工作得很好,除非它将弧度从正变为负 float radians = (float)Math.Atan2(source.Position.X - target.Position.X, source.Position.Z - target.Pos

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

其目的是仅基于X/Z位置的差异在y轴上旋转(考虑三维世界中的自上而下旋转)

  • 选项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到π-我可以使用它吗

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

    你计算两个不同的角度:

    角度α是用atan2计算的角度(等于
    对侧/相邻侧
    )。角度β是用点积计算的

    您可以通过使用点积获得类似的结果(与atan相同)

    angle = acos(dot(normalize(target - source), -z))
    
    -z
    是负z方向的单位向量)

    但是,您将失去该标志