我正在尝试在我的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是人工智能当前所面临的方向的D3DXVECTOR3。
发布于 2014-01-09 06:16:32
点积规则只告诉你最短的角度(总是小于180!),而不是走哪条路。你有办法从D3DXVECTOR (即极轴形状的东西)中得到方向角吗?如果是,则可以减去(所需角度)-(当前角度),如果在-180到180之间,则逆时针;否则,顺时针。
我有一种感觉,叉积也可能给出一种方法,但我必须坐下来拿一张纸来解决它。
发布于 2014-01-09 06:13:11
让我们假设前面的直线是0,并且您正在以顺时针方式计算度数。
如果你需要转到180岁或更少,那么你就向右转。
如果你需要转弯超过180度,你必须左转。这个转弯是360度的左转弯。
我希望这能回答你的问题。
发布于 2014-12-05 20:06:57
两个归一化向量之间的角度:
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的最短角度旋转。
https://stackoverflow.com/questions/21007645
复制相似问题