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

Reply via email to