i posted this originaly on creative cow.
i'm trying to measure z space distance between the camera and an object layer, converting that distance into a percentage, then applying that percentage to an effect.
first method i used was toWorld and linear;
C = thisComp.activeCamera.toWorld([0,0,0]); // Cam position
x = thisComp.activeCamera.position[0]; // Cam x position
y = thisComp.activeCamera.position[1]; // Cam y position
z = position[2]; // Object z position
P = toWorld([x,y,z]); // Object relative position on the z-axis from Cam
d = length(C,P); // Distance Calculation
linear(d,startFade,endFade,1,Q.effect("Levels (Individual Controls)")("Input White"))
problem is that for some reason scale effects this inversely, i.e. scaling down increases the effect, scaling up the effect decreases. i'm assuming that it's toWorld that's taking scale into effect.
so next i tried using position.value;
c = thisComp.activeCamera.position.value[2];
P = position.value[2];
d = length(c,P);
easeOut(d,startFade,endFade,Q.effect("Levels (Individual Controls)")("Output Black"),0)
great it works,
except for parented layers.
parented layers take on the position relative to the parent layer. the postition.value[2] is not absolute to the world.
no good, can't animate without parenting.
so is there some other position interpolation method or some way to stabilize scale to not effect toWorld?
driving me crazy,
hope you can help,
chris d-_-b
distance from camera expression issues...
-
- Posts: 320
- Joined: June 26th, 2004, 10:01 am
- Location: Folsom, CA
- Contact:
It doesn't look like you posted the entire expression, but give this a try:
Dan
Code: Select all
d = Math.abs(thisComp.activeCamera.toWorld([0,0,0])[2] - toWorld(anchorPoint)[2]);
easeOut(d,startFade,endFade,Q.effect("Levels (Individual Controls)")("Output Black"),0)
Okay, it looks like it's working. wow. thank you.
here's the code
Q=thisComp.layer("atmopheric master control");
startFade = Q.effect("Start Close Up")("Slider");
endFade = Q.effect("End Close Up")("Slider");
d = Math.abs(thisComp.activeCamera.toWorld([0,0,0])[2] - toWorld(anchorPoint)[2]);
easeOut(d,startFade,endFade,Q.effect("Levels (Individual Controls)")("Output White"),1)
Q is a control null with all my FX settings
i'm using a combination of color balance, levels and hue/sat to have objects fade off in the distance and turn black in the foreground.
i'm still wondering why scale effects toWorld.
and what does Math.abs exactly do? the AE scripting help is a little vague.
thanks again,
chris d-_-b
here's the code
Q=thisComp.layer("atmopheric master control");
startFade = Q.effect("Start Close Up")("Slider");
endFade = Q.effect("End Close Up")("Slider");
d = Math.abs(thisComp.activeCamera.toWorld([0,0,0])[2] - toWorld(anchorPoint)[2]);
easeOut(d,startFade,endFade,Q.effect("Levels (Individual Controls)")("Output White"),1)
Q is a control null with all my FX settings
i'm using a combination of color balance, levels and hue/sat to have objects fade off in the distance and turn black in the foreground.
i'm still wondering why scale effects toWorld.
and what does Math.abs exactly do? the AE scripting help is a little vague.
thanks again,
chris d-_-b
-
- Posts: 320
- Joined: June 26th, 2004, 10:01 am
- Location: Folsom, CA
- Contact:
I think scaling should only affect the results if it causes the Anchor Point to move. What are seeing exactly?
Math.abs() just takes the absolute value and gives you a posative number, like length() does.
Dan
Math.abs() just takes the absolute value and gives you a posative number, like length() does.
Dan
in the original expression (the one using toWorld) the effect was inversed against the scale of the object.
as in if i increased the scale (grow) of the object it would cause the same effect if i had moved the object further back in z-space away from the camera.
if i decreased the scale (shrink) the object it would cause the same effect if i had moved it closer to the camera.
i originally was usinig the full position [x,y,z] for the effect but it would measure from the anchorpoint and having some offset anchorpoint animated obejcts messed with the effect. so i isolated the [z] but then the nasty scale effect came into play. using just the position was no good for parented objects. as you can guess by now there was alot of kinectic animation and moving camera.
what's with toWorld?
d-_-b
as in if i increased the scale (grow) of the object it would cause the same effect if i had moved the object further back in z-space away from the camera.
if i decreased the scale (shrink) the object it would cause the same effect if i had moved it closer to the camera.
i originally was usinig the full position [x,y,z] for the effect but it would measure from the anchorpoint and having some offset anchorpoint animated obejcts messed with the effect. so i isolated the [z] but then the nasty scale effect came into play. using just the position was no good for parented objects. as you can guess by now there was alot of kinectic animation and moving camera.
what's with toWorld?
d-_-b
-
- Posts: 320
- Joined: June 26th, 2004, 10:01 am
- Location: Folsom, CA
- Contact:
toWorld() does one specific thing, and that is to convert coordinates from a layer's layer space (where the upper left corner is [0,0,0]) to world space.
So the only thing you would want to feed toWorld() would be coordinates represented in layer space. This is why you always see anchorPoint used instead of position (because a layer's anchor point is always expressed in its layer space).
Feeding it world coordinates (which is what it appears you're doing in your original expression) will lead to unpredictable results.
Dan
So the only thing you would want to feed toWorld() would be coordinates represented in layer space. This is why you always see anchorPoint used instead of position (because a layer's anchor point is always expressed in its layer space).
Feeding it world coordinates (which is what it appears you're doing in your original expression) will lead to unpredictable results.
Dan
-
- Posts: 320
- Joined: June 26th, 2004, 10:01 am
- Location: Folsom, CA
- Contact:
I think lights have included falloff since CS5.5, but if you have an earlier version, you could try something like this:
Doing it this way though affects the amount of light from Light 1 falling on other layers as well.
Dan
Code: Select all
decay = .005;
noFalloff = 200;
L = thisComp.layer("target");
p1 = L.toWorld(L.anchorPoint);
p2 = toWorld([0,0,0]);
d = length(p1,p2);
if (d < noFalloff){
value;
}else{
value/Math.exp((d - noFalloff)*decay);
}
Dan