Page 1 of 1

Calculate angle between Object and Camera in 3D

Posted: January 5th, 2009, 2:57 am
by pedestrian
Hi people.
I have a comp with a camera, and a layer positioned in 3D. What I would like to do is to move the camera around, and calculate the angle of the object relative to the camera.

After some googling I found this piece of code on CreativeCow:

Code: Select all

C = thisComp.layer("Camera 1");
v1 = normalize(position - C.position)
v2 = C.toWorldVec([0,0,1]);

radiansToDegrees(Math.acos(dot(v1,v2))) 
But I'm not sure if this works, because the value depends on the xy position of the object in zspace. So not only the angle.

Basically what I am looking for is to change the object's opacity depending on its angle and distance to the camera. Could someone help me out in the right direction?

Thank!
P.

Re: Calculate angle between Object and Camera in 3D

Posted: January 5th, 2009, 5:18 am
by pedestrian
Well after some digging around here and there I found some pieces of code here and there. It seems to work a bit. the only thing that I would like to add is the amount of degrees it faces away from the cam. So the more it faces away, to less you see it.

Code: Select all

//check to see if it is facing the camera if so then:
if (toCompVec([0, 0, 1])[2] > 0 ) {
startFade = 500; // Start fade 500 pixels from camera.
endFade = 1500;  // End fade 1500 pixels from camera.
try{ // Check whether there's a camera.
C = thisComp.activeCamera.toWorld([0,0,0]);
}catch(err){ // No camera, so assume 50mm.
w = thisComp.width * thisComp.pixelAspect;
z = (w/2)/Math.tan(degreesToRadians(19.799));
C = [0,0,-z];
}
P = toWorld(anchorPoint);
d = length(C,P);
//change the opacity value
linear(d,startFade,endFade,100,0)
}
//if the object is not facing the camera than it is invisible
 else 0;

Re: Calculate angle between Object and Camera in 3D

Posted: January 6th, 2009, 5:29 am
by kobyg
You could also try the "lookAt" function, for calculating the x,y,z angles between 2 points in 3d space
and the "length" function, for calculating the distance between 2 points.

for example:

Code: Select all

C = thisComp.layer("Camera 1");
ANGL = lookAt(position, C.position);
DIST = length(position, C.position);
ANGL is a 3 array with [x,y,z] 3d orientation angles between position and C.position.
DIST is a single value with the distance between position and C.position.

Koby.

Re: Calculate angle between Object and Camera in 3D

Posted: June 23rd, 2010, 8:18 am
by ritka
Hi!
How can i use the "lookAt", and "length" function for the opacity?

Re: Calculate angle between Object and Camera in 3D

Posted: June 26th, 2010, 2:15 pm
by kobyg
I didn't quite understand what you want to do with the Opacity,
but you could use the lookAt and length expressions the same as I used them in the last expression...
But you have to create a single value out of the lookAt 3d vector,
and that depends on what you want to achieve...

Koby

Re: Calculate angle between Object and Camera in 3D

Posted: June 26th, 2010, 3:48 pm
by ritka
I need an expression for change the opacity depending the layer relative angle to the camera.
(Example: when the camera and the layer is face to face, then opacity is 100%, and 0% if we see the side of the layer.)
Sorry, but i'm not a genius, i don't know how to create a single value from lookAt...

Re: Calculate angle between Object and Camera in 3D

Posted: June 26th, 2010, 10:40 pm
by Dan Ebberts
If you just want the opacity to go to zero when the layer is facing away from the camera, this should work:

toCompVec([0, 0, 1])[2] > 0 ? value : 0

If you need to fade from 100 to zero as it points away from the camera, try this:

v = toCompVec([0,0,1]);
d = length(toWorld(anchorPoint),thisComp.layer("Camera 1").toWorld([0,0,0]));
c = v[2]/d;
ease(c,0,1.0,0,100)


Dan

Re: Calculate angle between Object and Camera in 3D

Posted: June 27th, 2010, 2:00 am
by ritka
I was looking for the second version.
Thanks Dan!