looks like I got confused  on my side. I realised I don't need a lookAt vector 
but a position in space that the camera is "looking at".

a friend helped out and gave me this:

            camMatrix = getWorldMatrix( camNode ) #USING IVANS FUNCTION

            #POSITION
            camPos = camMatrix.transform( nuke.math.Vector3(0,0,0) )

            #UP VECTOR
            upVect = camMatrix.yAxis()

            #LOOK AT POSITION
            lookAt = nuke.math.Vector3( camMatrix[8], camMatrix[9], 
camMatrix[10] )
            lookAt.negate()
            lookAt += camVect


This seems to work like a charm. I do wonder if there is a more elegant way to 
get the initial lookAt though without slicing?

Cheers,
frank


On Mar 8, 2011, at 12:45 PM, Frank Rueter wrote:

> hm, I'm having trouble getting the right lookAt vector.
> this is what I'm doing:
> 
> def getWorldMatrix( node ):
>       m = nuke.math.Matrix4()
>       for i in range(0,16):
>               m[i] = node['world_matrix'].value(i%4, i/4)
>       return m
> 
> camNode = nuke.createNode( 'Camera2' )
> camNode['translate'].setValue( (1,2,3) )
> camMatrix = getWorldMatrix( camNode )
> worldLookAt = nuke.math.Vector3(0,0,-1)
> localLookAt = camMatrix.vtransform( worldLookAt )
> localLookAt = camMatrix.vtransform( worldLookAt )
> print localLookAt
> 
> 
> 
> 
> 
> The result for the lookAt vector stays at { 0,0,-1} even though the camera's 
> position is {1,2,3}.
> What am I missing?
> 
> Cheers,
> frank
> 
> 
> 
> 
> On Mar 7, 2011, at 3:42 PM, Ivan Busquets wrote:
> 
>> Hallo, Frank.
>> Despite writing that tutorial, I am by no means an expert in matrix and 
>> maths. :)
>> 
>> But I've learnt a thing or two about how they apply to things like camera 
>> transforms, etc., so hopefully I'll be able to help with this one.
>> 
>> I think the easiest in your case (easiest to code, not necessarily to 
>> understand :p) is to start with the camera's transformation matrix instead 
>> of the Euler rotations. If you want to use Euler angles as a starting point, 
>> then you'll need to check for rotation order and such.
>> 
>> To get the camera's transformation matrix, i usually do one on the following:
>> 
>> - If your camera doesn't have any other Cameras or Axis driving its final 
>> transformation, you can simply do:
>> 
>> cam_transform = nuke.toNode('camera_name')['transform'].value()
>> 
>> - If you're interested in getting the final transformation matrix of a 
>> concatenated set of transforms, I usually use the following to wrap the 
>> contents of the 'world_matrix' knob into a nuke.math.Matrix4 object:
>> 
>> #########
>> def getCameraTransformMatrix(cameraNode):
>> m = nuke.math.Matrix4()
>> try:
>> for i in range(0,16):
>> m[i] = cameraNode['world_matrix'].value(i%4, i/4)
>> except:
>> print "couldn't get all values for a 4x4 Matrix. Identity matrix returned 
>> instead"
>> m.makeIdentity()
>>     return m
>> ##############
>> 
>> 
>> Finally, once you have your transformation matrix in a nuke.math.Matrix4 
>> object, getting the lookAt and the Up vectors should be a matter of setting 
>> the initial direction of those two vectors, and then transform them using 
>> the matrix.
>> 
>> I.E.
>> 
>> # For a single, non concatenated camera. Otherwise use the helper funcion 
>> above.
>> cam_matrix = nuke.toNode('camera_name')['transform'].value() 
>> 
>> # set up initial lookAt vector
>> lookAt = nuke.math.Vector3(0,0,-1) # because Nuke's default cam looks at -Z
>> 
>> # Initial up vector
>> up = nuke.math.Vector3(0,1,0)
>> 
>> #Final lookAt vector
>> lookAt = cam_matrix.vtransform(lookAt)
>> 
>> #Final up vector
>> up = cam_matrix.vtransform(up)
>> 
>> # Note that the key here is to use the "vtransform" method instead of 
>> "transform", since you want to apply the transformation to a direction 
>> vector, but ignore any scaling or translation.
>> 
>> I think this should get you the right values to go from a Nuke camera to, 
>> say, a Camera + Aim + Up in Maya (don't have Maya here to check, though).
>> 
>> Hope that helps!
>> 
>> Cheers,
>> Ivan
>> 
>> 
>> On Sun, Mar 6, 2011 at 3:06 PM, Frank Rueter <[email protected]> wrote:
>> Hola,
>> 
>> has anybody converted a nuke camera (Euler rotations) to LookAt and Up 
>> vectors? as used by some other applications
>> I am just starting to read Ivan's tutorial on Nukepedia hoping it will shed 
>> some light on this for somebody with very limited understanding of 3D 
>> rotational maths (aka "me") but thought I'd spread my feelers in here at the 
>> same time.
>> 
>> Cheers,
>> frank_______________________________________________
>> 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
> 
> _______________________________________________
> 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

Reply via email to