Danny
Danny

Reputation: 9614

how to calculate which direction to rotate?

I'm trying to implement a simple AI system in my DirectX Application. I'm trying to get my Ai to rotate and face the direction I want it to face towards, which I manage to do, but can't figure out how to get it to determine how to rotate to the given direction (i.e should it rotate left or rotate right?).

Here is the code I've got which works out the angle it needs to rotate by to face the direction it's given:

    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;

The forwardVec is a D3DXVECTOR3 of which way the AI is currently facing.

Upvotes: 0

Views: 637

Answers (3)

yeilam
yeilam

Reputation: 1

The angle between 2 normalized vectors:

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));
}

The returned angle is between -PI and PI and represents the shortest anglular rotation from v1 to v2.

Upvotes: 0

tabstop
tabstop

Reputation: 1761

The dot product rule just tells you the shortest angle (which is always less than 180!), not which way to go. Do you have a way to get a direction angle out of a D3DXVECTOR (ie polar form kind of thing?) If so, then you can subtract (desired angle)-(current angle) and if that is within -180 to 180 go counterclockwise; otherwise, go clockwise.

I have a feeling that the cross product might also give a method, but I'd have to sit down with a piece of paper to work it out.

Upvotes: 1

Jean-Bernard Pellerin
Jean-Bernard Pellerin

Reputation: 12670

Let's suppose that straight ahead is 0 and you're counting degrees in a clockwise fashion.

If you need to turn 180 or less then you're moving right.
If you need to turn more than 180 you have to turn left. This turn is a left turn of 360 - value degrees.

I hope this answers your question.

Upvotes: 0

Related Questions