2014-01-08 67 views
0

我想在我的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

新方法:使用4象限'atan2(y,x)'而不是2象限'acos(x)'。不知道如何讓你的'x,y'。 – chux

回答

0

讓我們假設直線前進爲0,並且您以順時針方式計算度數。

如果你需要轉動180或更少,那麼你正在向右移動。
如果你需要超過180個,你必須左轉。這一輪是左轉360度值。

我希望這能回答你的問題。

+0

嗨,謝謝你的回答,但我不認爲這是有效的......事實上,我試着減去360,但我上面顯示的代碼只能用角度來旋轉它 - 它可能意味着旋轉向左或向右旋轉... – Danny

1

點積規則只是告訴你最短的角度(總是小於180!),而不是走哪條路。你是否有辦法從D3DXVECTOR(即極座標類型的東西?)中獲得方向角?如果是,則可以減去(所需的角度) - (當前角度),如果-180到180之間爲逆時針;否則,順時針旋轉。

我有一種感覺,跨產品也可能提供一種方法,但我不得不坐下來用一張紙來解決問題。

+0

你是對的點產品。但我不太確定這個「極地形式」的含義。你有什麼機會可以解釋一下嗎? – Danny

+0

如矢量 - (距離,方向)而非(x,y)的極座標形式。 – tabstop

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表示最短anglular轉動。