如何计算旋转方向?

时间:2014-01-08 22:09:35

标签: c++ math

我试图在我的DirectX应用程序中实现一个简单的AI系统。我试图让我的Ai旋转并面向我希望它面向的方向,我设法做到,但无法弄清楚如何让它来确定如何旋转到给定的方向(即它应向左旋转还是向右旋转?)。

以下是我所获得的代码,它可以解决所需的角度,以便面对它所给出的方向:

    D3DXVECTOR3 incident = destination - position;
    float top = D3DXVec3Dot(&incident, &forwardVec);
    float bottom =  sqrt((incident.x * incident.x) + (incident.y * incident.y) + (incident.z * incident.z)) *
                    sqrt((forwardVec.x * forwardVec.x) + (forwardVec.y * forwardVec.y) + (forwardVec.z * forwardVec.z));
    float remainingAngle = acos(top/bottom) * 180.0f / PI;

forwardVec是AI目前面临的D3DXVECTOR3方式。

3 个答案:

答案 0 :(得分:1)

点积规则只是告诉你最短的角度(总是小于180!),而不是走哪条路。你有办法从D3DXVECTOR(即极性形式的东西)中获得方向角吗?如果是这样,那么你可以减去(所需角度) - (当前角度),如果在-180到180之间,逆时针方向去;否则,顺时针方向。

我觉得交叉产品也可能会提供一种方法,但我不得不坐下来用一张纸来解决它。

答案 1 :(得分:0)

让我们假设直线前进是0并且你以顺时针方式计算度数。

如果你需要转180或更少,那么你就是向右移动 如果你需要转动超过180,你必须向左转。此转弯是360度值的左转。

我希望这能回答你的问题。

答案 2 :(得分:0)

2个归一化向量之间的角度:

double GetAng (const D3DXVECTOR3& Xi_V1, const D3DXVECTOR3& Xi_V2)
{
      D3DXVECTOR3 l_Axis;
      D3DXVec3Cross(&l_Axis, &Xi_V1, &Xi_V2);
      return atan2(D3DXVec3Length(&l_Axis), D3DXVec3Dot(&Xi_V1, &Xi_V2));
}

返回的角度介于-PI和PI之间,表示从v1到v2的最短角度旋转。