You're right. Scaling the camera breaks it. Will take a look at that when I have a few min. Thanks Sebastian.
On Thu, Feb 24, 2011 at 2:03 PM, Sebastian Elsner <[email protected]>wrote: > Hey Ean, > > I just tested the script. Seems to work for simple setups, but I had > problems with some of the more crazier ones (which I have actually seen in > Production): > > set cut_paste_input [stack 0] > version 6.1 v2 > push $cut_paste_input > Axis2 { > translate {{curve x1 0 x10 0 x20 0.8400000334} {curve x1 0 x10 1.909999967 > x20 0.9399999976} {curve x1 0 x10 -0.9549999833 x20 0.7500000596}} > rotate {{curve x1 0 x10 39.95999908 x20 -7.99200058} {curve x1 0 x10 > -23.64299965 x20 84.58200836} {curve x1 0 x10 0 x20 0}} > scaling {{curve x1 1 x10 0.6} {curve x1 1 x10 1.1} {curve x1 1}} > name Axis2 > selected true > xpos -262 > ypos -181 > } > Axis2 { > translate {{curve x15 0 x30 3.160000086} {curve x15 0 x30 0} {curve x15 0 > x30 0}} > rotate {{curve x15 0 x30 12.65400028} {curve x15 0 x30 56.61000443} {curve > x15 0 x30 0}} > scaling {{curve x15 1} {curve x15 1} {curve x15 1}} > name Axis1 > selected true > xpos -262 > ypos -115 > } > Camera2 { > translate {{curve x25 0.4099999964 x36 0.4099999964} {curve x25 0 x36 > 0.3899999857} {curve x25 0 x36 0}} > rotate {{curve x25 0 x36 -14.65200043} {curve x25 0 x36 17.31599998} > {curve x25 0 x36 0}} > scaling {{curve x25 1} {curve x25 1} {curve x25 1}} > name Camera1 > selected true > xpos -262 > ypos -49 > } > > Maybe you want to have a look at it. > > cheers > > Sebastian > > > On 02/24/2011 02:23 PM, Ean Carr wrote: > >> For anyone who's interested: I took Ivan's function and added support >> for animated Axis / Camera nodes (it was only concatenating a single >> frame). Cheers -E >> >> def consolidateAnimatedNodeTransforms(axisNode): >> # This is based on Ivan B's consolidateNodeTransforms(). >> # Added support for animated Axis/Camera nodes. Also, if it's >> # a Camera being concatenated, then projection settings get copied. >> # -Ean C 24/Feb/2011 >> >> m = nuke.math.Matrix4() >> >> n = nuke.createNode(axisNode.Class()) >> n['scaling'].setExpression('curve') >> n['rotate'].setExpression('curve') >> n['translate'].setExpression('curve') >> >> if axisNode.Class() == 'Camera2': >> # If this is a Camera node, copy over important Projection >> settings. >> camNode = axisNode >> >> # Get the current values >> focal_v = camNode['focal'].toScript() >> haperture_v = camNode['haperture'].toScript() >> vaperture_v = camNode['vaperture'].toScript() >> near_v = camNode['near'].toScript() >> far_v = camNode['far'].toScript() >> win_translate_v = camNode['win_translate'].toScript() >> win_scale_v = camNode['win_scale'].toScript() >> winroll_v = camNode['winroll'].toScript() >> focal_point_v = camNode['focal_point'].toScript() >> >> # Copy them over to new Camera >> n['focal'].fromScript(focal_v) >> n['haperture'].fromScript(haperture_v) >> n['vaperture'].fromScript(vaperture_v) >> n['near'].fromScript(near_v) >> n['far'].fromScript(far_v) >> n['win_translate'].fromScript(win_translate_v) >> n['win_scale'].fromScript(win_scale_v) >> n['winroll'].fromScript(winroll_v) >> n['focal_point'].fromScript(focal_point_v) >> >> first_frame_v = nuke.root()['first_frame'].value() >> last_frame_v = nuke.root()['last_frame'].value() >> >> scale_anim = n['scaling'].animations() >> rotate_anim = n['rotate'].animations() >> translate_anim = n['translate'].animations() >> >> for i in range(int(first_frame_v), int(last_frame_v+1)): >> >> k = axisNode['world_matrix'] >> k_time_aware = axisNode['world_matrix'].getValueAt(i) >> >> for y in range(k.height()): >> for x in range(k.width()): >> m[x+(y*k.width())] = k_time_aware[y + k.width()*x] >> >> transM =nuke.math.Matrix4(m) >> transM.translationOnly() >> rotM = nuke.math.Matrix4(m) >> rotM.rotationOnly() >> scaleM = nuke.math.Matrix4(m) >> scaleM.scaleOnly() >> >> scale = (scaleM.xAxis().x, scaleM.yAxis().y, scaleM.zAxis().z) >> >> rot = rotM.rotationsZXY() >> rotDegrees = ( math.degrees(rot[0]), math.degrees(rot[1]), >> math.degrees(rot[2]) ) >> >> trans = (transM[12], transM[13], transM[14]) >> >> for s in range(3): >> scale_anim[s].setKey(i, scale[s]) >> rotate_anim[s].setKey(i, rotDegrees[s]) >> translate_anim[s].setKey(i, trans[s]) >> >> >> >> On Mon, Nov 29, 2010 at 11:33 AM, Scott Willman <[email protected] >> <mailto:[email protected]>> wrote: >> >> Wow, Ivan, thank you! This should definately get me started :) >> >> Ivan Busquets wrote: >> >> What he said :) >> >> If you just want to use that within a gizmo/group, linking to >> the world_matrix of your input Axis/Camera should be enough to >> replicate all concatenated transforms. >> >> However, if you need to get back absolute values in terms of >> position/rotation/scale, you'll need to derive them yourself >> (with a little help from nuke.math) >> >> Here's an example if you just wanted to get the final >> concatenated position: >> >> ###################### >> import math >> >> def getAxisWPos(axisNode): >> >> k = axisNode['world_matrix'] >> m = nuke.math.Matrix4() >> >> for y in range(k.height()): >> for x in range(k.width()): >> m[x+(y*k.width())] = k.value(x,y) >> >> p = m.transform(nuke.math.Vector3(0,0,0)) >> return (p.x, p.y, p.z) >> >> worldPos = getAxisWPos(nuke.selectedNode()) >> ###################### >> >> Or, if you wanted to create a new Axis/Camera node and fill it >> with the concatenated translation, rotation and scale values, >> you could do something like this: (please note that this should >> account for everything except for skew transformations) >> >> ###################### >> def consolidateNodeTransforms(axisNode): >> >> k = axisNode['world_matrix'] >> m = nuke.math.Matrix4() >> >> nuke.selectAll() >> nuke.invertSelection() >> k = axisNode['world_matrix'] >> m = nuke.math.Matrix4() >> for y in range(k.height()): >> for x in range(k.width()): >> m[x+(y*k.width())] = k.value(x,y) >> >> transM =nuke.math.Matrix4(m) >> transM.translationOnly() >> rotM = nuke.math.Matrix4(m) >> rotM.rotationOnly() >> scaleM = nuke.math.Matrix4(m) >> scaleM.scaleOnly() >> scale = (scaleM.xAxis().x, scaleM.yAxis().y, >> scaleM.zAxis().z) >> rot = rotM.rotationsZXY() >> trans = (transM[12], transM[13], transM[14]) >> >> n = nuke.createNode(axisNode.Class()) >> n['scaling'].setValue(scale) >> n['rotate'].setValue((math.degrees(rot[0]), >> math.degrees(rot[1]), math.degrees(rot[2]))) >> n['translate'].setValue(trans) >> >> consolidateNodeTransforms(nuke.selectedNode()) >> ###################### >> >> >> Disclaimer: I just wrote those and have only done a couple of >> tests, so there's a good chance they may break (no exceptions >> handled, etc), but hopefully it'll get you on the right track. >> >> Hope that helps. >> >> Cheers, >> Ivan >> >> On Sun, Nov 28, 2010 at 3:20 PM, Frank Rueter >> <[email protected] <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]>>> >> >> wrote: >> >> that's what the world matrix knob is for (in 6.1) >> >> >> On Nov 29, 2010, at 12:12 PM, [email protected] >> <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]>> >> wrote: >> >> > I've got a camera that has an Axis node plugged in. The camera >> also has >> > transforms on it. Is there a way to get the resolved world-space >> > pos/rot/scale of the camera? >> > >> > Thanks guys >> > >> > >> > >> > >> > Cinesite (Europe) Ltd. Registered Office: HemelOne, Boundary >> Way, Hemel Hempstead, Herts, HP2 7YU Registered in Cardiff No. >> 2820389 VAT No. 630 5446 60 >> > _______________________________________________ >> > Nuke-python mailing list >> > [email protected] >> <mailto:[email protected]> >> <mailto:[email protected] >> <mailto:[email protected]>> >> >> > >> >> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python >> >> _______________________________________________ >> Nuke-python mailing list >> [email protected] >> <mailto:[email protected]> >> <mailto:[email protected] >> <mailto:[email protected]>> >> >> >> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python >> >> >> >> ------------------------------------------------------------------------ >> >> _______________________________________________ >> Nuke-python mailing list >> [email protected] >> <mailto:[email protected]> >> >> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python >> >> >> Cinesite (Europe) Ltd. Registered Office: HemelOne, Boundary Way, >> Hemel Hempstead, Herts, HP2 7YU Registered in Cardiff No. 2820389 >> VAT No. 630 5446 60 >> _______________________________________________ >> Nuke-python mailing list >> [email protected] >> <mailto:[email protected]> >> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python >> >> >> >> >> _______________________________________________ >> Nuke-python mailing list >> [email protected] >> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python >> > > -- > Sebastian Elsner - Pipeline TD - r i s e | fx > > t: +49 30 201 803 00 [email protected] > c: +49 175 336 5739 7548 www.risefx.com > > r i s e | fx GmbH > Schlesische Strasse 28, Aufgang B 10997 Berlin > Richard-Byrd-Strasse 12, 50829 Cologne > Geschaeftsfuehrer: Sven Pannicke, Robert Pinnow > Handelsregister Berlin HRB 106667 B > > _______________________________________________ > Nuke-python mailing list > [email protected] > http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python >
_______________________________________________ Nuke-python mailing list [email protected] http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
