Woohoo, thanks Ivan. I hadn't run across the outputContext before. That did the job.
thanks again On Wed, Jul 6, 2011 at 11:25 AM, Ivan Busquets <[email protected]>wrote: > And, just to clarify, you can also use nuke.OutputContext() in 6.1 too (and > even in 6.0). I got that mixed up with something else, I think > > > > On Wed, Jul 6, 2011 at 11:19 AM, Ivan Busquets <[email protected]>wrote: > >> 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 > >
_______________________________________________ Nuke-python mailing list [email protected], http://forums.thefoundry.co.uk/ http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
