x


Angle between two objects' facing direction

Hello Everybody...

I'm currently working on a project which requires me to do something I just can't figure out.

I need to know the angle between two objects facing directions. Let me explain; if you look down on two arrows, with the heads down the x-axis, rotated randomly, around the y-axis. Now I need to know the angle between the two arrowheads.

So if the two arrows face away from each other I need an angle of 180 degrees, and If they face the same direction I need an angle of 0 degrees.

I tried everything from trigonometric functions to simple unity references, and nothing seems to work how I want it, I have a hunch the Vector3.Angle could work, but so far it doesn't.

more ▼

asked May 06, 2012 at 05:59 PM

MaeniAck gravatar image

MaeniAck
22 1 2 4

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

Vector3.Angle gives you the angle between two directions. Just put transform.forward of both objects in there, and it should give you the angle you need.

It has one limitation, though, it doesn't distinguish between CW and CCW. I wrote a function for that:

 function angleDir(fwd: Vector3, targetDir: Vector3, up: Vector3) {
     var perp: Vector3 = Vector3.Cross(fwd, targetDir);
     var dir: float = Vector3.Dot(perp, up);
     
     if (dir > 0.0) {
         return 1.0;
     } else if (dir < 0.0) {
         return -1.0;
     } else {
         return 0.0;
     }
 }

It returns 1.0 for CW, -1.0 for CCW and 0.0, if the angle between the two objects is 0.

more ▼

answered May 06, 2012 at 06:08 PM

Piflik gravatar image

Piflik
5.9k 73 67 94

Sorry for not marking you answers a correct sooner.

As the question posted was an analogy for just a part of what I was doing I tried a lot of methods out, including yours and coming to the conclusion I was thinking about it in a wrong fashion. I ended up using a combination of vector calculations and trigonometry to achieve the effect I was looking for.

Nevertheless for the question I posted this was a fulfilling answer. And it did help me.

Mar 09, 2013 at 02:44 AM MaeniAck

Hey @BobBobson108 Thanks for the C# version, ONE question, I read this whole question, and if im reading it right I could potentially check if my local objects y axis is pointing in the same direction as the Space.World y axis such as just vector3.up (Basically detecting if my gameobject is pointing in the same direction as the world or gobal axises) I only need to check if the two y axises (1.Being my GameObjects y axis) (2.Being a Vector3.Up) are pointing in the same direction. Let me know if im wrong thanks :D

Jan 07 at 02:11 PM Daniel G

here it is in C#

     float AngleDir (Vector3 fwd, Vector3 targetDir, Vector3 up) {
         Vector3 perp = Vector3.Cross(fwd, targetDir);
         float dir = Vector3.Dot(perp, up);
             
         if (dir > 0) {
             return 1;
         } else if (dir < 0) {
             return -1;
         } else {
             return 0;
         }
      }
Mar 08, 2013 at 08:55 PM BobBobson108
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x515
x480
x93
x78

asked: May 06, 2012 at 05:59 PM

Seen: 4064 times

Last Updated: Jan 07 at 02:11 PM