I have a spaceship. Green vector is an origin (direction spaceship points to). Red vectors are direction where velocity will be applied.

I need to rotate spaceship with blue angle (nearest). In pseudocode I have:

angle = Vector2.Angle(velocity, origin)
spaceship.rotation += angle

But in this case (with angle addition) it will rotate only counterclockwise. In first two cases (pictures) this is wrong, there should be angle distraction. The third case is ok, it will get the right velocity in nearest angle.

So, what is the condition when I should use distraction instead of addition angle?

enter image description here

  • $\begingroup$ You just need to allow angle to be negative. Then you can always use addition. $\endgroup$ – Marconius Oct 16 '15 at 23:45

I'll assume that you're coding in Unity. We can detect orientation by checking the sign of a cross product:

 float angle = Vector2.Angle(velocity, origin);
 Vector3 cross = Vector3.Cross(velocity, origin);

 if (cross.z > 0)
     angle = 360 - angle;
  • $\begingroup$ You are right, it's Unity. Thanks for the answer. I forgot about cross product. It works. $\endgroup$ – Max Frai Oct 16 '15 at 23:54

I'm assuming that you are in a 2d world. You could calculate the cross-product of the green and red vectors and check the sign of the z-axis.

Let $G = (a, b)$ be the green vector and $R = (c, d)$ be the red vector.

Extend them to the $\mathbb{R}^3$ and calculate the cross-product. So:

$$ \begin{vmatrix} i & j & k \\ a & b & 0 \\ c & d & 0 \end{vmatrix} = (ad - bc) k $$

If $ad - bc \gt 0$, then the green vector is on the right, just like your first and second image.

If $ad - bc \lt 0$, then the green vector is on the left, just like your third image.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.