我试图在我的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
方式。
答案 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的最短角度旋转。