Tuesday, September 11, 2012

Orient 3D layer to camera properly

(Expression code fixed)

Auto-Orienting 3D layers towards the camera doesn't work well in After Effects, since they point towards the camera object itself rather than being parallel to the camera plane and thus usually still look like they're at an angle. I found this expression, (like nearly all expressions, it's by Dan Ebberts) to do it properly. Put it on the Orientation of a 3d layer:

L = thisComp.activeCamera; u = fromWorldVec(L.toWorldVec([1,0,0])); v = fromWorldVec(L.toWorldVec([0,1,0])); w = normalize(fromWorldVec(L.toWorldVec([0,0,1]))); sinb = clamp(w[0],-1,1); b = Math.asin(sinb); cosb = Math.cos(b); if (Math.abs(cosb) > .0005){ c = -Math.atan2(v[0],u[0]); a = -Math.atan2(w[1],w[2]); }else{ a = (sinb < 0 ? -1 : 1)*Math.atan2(u[1],v[1]); c = 0; } [radiansToDegrees(a),radiansToDegrees(b),radiansToDegrees(c)]



or you can target a specific camera in the first line (I usually do it this way to avoid annoying expression errors if you go outside an active camera's range on the timeline) eg 

L = thisComp.layer("Camera 1"); u = fromWorldVec(L.toWorldVec([1,0,0])); v = fromWorldVec(L.toWorldVec([0,1,0])); w = normalize(fromWorldVec(L.toWorldVec([0,0,1]))); sinb = clamp(w[0],-1,1); b = Math.asin(sinb); cosb = Math.cos(b); if (Math.abs(cosb) > .0005){ c = -Math.atan2(v[0],u[0]); a = -Math.atan2(w[1],w[2]); }else{ a = (sinb < 0 ? -1 : 1)*Math.atan2(u[1],v[1]); c = 0; } [radiansToDegrees(a),radiansToDegrees(b),radiansToDegrees(c)]

Found at: http://forums.creativecow.net/thread/227/21917#21917

1 comment:

Lucia Stone said...

I like this blog color, and its really a great sharing. Creative, heavenly blog, which really a great sharing. Lovely and awesome.