If you're using a version before 6.2, you can do the "CurveTool" trick to
force evaluation at each step of your loop:
######################
c = nuke.nodes.CurveTool()
for frame in range(firstframe, lastframe):
nuke.execute(c, frame, frame)
camMatrix = nukescripts.snap3d.cameraProjectionMatrix(cameranode)
print frame, camMatrix
nuke.delete(c)
######################
If you're on 6.2 or above, you could write your version of
nukescripts.snap3d.cameraProjectionMatrix(), as you were already trying to
do, and use an OutputContext object to feed into the value() method of the
camera's transform knob, which I suppose is the only knob you're having
trouble with.
Here's a basic version of the function that will take a frame number as an
argument, but you could expand it to include a "view" argument too.
###############################################################
# Note: this is mostly the same function provided by The Foundry
#
# in nukescripts.snap3d.cameraProjectionMatrix(), with
only #
# a few modifications to accept a "frame"
argument #
##############################################################
def cameraProjectionMatrixAt(cameraNode, frame):
'''Calculate the projection matrix for the camera, based on it's knob
values.'''
# Matrix to transform points into camera-relative coords.
ctx = nuke.OutputContext()
ctx.setFrame(frame)
camTransform = cameraNode['transform'].value(ctx).inverse()
# Matrix to take the camera projection knobs into account
roll = float(cameraNode['winroll'].getValueAt(frame))
scale_x, scale_y = [float(v) for v in
cameraNode['win_scale'].getValueAt(frame)]
translate_x, translate_y = [float(v) for v in
cameraNode['win_translate'].getValueAt(frame)]
m = _nukemath.Matrix4()
m.makeIdentity()
m.rotateZ(math.radians(roll))
m.scale(1.0 / scale_x, 1.0 / scale_y, 1.0)
m.translate(-translate_x, -translate_y, 0.0)
# Projection matrix based on the focal length, aperture and clipping
planes of the camera
focal_length = float(cameraNode['focal'].getValueAt(frame))
h_aperture = float(cameraNode['haperture'].getValueAt(frame))
near = float(cameraNode['near'].getValueAt(frame))
far = float(cameraNode['far'].getValueAt(frame))
projection_mode = int(cameraNode['projection_mode'].getValueAt(frame))
p = _nukemath.Matrix4()
p.projection(focal_length / h_aperture, near, far, projection_mode == 0)
# Matrix to translate the projected points into normalised pixel coords
format = nuke.root()['format'].value()
imageAspect = float(format.height()) / float(format.width())
t = _nukemath.Matrix4()
t.makeIdentity()
t.translate( 1.0, 1.0 - (1.0 - imageAspect / float(format.pixelAspect())),
0.0 )
# Matrix to scale normalised pixel coords into actual pixel coords.
x_scale = float(format.width()) / 2.0
y_scale = x_scale * format.pixelAspect()
s = _nukemath.Matrix4()
s.makeIdentity()
s.scale(x_scale, y_scale, 1.0)
# The projection matrix transforms points into camera coords, modifies
based
# on the camera knob values, projects points into clip coords, translates
the
# clip coords so that they lie in the range 0,0 - 2,2 instead of -1,-1 -
1,1,
# then scales the clip coords to proper pixel coords.
return s * t * p * m * camTransform
##################################################################
Hope that helps.
Cheers,
Ivan
On Wed, Jul 6, 2011 at 10:19 AM, Brogan Ross <[email protected]> wrote:
> Hello everyone,
> I'm trying to run cameraProjectionMatrix for every frame, but I'm
> having some issues with nuke.frame() updating. It's odd, it will iterate
> through each frame but cameraProjectionMatrix only gets the value for the
> frame you are on when you start the function. I tried
> rewriting cameraProjectionMatrix so it uses getValueAt() instead of just
> getValue(). But the key value seems to be the Camera's transform inverted,
> and if you try getValueAt on that one it changes the output to a float
> equaling 0.0, when it's suppose to give you a Matrix4.
> Anyone ever run into this before? Any ideas on how to get
> cameraProjectionMatrix to run on every frame?
>
>
> for frame in range(firstframe, lastframe):
> nuke.frame(frame)
> camMatrix = nukescripts.snap3d.cameraProjectionMatrix(cameranode)
> print frame, camMatrix
>
> _______________________________________________
> Nuke-python mailing list
> [email protected], http://forums.thefoundry.co.uk/
> http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
>
>
_______________________________________________
Nuke-python mailing list
[email protected], http://forums.thefoundry.co.uk/
http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python