#and here is the script in case anyone is interested :)
import nuke
def getTheCornerpinAsMatrix():
    projectionMatrixTo = nuke.math.Matrix4()
    projectionMatrixFrom = nuke.math.Matrix4()

    #dir(projectionMatrix)
    theCornerpinNode = nuke.selectedNode()
    imageWidth = float(theCornerpinNode.width())
    imageHeight = float(theCornerpinNode.height())


    to1x = theCornerpinNode['to1'].value()[0]
    to1y = theCornerpinNode['to1'].value()[1]
    to2x = theCornerpinNode['to2'].value()[0]
    to2y = theCornerpinNode['to2'].value()[1]
    to3x = theCornerpinNode['to3'].value()[0]
    to3y = theCornerpinNode['to3'].value()[1]
    to4x = theCornerpinNode['to4'].value()[0]
    to4y = theCornerpinNode['to4'].value()[1]

    from1x = theCornerpinNode['from1'].value()[0]
    from1y = theCornerpinNode['from1'].value()[1]
    from2x = theCornerpinNode['from2'].value()[0]
    from2y = theCornerpinNode['from2'].value()[1]
    from3x = theCornerpinNode['from3'].value()[0]
    from3y = theCornerpinNode['from3'].value()[1]
    from4x = theCornerpinNode['from4'].value()[0]
    from4y = theCornerpinNode['from4'].value()[1]



projectionMatrixTo.mapUnitSquareToQuad(to1x,to1y,to2x,to2y,to3x,to3y,to4x,to4y)

projectionMatrixFrom.mapUnitSquareToQuad(from1x,from1y,from2x,from2y,from3x,from3y,from4x,from4y)

    theCornerpinAsMatrix =
projectionMatrixTo*projectionMatrixFrom.inverse()
    theCornerpinAsMatrix.transpose()

    return theCornerpinAsMatrix

On Tue, Aug 23, 2011 at 11:42 AM, Pete O'Connell <[email protected]>wrote:

