vPlanarProjection v1.0


 
This location is for Registered Users Only.
Perhaps you need to login or register.
Contributor: Vit Sedlacek
Smart, better and faster Reconcile3D node.
Requirements:
6.3, 7.0 or later
Linux, Mac, Windows
10 Mar 2013
796

Simpy set up to 4 points in 3D and generate CornerPin (matchmove/stabilize) and/or its matrix, which can be then used in RotoPaint/SplineWarp/GridWarp nodes

 

This gizmo was initially developed as a tool for fixing drift in complex matchmove shots in post, rather than spending time to solve unsolvable shots, but during the time it served as a perfect tool for rotoscoping or cornerpining (instead of using 3d cards).

Workflow:

1) connect the camera

2) select the points in 3d viewport (you can use vertex selection mode, or move handles manually)

3) generate 2D projection points

4) generate matrix

5) use inbuild functions to generate Rotopaint/SplineWarp or GridWarp node, which is tracked with generated points

Please login in order to download these files.

Comments   

 
0 # Den Gheiko 2013-03-23 18:46
Pretty handy tool
Thank you for one

Doesn't work for Dot on input with just unpredictable message "incorrect frame range"
Got to enter inside to understand that.
Passing throw the Dots or just sendin correct message will help your users )

Thanks again/ Nice work
 
 
0 # Vit Sedlacek 2014-06-12 20:26
Hello Den,

thank you for feedback, I'll put that into warning, to make sure that camera is straight through

Best,
V.
 
 
+1 # Tom van Dop 2014-02-20 23:10
Hi Vit,

After moving to nuke 8, some things seem to have been broken.
I'm getting an incorrect frame range error (even with the cam directly plugged into the gizmo).

Also when i try to generate a matrix I get "integer argument expected, got float" error.

Any chance for an update?

We've been using this gizmo quite a lot.
Great stuff!

Cheers,

Tom
 
 
0 # Vit Sedlacek 2014-06-12 20:32
Hey Tom,

Next time I'll use it I'll check it out -- I'm not sure if it's within the notes, but make sure that camera has baked keayframes and it's accessible - there is a bug withinh Nuke - if you keep your "Read from file" on it tends to screw up cameras, my guess would be that it can relate. Haven't tested it with Nuke 8 yet, but had same problems with Nuke 7 ... And thanks for appreciation, who is we? ;) I'd be pretty curious to hear what you've used it for and how it helped, sped up workflow etc .... I've used it quite a lot on one project this year, saved heaps of time while doing some environment roto, however I may need to do some additional scripting - P pass support etc. to make all this stuff automated..

Cheers,
Vit
 
 
0 # Tom van Dop 2014-07-15 09:52
Hi Vit,

We used it quite a lot at Method studios in sydney on Mad Max Fury Road.
We were able to fix the error, and I've added this handy function so you can select the animation from mocha cornerpins.
This way you can easily put the mocha tracking data, on roto nodes or the warp nodes with the PlanProject.

You can check it out here:

