0
\$\begingroup\$

I'm trying to get the angle between two 2D vectors relative to the first vector input. Every method I've tried has given me a value between 0-180 degrees but doesn't tell me whether it was a clockwise or counter-clockwise rotation.

For example: If I hold my forward vector in a variable and then turn counter-clockwise 45 degrees and use that as my second forward vector, I'm looking for -45 or 315 degrees as the output, not 45.

\$\endgroup\$

2 Answers 2

0
\$\begingroup\$
float AngleBetween(Vector2 a, Vector2 b) { // Get a vector rotated 90 degrees from a. Vector2 perpendicular = new Vector2(a.y, -a.x); // Compute a scaled projection of b onto the original and rotated version. float x = Vector2.Dot(a, b); float y = Vector2.Dot(perpendicular, b); // Treat these as a point in a coordinate system where a is the x axis, // and perpendicular is the y axis, and get the polar angle of that point. return Mathf.Atan2(y, x); } 
\$\endgroup\$
0
\$\begingroup\$

There is a solution for unity (Maybe there is a better solution, but it works):

using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { void Start() { var v1 = new Vector3(1, 1, 0);//45 var v2 = new Vector3(1, 0, 0);//0 Debug.Log(GetDegree(v1, v2)); Debug.Log(GetDegree(v2, v1)); } private float GetDegree(Vector3 from, Vector3 to) { var rot = Quaternion.FromToRotation(from, to); var angle = 0.0f; var axis = Vector3.zero; rot.ToAngleAxis(out angle, out axis); if (Vector3.forward == axis) { return angle; } else { return angle - 360f; } } } 

Output:

-315 44.99999 
\$\endgroup\$

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.