> Thanks very much Ivan. It works after transposing!
>
> Cheers
> Pete
>
>
> On Tue, Aug 23, 2011 at 11:34 AM, Ivan Busquets <[email protected]>wrote:
>
>> Hi Pete,
>>
>> Sorry I forgot to send that example as reference, but what you have so far
>> is good.
>>
>> I think there's just a couple of things you should need to change to get
>> this working.
>>
>> 1- Don't normalize the "from" and "to" coordinates. The matrices you're
>> building need to map from the "to" corners to a unit square, and then from a
>> unit square to your from coordinates, using absolute values.
>> So just do:
>>
>> to1x = theCornerpinNode['to1'].value()[0]
>> etc...
>>
>> 2- By the time you fill the "theCornerpinAsMatrix" object, you should have
>> the correct transformation matrix already, but in column-major order.
>> Unfortunately, values in matrix knobs seem to be returned (or set when using
>> setValue) in row-major order, so you would either need to fill in the matrix
>> knob in a loop mirroring the cell values, or, what I usually do is transpose
>> the matrix before filling in the knob.
>>
>> So, in your script, after this line:
>>
>> theCornerpinAsMatrix = projectionMatrixTo * projectionMatrixFrom.inverse()
>>
>> You can just do:
>>
>> theCornerpinAsMatrix.transpose()
>>
>> And then continue as you were.
>>
>> See if that helps.
>>
>> Cheers,
>> Ivan
>>
>>
>>
>> On Mon, Aug 22, 2011 at 6:37 PM, Pete O'Connell 
>> <[email protected]>wrote:
>>
>>> #OK I think I'm getting close. I tried Ivan's instructions but I think I
>>> missed something. It looks really close though. Anyone care to take a look
>>> at what I have so far?
>>>
>>> ##############################################################################################################################
>>> projectionMatrixTo = nuke.math.Matrix4()
>>> projectionMatrixFrom = nuke.math.Matrix4()
>>>
>>> #dir(projectionMatrix)
>>> theCornerpinNode = nuke.toNode("CornerPin2D1")
>>> imageWidth = float(theCornerpinNode.width())
>>> imageHeight = float(theCornerpinNode.height())
>>>
>>> #normalized to and from coordinates
>>> to1x = theCornerpinNode['to1'].value()[0]/imageWidth
>>> to1y = theCornerpinNode['to1'].value()[1]/imageHeight
>>> to2x = theCornerpinNode['to2'].value()[0]/imageWidth
>>> to2y = theCornerpinNode['to2'].value()[1]/imageHeight
>>> to3x = theCornerpinNode['to3'].value()[0]/imageWidth
>>> to3y = theCornerpinNode['to3'].value()[1]/imageHeight
>>> to4x = theCornerpinNode['to4'].value()[0]/imageWidth
>>> to4y = theCornerpinNode['to4'].value()[1]/imageHeight
>>>
>>> from1x = theCornerpinNode['from1'].value()[0]/imageWidth
>>> from1y = theCornerpinNode['from1'].value()[1]/imageHeight
>>> from2x = theCornerpinNode['from2'].value()[0]/imageWidth
>>> from2y = theCornerpinNode['from2'].value()[1]/imageHeight
>>> from3x = theCornerpinNode['from3'].value()[0]/imageWidth
>>> from3y = theCornerpinNode['from3'].value()[1]/imageHeight
>>> from4x = theCornerpinNode['from4'].value()[0]/imageWidth
>>> from4y = theCornerpinNode['from4'].value()[1]/imageHeight
>>>
>>>
>>>
>>> projectionMatrixTo.mapUnitSquareToQuad(to1x,to1y,to2x,to2y,to3x,to3y,to4x,to4y)
>>>
>>> projectionMatrixFrom.mapUnitSquareToQuad(from1x,from1y,from2x,from2y,from3x,from3y,from4x,from4y)
>>>
>>> theCornerpinAsMatrix = projectionMatrixTo*projectionMatrixFrom.inverse()
>>>
>>> theNewCornerpinNode = nuke.toNode("CornerPin2D2")
>>> theNewCornerpinNode['transform_matrix'].setValue(theCornerpinAsMatrix)
>>>
>>>
>>> ############################################################################################################################
>>> #Thanks
>>> #Pete
>>>
>>>
>>> On Tue, Aug 23, 2011 at 10:14 AM, Pete O'Connell <
>>> [email protected]> wrote:
>>>
>>>> Hi Michael. I had a look at the planar tracker but as far as I can tell,
>>>> that node creates a cornerpin based on the matrix that it calculates, but 
>>>> as
>>>> far as I can see there is no way in that you can feed the planar tracker
>>>> cornerpin data and have it calculate the corresponding Matrix. I think
>>>> nuke.math.Matrix4 is the way.
>>>>
>>>> Pete
>>>>
>>>>
>>>> On Tue, Aug 23, 2011 at 3:30 AM, Michael Garrett <[email protected]
>>>> > wrote:
>>>>
>>>>> I haven't got 6.3 in front of me but does the PlanarTracker add
>>>>> anything into the mix to make this easier?  I seem to remember it outputs 
>>>>> a
>>>>> 4*4 matrix for the planar track which is essentially a corner pin but I'll
>>>>> admit I need to look more closely at it.
>>>>>
>>>>>
>>>>> On 21 August 2011 23:40, Pete O'Connell <[email protected]>wrote:
>>>>>
>>>>>> Thanks a lot Ivan. I'll have a play around with that tonight.
>>>>>>
>>>>>> Cheers
>>>>>> Pete
>>>>>>
>>>>>>
>>>>>> On Mon, Aug 22, 2011 at 3:57 PM, Ivan Busquets <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Pete,
>>>>>>>
>>>>>>> It's very possible, but probably easier to do it in Python than using
>>>>>>> expression-links. Have a look at the nuke.math.Matrix4 class, and its
>>>>>>> mapUnitSquareToQuad() method.
>>>>>>>
>>>>>>> I have a function somewhere to feed the transformation of a CornerPin
>>>>>>> node into the "matrix" knob of a roto/rotopaint node that would
>>>>>>> probably fit the bill for this too. I can try to dig that up if
>>>>>>> you're
>>>>>>> interested, but it would roughly consist of the following steps:
>>>>>>>
>>>>>>> 1 - Get the coordinates of the 4 "TO" corners from your cornerpin
>>>>>>> node.
>>>>>>> 2 - Build a "TO" matrix using mapUnitSquareToQuad(to0.x, to0.y,
>>>>>>> to1.x,
>>>>>>> to1.y, ...)
>>>>>>> 3 - Get the coordinates of the 4 "FROM" corners from your cornerpin
>>>>>>> node.
>>>>>>> 4 - Build a "FROM" matrix using mapUnitSquareToQuad(from0.x, from0.y,
>>>>>>> from1.x, from1.y, ...)
>>>>>>> 5 - The final transformation matrix should be =>  to_matrix *
>>>>>>> from_matrix.inverse().
>>>>>>>
>>>>>>> Then you can use that to fill in the matrix knob in a gridwarp, a
>>>>>>> roto
>>>>>>> node, etc.
>>>>>>>
>>>>>>> Not the best example, but if you want some more info on how to use
>>>>>>> nuke.math.Matrix4.mapUnitSquareToQuad(), have a look here (towards
>>>>>>> the
>>>>>>> end of the page).
>>>>>>>
>>>>>>>
>>>>>>> http://www.nukepedia.com/written-tutorials/using-the-nukemath-python-module-to-do-vector-and-matrix-operations/page-4/
>>>>>>>
>>>>>>> Hope that helps.
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Ivan
>>>>>>>
>>>>>>> On Sun, Aug 21, 2011 at 10:24 PM, Pete O'Connell
>>>>>>> <[email protected]> wrote:
>>>>>>> > Hi does anyone know if it is possible somehow to convert cornerpin
>>>>>>> values to
>>>>>>> > a 4 by 4 matrix? Seem like it would be useful for the new Gridwarp
>>>>>>> and
>>>>>>> > Splinewarp nodes.
>>>>>>> > Thanks
>>>>>>> > Pete
>>>>>>> >
>>>>>>> >
>>>>>>> > _______________________________________________
>>>>>>> > Nuke-users mailing list
>>>>>>> > [email protected],
>>>>>>> http://forums.thefoundry.co.uk/
>>>>>>> >
>>>>>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>>>>>> >
>>>>>>> _______________________________________________
>>>>>>> Nuke-users mailing list
>>>>>>> [email protected], http://forums.thefoundry.co.uk/
>>>>>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Pete
>>>>>>
>>>>>> _______________________________________________
>>>>>> Nuke-users mailing list
>>>>>> [email protected], http://forums.thefoundry.co.uk/
>>>>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Nuke-users mailing list
>>>>> [email protected], http://forums.thefoundry.co.uk/
>>>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Pete
>>>>
>>>
>>>
>>>
>>> --
>>> Pete
>>>
>>> _______________________________________________
>>> Nuke-users mailing list
>>> [email protected], http://forums.thefoundry.co.uk/
>>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>>
>>
>>
>> _______________________________________________
>> Nuke-users mailing list
>> [email protected], http://forums.thefoundry.co.uk/
>> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users
>>
>
>
>
> --
> Pete
>



-- 
Pete
_______________________________________________
Nuke-users mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-users

Reply via email to