set cut_paste_input [stack 0]
version 7.0 v8
push $cut_paste_input
Group {
name Planarprojectio n2
help "vPlanarProject ion STAGE2\n\nGener ates 2D coordinates for points in 3D space. Type in 3D point coordinates, or use vertex selection in 3D viewer and click set to pick average of selected points, or set points to set all four points at once. You can connect node output to scene together with your pointcloud or geometry and see where your points are located in 3d space. Double click any of them to move it in 3d space like any traditional nuke transform control.\n\nAft er you've generated 4 points you can generate matrix to be used as a transform in RotoPaint, SplineWarp and GridWarp nodes.\n\nAlso you can feed your own cornerpin data from your 2d track to generate matrix only.\n\nIf you are using matrix in GridWarp, points have to be in clockwise order, pick them one by one! Command set points doesn't respect selection order!\n\nCheck out the demo video on my website!\n\nKud os to Ivan Busquets for help with matrix math.\n\n--\nde veloped by Vit Sedlacek (c)2012\nwww.vi tsedlacek.com \n Modified by Ken Stewart @ Method Studios Sydney for NUKE 8"
tile_color 0xc1392c00
selected true
xpos -1181
ypos -106
addUserKnob {20 tab l vPlanarProjecti on}
addUserKnob {22 setAll l "set points" T "from nukescripts import snap3d as sn\n\ngen = None\npoints = None\ngen = sn.selectedPoin ts()\npoints = \[point for point in gen]\nif len(points) >= 4:\n for i in xrange(4):\n pName = \"point_%s\" % str(i+1)\n nuke.toNode(pNa me)\[\"translat e\"].setValue(p oints\)" +STARTLINE}
addUserKnob {22 generatecp l "generate cornerpin" -STARTLINE T "import math\n\ndef cameraProjectio nMatrix(cameraN ode,frame):\n ## modified code from nukescripts/Sna p3D\n\n # Matrix to transform points into camera-relative coords.\n wm = nuke.math.Matri x4()\n for i in xrange(16):\n wm\ = cameraNode\['ma trix'].getValue At(frame,i)\n \n wm.transpose()\ n camTransform = wm.inverse()\n\ n\n # Matrix to take the camera projection knobs into account\n roll = float(cameraNod e\['winroll'].g etValueAt(frame ,0))\n scale_x = float(cameraNod e\['win_scale'] .getValueAt(fra me,0))\n scale_y = float(cameraNod e\['win_scale'] .getValueAt(fra me,1))\n translate_x = float(cameraNod e\['win_transla te'].getValueAt (frame,0))\n translate_y = float(cameraNod e\['win_transla te'].getValueAt (frame,1))\n m = nuke.math.Matri x4()\n m.makeIdentity( )\n m.rotateZ(math. radians(roll))\ n m.scale(1.0 / scale_x, 1.0 / scale_y, 1.0)\n m.translate(-tr anslate_x, -translate_y, 0.0)\n\n # Projection matrix based on the focal length, aperture and clipping planes of the camera\n focal_length = float(cameraNod e\['focal'].get ValueAt(frame)) \n h_aperture = float(cameraNod e\['haperture'] .getValueAt(fra me))\n near = float(cameraNod e\['near'].getV alueAt(frame))\ n far = float(cameraNod e\['far'].getVa lueAt(frame))\n projection_mode = int(cameraNode\ ['projection_mo de'].getValueAt (frame))\n p = nuke.math.Matri x4()\n p.projection(fo cal_length / h_aperture, near, far, projection_mode == 0)\n\n # Matrix to translate the projected points into normalised pixel coords\n format = nuke.root()\['f ormat'].value() \n imageAspect = float(format.he ight()) / float(format.wi dth())\n t = nuke.math.Matri x4()\n t.makeIdentity( )\n t.translate( 1.0, 1.0 - (1.0 - imageAspect / float(format.pi xelAspect())), 0.0 )\n\n # Matrix to scale normalised pixel coords into actual pixel coords.\n x_scale = float(format.wi dth()) / 2.0\n y_scale = x_scale * format.pixelAsp ect()\n s = nuke.math.Matri x4()\n s.makeIdentity( )\n s.scale(x_scale , y_scale, 1.0)\n \n # The projection matrix transforms points into camera coords, modifies based\n # on the camera knob values, projects points into clip coords, translates the\n # clip coords so that they lie in the range 0,0 - 2,2 instead of -1,-1 - 1,1,\n # then scales the clip coords to proper pixel coords.\n return s * t * p * m * camTransform\n\ n\ndef projectPoints(f rame, camera=None, points=None):\n '''\n projectPoint(ca mera, points) -> list of nuke.math.Vecto r2\n \n Project the given 3D point through the camera to get 2D pixel coordinates.\n \n @param camera: The Camera node or name of the Camera node to use for projecting\n the point.\n @param points: A list or tuple of either nuke.math.Vecto r3 or of list/tuples of\n three float values representing the 3D points.\n @raise ValueError: If camera or point is invalid.\n '''\n \n camNode = None\n if isinstance(came ra, nuke.Node):\n camNode = camera\n elif isinstance(came ra, str):\n camNode = nuke.toNode(cam era)\n else:\n raise ValueError, \"Argument camera must be a node or the name of a node.\"\n\n camMatrix = cameraProjectio nMatrix(camNode , frame)\n if camMatrix == None:\n raise RuntimeError, \"snap3d.camera ProjectionMatri x() returned None for camera.\"\n \n if not ( isinstance(poin ts, list) or isinstance(poin ts, tuple) ):\n raise ValueError, \"Argument points must be a list or tuple.\"\n\n for point in points:\n # Would be nice to not do this for every item but since lists/tuples can\n # containg anything...\n if isinstance(poin t, nuke.math.Vecto r3):\n pt = point\n elif isinstance(poin t, list) or isinstance(poin t, tuple):\n pt = nuke.math.Vecto r3(point\[0], point\[1], point\[2])\n else:\n raise ValueError, \"All items in points must be nuke.math.Vecto r3 or list/tuple of 3 floats.\"\n\n tPos = camMatrix * nuke.math.Vecto r4(pt.x, pt.y, pt.z, 1.0)\n yield nuke.math.Vecto r2(tPos.x / tPos.w, tPos.y / tPos.w)\n\n#### ############### ############### ############### ############### ########\ncam = None\ntry:\n cam = nuke.thisNode() .input(0)\['nam e'].value()\nex cept:\n nuke.message(\" Camera is not connected\")\n\ nif cam:\n try:\n camAni = nuke.thisNode() .input(0)\n\n first = None\n last = None\n try:\n for every in camAni\['transl ate'].animation s():\n if first == None:\n first = every.keys()\[0 ].x\n else:\n first = min(first, every.keys()\[0 ].x)\n\n for every in camAni\['transl ate'].animation s():\n if last == None:\n last = every.keys()\[0 ].x\n else:\n last = max(last, every.keys()\[- 1].x)\n\n for every in camAni\['rotate '].animations() :\n if first == None:\n first = every.keys()\[0 ].x\n else:\n first = min(first, every.keys()\[0 ].x)\n\n for every in camAni\['rotate '].animations() :\n if last == None:\n last = every.keys()\[0 ].x\n else:\n last = max(last, every.keys()\[- 1].x)\n except:\n first = nuke.thisNode() .firstFrame()\n last = nuke.thisNode() .lastFrame()\n\ n##zjisti range\n r = nuke.getFramesA ndViews(\"Frame range\", str ( int(first) ) + '-' + str( int(last) ) )\n frames = None\n if r != None:\n r = nuke.FrameRange (r\[0])\n frames = \[frame for frame in r]\n\n if frames != None:\n pB = nuke.ProgressTask(\"vPlanarProject ion\")\n pB.setMessage(\ "Generating projection...\" )\n\n for frame in frames:\n gen = None\n gen = projectPoints(f rame,cam, ( \[nuke.toNode(\ "point_%s\" % str(n+1))\[\"tr anslate\"].valu e() for n in range(4)] ))\n if gen:\n for p in xrange(4):\n point = gen.next()\n pName = \"op%s\" % str(p+1)\n nuke.thisNode() \[pName].setAni mated()\n nuke.thisNode() \[pName].setVal ueAt(point\[0], frame,0)\n nuke.thisNode() \[pName].setVal ueAt(point\[1], frame,1)\n pB.setProgress( int(frame/(len( frames)/100)))\ n if pB.isCancelled( ):\n break\n del pB\n\n except:\n nuke.message(\" Incorrect frame range...\")\n import traceback\n traceback.print _exc()"}
addUserKnob {22 generatematrix l "generate matrix" -STARTLINE T "node = nuke.thisNode() \n\n\ndef pointsToMatrix( frame):\n\n cpToMtx = nuke.math.Matri x4()\n cpFromMtx = nuke.math.Matri x4()\n\n \n # Get a list of Vector2 objects for each of the 'to' knobs and each of the 'from' knobs.\n ToVectors = \[nuke.math.Vec tor2(node\[f].g etValueAt(frame ,0), node\[f].getVal ueAt(frame,1)) for f in sorted(node.kno bs().keys()) if f.startswith('o p')]\n\n # Feed all 4 coordinates into the mapUnitSquareTo Quad() function\n cpToMtx.mapUnit SquareToQuad(To Vectors\[0].x, ToVectors\[0].y , ToVectors\[1].x , ToVectors\[1].y , ToVectors\[2].x , ToVectors\[2].y , ToVectors\[3].x , ToVectors\[3].y )\n\n cpFromMtx.mapUn itSquareToQuad( 0, 0, node.width(), 0, node.width(), node.height(), 0, node.height())\ n\n transform_matri x = cpToMtx * cpFromMtx.inver se()\n\n # This is not needed to apply the transformation. The matrix is already correct. However, the matrix knob in rotopaint is indexed differently (row major), so I just transpose the matrix here to make it easier to copy its values to the knob\n transform_matri x.transpose()\n\n # Fill in the transform_matri x knob of the target node\n return transform_matri x\n\n#########################################################\n\nnode = nuke.thisNode() \n\nfirst = None\nlast = None\nfor op in \['op1','op2',' op3','op4']:\n for every in node\[op].anima tions():\n if first == None:\n first = every.keys()\[0 ].x\n else:\n first = min(first, every.keys()\[0 ].x)\n\n for every in node\[op].anima tions():\n if last == None:\n last = every.keys()\[0 ].x\n else:\n last = max(last, every.keys()\[- 1].x)\n\nfirst = int(first)\nlas t = int(last)\n\nif first != None and last != None:\n \n if (last-first)>1: \n frames = xrange(first,la st+1)\n pB = nuke.ProgressTask(\"vPlanarProject ion\")\n pB.setMessage(\ "Generating matrix...\")\n node\['matrix'] .clearAnimated( )\n node\['matrix'] .setAnimated()\ n for frame in frames:\n tM = pointsToMatrix( frame)\n for i in xrange(16):\n node\['matrix'] .setValueAt(tM\ ,frame,i)\n pB.setProgress( int(frame/(len( frames)/100)))\ n if pB.isCancelled( ):\n break\n del pB\n"}
addUserKnob {22 cl l "clear all" -STARTLINE T "def delAnimCurves(k nob):\n for chan in xrange(knob.arr aySize()):\n if knob.isAnimated ():\n knob.deleteAnim ation(knob.anim ation(chan))\n\ ndelAnimCurves( nuke.thisNode() \['op1'])\ndelA nimCurves(nuke. thisNode()\['op 2'])\ndelAnimCu rves(nuke.thisN ode()\['op3'])\ ndelAnimCurves( nuke.thisNode() \['op4'])\n\ntr y:\n delAnimCurves(n uke.thisNode()\ ['matrix'])\nex cept:\n pass"}
addUserKnob {26 inputtab l input}
addUserKnob {41 ip1 l "point 1" T point_1.transla te}
addUserKnob {22 set1 l set -STARTLINE T "from nukescripts import snap3d as sn\n\ngen = None\npoints = None\ngen = sn.selectedPoin ts()\npoints = \[point for point in gen]\nif len(points) > 0:\n x = 0\n y = 0\n z = 0\n\n for point in points:\n x+=point\[0]\n y+=point\[1]\n z+=point\[2]\n\ n x = float(x / len(points))\n y = float(y / len(points))\n z = float(z / len(points))\n\ n print x,y,z\n\n\n nuke.toNode(\"p oint_1\")\[\"tr anslate\"].setV alue(\[x,y,z])" }
addUserKnob {41 ip2 l "point 2" T point_2.transla te}
addUserKnob {22 set2 l set -STARTLINE T "from nukescripts import snap3d as sn\n\ngen = None\npoints = None\ngen = sn.selectedPoin ts()\npoints = \[point for point in gen]\nif len(points) > 0:\n x = 0\n y = 0\n z = 0\n\n for point in points:\n x+=point\[0]\n y+=point\[1]\n z+=point\[2]\n\ n x = float(x / len(points))\n y = float(y / len(points))\n z = float(z / len(points))\n\ n print x,y,z\n\n\n nuke.toNode(\"p oint_2\")\[\"tr anslate\"].setV alue(\[x,y,z])" }
addUserKnob {41 ip3 l "point 3" T point_3.transla te}
addUserKnob {22 set3 l set -STARTLINE T "from nukescripts import snap3d as sn\n\ngen = None\npoints = None\ngen = sn.selectedPoin ts()\npoints = \[point for point in gen]\nif len(points) > 0:\n x = 0\n y = 0\n z = 0\n\n for point in points:\n x+=point\[0]\n y+=point\[1]\n z+=point\[2]\n\ n x = float(x / len(points))\n y = float(y / len(points))\n z = float(z / len(points))\n\ n print x,y,z\n\n\n nuke.toNode(\"p oint_3\")\[\"tr anslate\"].setV alue(\[x,y,z])" }
addUserKnob {41 ip4 l "point 4" T point_4.transla te}
addUserKnob {22 set4 l set -STARTLINE T "from nukescripts import snap3d as sn\n\ngen = None\npoints = None\ngen = sn.selectedPoin ts()\npoints = \[point for point in gen]\nif len(points) > 0:\n x = 0\n y = 0\n z = 0\n\n for point in points:\n x+=point\[0]\n y+=point\[1]\n z+=point\[2]\n\ n x = float(x / len(points))\n y = float(y / len(points))\n z = float(z / len(points))\n\ n print x,y,z\n\n\n nuke.toNode(\"p oint_4\")\[\"tr anslate\"].setV alue(\[x,y,z])" }
addUserKnob {26 outputtab l output}
addUserKnob {12 op1 l "point 1"}
addUserKnob {12 op2 l "point 2"}
addUserKnob {12 op3 l "point 3"}
addUserKnob {12 op4 l "point 4"}
addUserKnob {41 matrix T dummyAxis.matri x}
addUserKnob {26 div2 l create}
addUserKnob {22 createRotoPaint l RotoPaint T "import nuke.rotopaint as rp\nimport _curvelib as cl\n\nnode = nuke.thisNode() \nmatrix = node\['matrix'] \n\nfirst = None\nfor every in matrix.animatio ns():\n if first == None:\n first = every.keys()\[0 ].x\n else:\n first = min(first, every.keys()\[0 ].x)\n\nlast = None\nfor every in matrix.animatio ns():\n if last == None:\n last = every.keys()\[0 ].x\n else:\n last = max(last, every.keys()\[- 1].x)\n\nif first != None and last != None:\n nuke.root().beg in()\n p = nuke.createNode (\"RotoPaint\") \n cKnob = p\['curves']\n nLayer = rp.Layer(cKnob) \n nLayer.name = node\['layer_na me'].value()\n\ n\n curve = \[cl.AnimCurve( ) for i in range(16)]\n\n for f in range(int(first ),int(last) + 1):\n val = matrix.valueAt( f)\n for i in range(16):\n curve\.addKey(i nt(f), val\)\n\n for y in range(1,5):\n for x in range(1,5):\n cell = ((y-1)*4)+x-1\n nLayer.getTrans form().setExtra MatrixAnimCurve (y-1,x-1, curve\[cell])\n \n cKnob.rootLayer .append(nLayer) " +STARTLINE}
addUserKnob {22 createSplineWar p l SplineWarp -STARTLINE T "import nuke.rotopaint as rp\nimport _splinewarp as sw\nimport _curvelib as cl\nimport _curveknob as ck\n\nnode = nuke.thisNode() \nmatrix = node\['matrix'] \n\nfirst = None\nfor every in matrix.animatio ns():\n if first == None:\n first = every.keys()\[0 ].x\n else:\n first = min(first, every.keys()\[0 ].x)\n\nlast = None\nfor every in matrix.animatio ns():\n if last == None:\n last = every.keys()\[0 ].x\n else:\n last = max(last, every.keys()\[- 1].x)\n\nif first != None and last != None:\n nuke.root().beg in()\n p = nuke.createNode (\"SplineWarp3\ ")\n p\['boundary_bb ox'].setValue(0 )\n cKnob = p\['curves']\n nLayer = ck.Layer(cKnob) \n nLayer.name = node\['layer_na me'].value()\n\ n curve = \[cl.AnimCurve( ) for i in range(16)]\n\n for f in range(int(first ),int(last) + 1):\n val = matrix.valueAt( f)\n for i in range(16):\n curve\.addKey(i nt(f), val\)\n\n for y in range(1,5):\n for x in range(1,5):\n cell = ((y-1)*4)+x-1\n nLayer.getTrans form().setExtra MatrixAnimCurve (y-1,x-1, curve\[cell])\n \n\n cKnob.rootLayer .append(nLayer) "}
addUserKnob {22 createGridWarp l GridWarp -STARTLINE T "vPPm = nuke.thisNode() \['matrix']\nif vPPm.isAnimated ():\n nuke.root().beg in()\n gW = nuke.createNode (\"GridWarp3\") \n gWm = gW\['source_grid_transform_matri x']\n gWm.copyAnimati ons(vPPm.animat ions())"}
addUserKnob {22 createCPinMatch Move l "CornerPin Matchmove" T "node = nuke.thisNode() \n\np1 = node\['op1']\np 2 = node\['op2']\np 3 = node\['op3']\np 4 = node\['op4']\n\ nif p1.isAnimated() or p2.isAnimated() or p3.isAnimated() or p4.isAnimated() :\n nuke.root().beg in()\n cP = nuke.createNode (\"CornerPin2D\ ")\n cP\['label'].se tValue(\"frame %d\\nmatchmove\ " % nuke.frame())\n cP\['to1'].copy Animations(p1.a nimations())\n cP\['to2'].copy Animations(p2.a nimations())\n cP\['to3'].copy Animations(p3.a nimations())\n cP\['to4'].copy Animations(p4.a nimations())\n cP\['from1'].se tValue(p1.value ())\n cP\['from2'].se tValue(p2.value ())\n cP\['from3'].se tValue(p3.value ())\n cP\['from4'].se tValue(p4.value ())" +STARTLINE}
addUserKnob {22 createCPinStab l "CornerPin Stabilize" -STARTLINE T "node = nuke.thisNode() \n\np1 = node\['op1']\np 2 = node\['op2']\np 3 = node\['op3']\np 4 = node\['op4']\n\ nif p1.isAnimated() or p2.isAnimated() or p3.isAnimated() or p4.isAnimated() :\n nuke.root().beg in()\n cP = nuke.createNode (\"CornerPin2D\ ")\n cP\['label'].se tValue(\"frame %d\\nstabilize\ " % nuke.frame())\n cP\['from1'].co pyAnimations(p1 .animations())\ n cP\['from2'].co pyAnimations(p2 .animations())\ n cP\['from3'].co pyAnimations(p3 .animations())\ n cP\['from4'].co pyAnimations(p4 .animations())\ n cP\['to1'].setV alue(p1.value() )\n cP\['to2'].setV alue(p2.value() )\n cP\['to3'].setV alue(p3.value() )\n cP\['to4'].setV alue(p4.value() )"}
addUserKnob {22 grabCPinAnim l "Select CornerPin (Mocha) Track..." T "cPinNames = \[n.name() for n in nuke.allNodes(\ "CornerPin2D\", nuke.root())]\n p = nuke.Panel(\"Se lect Corner-Pin Node...\")\np.a ddEnumerationPu lldown(\"Node:\ ", \" \".join(cPinNam es))\nresult = p.show()\n\nif result:\n\tcPin = nuke.toNode(p.v alue(\"Node:\") )\n\ttn = nuke.thisNode() \n\tfor counter in range(1,5):\n\t \tfor index in range(2):\n\t\t \ttn\['op%d' % counter].clearA nimated(index)\ n\t\t\tif cPin\['to%d' % counter].isAnim ated(index):\n\ t\t\t\ttn\['op% d' % counter].copyAn imation(index, cPin\['to%d' % counter].animat ion(index))\n\t \t\telse:\n\t\t \t\ttn\['op%d' % counter].setVal ue(cPin\['to%d' % counter].value( index), index)" +STARTLINE}
addUserKnob {26 ""}
addUserKnob {1 layer_name l "layer name"}
addUserKnob {22 add l "add layer to selected RotoPaint/Splin ewarp nodes" T "for cNode in nuke.root().sel ectedNodes():\n \n if cNode != None:\n if cNode.Class() == \"SplineWarp3\" or cNode.Class() ==\"RotoPaint\" :\n cKnob = cNode\['curves' ]\n if cNode.Class() ==\"RotoPaint\" :\n nLayer = rp.Layer(cKnob) \n else:\n nLayer = ck.Layer(cKnob) \n\n nLayer.name = node\['layer_na me'].value()\n\ n\n for y in range(1,5):\n for x in range(1,5):\n cell = ((y-1)*4)+x-1\n nLayer.getTrans form().setExtra MatrixAnimCurve (y-1,x-1, curve\[cell])\n \n cKnob.rootLayer .append(nLayer) " +STARTLINE}
addUserKnob {26 ""}
addUserKnob {26 desc l "" +STARTLINE T "developed by Vit Sedlacek (c)2012 \nwww.vitsedlacek.com"}
}
Axis2 {
inputs 0
useMatrix true
name dummyAxis
xpos 93
ypos -117
disable true
}
Input {
inputs 0
name cam
label cam
xpos 373
ypos -181
}
Axis2 {
inputs 0
name point_4
selected true
xpos 300
ypos -270
}
Axis2 {
inputs 0
name point_3
selected true
xpos 216
ypos -265
}
Axis2 {
inputs 0
name point_2
xpos 87
ypos -266
}
Axis2 {
inputs 0
name point_1
selected true
xpos -30
ypos -271
}
Scene {
inputs 5
name Scene1
xpos 300
ypos -99
}
Output {
name Output1
xpos 194
ypos -3
}
end_group
 
 
0 # Vit Sedlacek 2014-07-15 10:09
Hi Tom!

