Advertisement

Rotation of Player

Started by July 03, 2016 07:01 PM
2 comments, last by ExErvus 8 years, 7 months ago

Whats up gents,

Trying to program a rotation from my mainPlayer to an enemyNPC.

3D coordinate system, positive z is the up vector, enemies and player have position and direction vector.

i believe i have the math correct. i was just wondering is there a way to compute this with just the cross product?

get cross product between main player facing and up vector
Vector3 cross = mainPlayer.Facing.Cross(new Vector3(0,0,1));
get the vector from enemy to mainPlayer
Vector 3 inBetween = new Vector3((enemy.Position.X - mainPlayer.Position.X, enemy.Position.Y - mainPlayer.Position.Y, enemy.Position.Z - mainPlayer.Position.Z);
compute the angle via dot product
float dot = cross.dot(inBetween);
if (dot <= 0.0f)
turn right
else
turn left
Thanks for any input or help clear.png

That seems sensible. Work out which direction is 'right' work out if the enemy is on the left or the right. If it's on the right turn right, if it's on the left turn left. I quite like it and I'm ashamed to say I would have definitely over complicated the problem if I had to solve it.

I don't see any major issues with your solution but when the dot product is 0 then you are either directly facing the enemy or have your back to the enemy. You could also use the 'facing' vector dot with the inBetween vector to work out if you are facing the enemy and stop turning.

There are other ways to do this that might be more appropriate depending on how your game is. If your solution doesn't meet with your requirements then you can use a 'look at' matrix type approach but then you still have to deal with actually rotating to that orientation.

Interested in Fractals? Check out my App, Fractal Scout, free on the Google Play store.

Advertisement

Ah thanks a bunch for your input Nanonah. Really appreciate the help and confirmation. :)

There is a relation between angle and position with the dot product, but that alone does not tell you the angle. If you want to rotate towards an NPC or any point in 2d space(along the UP axis, Y in D3D, z in OpenGL), you can use the arcos of the geometric definition of the dot product.

That is cos(theta) = Dot(vec1, vec2)/(mag(vec1) * mag(vec2)).

\[cos(theta) = \frac{A \cdot B}{\left \| A \right \|\left \| B \right \|}\]

Take the arcos of the right side to get the angle between the two facing vectors.

Or

\[arcos(\frac{A\cdot B}{\left \| A \right \|\left \| B \right \|}) = \Theta betweenvectors\]

That is a good place to start.

This topic is closed to new replies.

Advertisement