great to hear, hope it's been helpful and thanks for the fixes, i'll have look into it ... production i've been on were all nuke 7 so far, but i was already having some strange problems with frameranges etc. ... It's time for update, I hope I'll find time to that soon!
 
 
0 # Gonzalo san 2015-01-21 12:25
Hi Vit,

I have been using for a long time and I really like it!, but since I have move to Nuke 8 I 'm having error like: "integer argument expected, got float".
Any chance to update this gizmo to Nuke 8 or above.
Thank you very much for share it.
Gonzalo
 
 
0 # Tom van Dop 2015-01-21 12:32
Check my comment above for a fix.
Cheers,

Tom
 
 
+9 # Jed Smith 2015-02-10 15:02
If you guys are interested, I re-wrote this plugin to be more efficient and fix some bugs.

It now calculates pretty much instantaneously , and should work fine with Nuke 8 and 9.

Check it out here
https://gist.github.com/jedypod/98dc18acd8008e7e5cbe
 
 
0 # David McDonnell 2018-10-26 03:33
This is my new favourite tool. I've been trying to find a way to steal my 3D tracked data and put it into a planar roto node and this totally makes it happen.
 
 
+1 # Galen Caulfield 2021-11-27 17:44
Hi Jed, love this iteration of the tool and have used it for years. Curious, have you tried it in Nuke 13? Getting an error "invalid syntax (, line 93)" that I can't seem to shake.
 
 
+3 # Galen Caulfield 2021-11-27 17:45
" (< string > , line 93 "
 
 
+1 # Enrico Guarischi 2023-04-15 17:34
The author updated the tool , it is working on nuke 14.
 
 
0 # Yaroslav Zvikov 2022-08-29 12:21
Hi, Vit. In calculation, the parameters of "window translate" are taken into account? I have strange drift by cornerpin while projection on card is totaly okey.
 

You have no rights to post comments

We have 2003 guests and 48 members online