Texturing with Project3D? Why not.
One of the handy feature of the Project3D node in Nuke is that we can quickly texture a geometry in Nuke through the use of camera projection.
Sounds familiar? I already covered this technique in depth in a prior post about Camera Projection.
Although this post focus on how we can use it for quick texture work if you don’t want to do another round trip with you preferred 3D authoring software.
Processing the texturing
First of all, you need to know the limitation of this technique as it is a quick way to get something textured by using the camera node to align the texture of your choice onto the 3D model.
Problem here is that precision is is rather difficult and I still recommend to unwrap it externally in software like 3dsmax, Modo, Maya, etc.
- Obviously you need to pipe in both the texture and camera into the Project3D node.
- Then connect the Project3D node into the geometry node that you want it to be textured.
- From there, align the camera to your best effort in getting the model textured properly.
You can also merge multiple textures and cameras onto a single geometry. To accomplish this, you need to make sure to use the MergeMat aka Merge Materials node to combine it into a single material which you can pipe it into the geometry node.
Also do take note the settings for Project On in the Project3D node. The viewer is buggy when you need to view your projected texture in 3D view (or maybe due to unforeseen limitations). For example, it will still show the back of the projected texture when you set it Front (see header image for the black smiley face). Rest assure it will appear correctly when you hook it up to the Scanline Render and view it from there.
Here’s a sample script for you to play in Nuke
Hey it’s been awhile since I last put up a sample script. Copy and paste the following script into Nuke (preferably version 8 and newer to ensure maximum compatibility) and play around with the settings to see how I set it up.
set cut_paste_input [stack 0] version 9.0 v3 Camera2 { inputs 0 translate {{curve i x1 -1.934648156 x100 1.985827923 s0.1030000001} {curve i x1 0.06884080172 x100 0.06883656979} {curve i x1 2.77421546 x100 4.035419464 s-0.00680000009 t0}} rotate {{curve i x1 0 x100 0} {curve x1 -33.95877506 x100 26.14262772 s1.379999995 t0} {curve i x1 0 x100 0}} name CameraMAIN selected true xpos -138 ypos 600 } Camera2 { inputs 0 translate {2.381999969 0 0.05499989167} rotate {0 90 0} focal 61.5 name Camera4 selected true xpos -420 ypos 357 } ColorWheel { inputs 0 gamma 0.45 name ColorWheel1 selected true xpos -284 ypos 225 } Roto { output alpha curves {{{v x3f99999a} {f 0} {n {layer Root {f 0} {t x44800000 x44428000} {a pt1x 0 pt1y 0 pt2x 0 pt2y 0 pt3x 0 pt3y 0 pt4x 0 pt4y 0 ptex00 0 ptex01 0 ptex02 0 ptex03 0 ptex10 0 ptex11 0 ptex12 0 ptex13 0 ptex20 0 ptex21 0 ptex22 0 ptex23 0 ptex30 0 ptex31 0 ptex32 0 ptex33 0 ptof1x 0 ptof1y 0 ptof2x 0 ptof2y 0 ptof3x 0 ptof3y 0 ptof4x 0 ptof4y 0 pterr 0 ptrefset 0 ptmot x40800000 ptref 0} {curvegroup Bezier1 512 bezier {{cc {f 8192} {px x42ca0000 {x42840000 xc3140000} {x43faa319 x441d2e74} {x436ab9ce xc35ab9d0} {xc3660000 xc2100000} {x44808000 x43c90000} {x43660000 x42100000} {xc2400000 xc2dc0000} {x44b50000 x44338000} {xc2e80000 xc3ca0000} {x42d88560 x40d37e40} {x4473fdf4 x43662954} {xc367f7d0 xc1629540}}} idem} {tx x42ca0000 x447b6000 x43fd8000} {a osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 ltn x42ca0000 ltm x42ca0000 tt x40800000 a 0}} {curvegroup Ellipse2 512 bezier {{cc {f 8192} {px x42ca0000 {xc251de40 0} {x449ee000 x44508000} {x4251de40 0} {0 xc2f88730} {x44aac000 x44846000} {0 x42f88730} {x4251de40 0} {x449ee000 x44a08000} {xc251de40 0} {0 x42f88730} {x44930000 x44846000} {0 xc2f88730}}} {cc {f 8192} {p {{{x42ca0000 xc251de40}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 x4251de40}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 xc2f88730}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 x42f88730}}} {{{x42ca0000 x4251de40}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 xc251de40}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 x42f88730}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 xc2f88730}}}}}} {tx x42ca0000 x449ee000 x44846000} {a a 0 osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 ltn x42ca0000 ltm x42ca0000 tt x40e00000}} {curvegroup Ellipse1 512 bezier {{cc {f 8192} {px x42ca0000 {xc246d290 0} {x443a0000 x444c0000} {x4246d290 0} {0 xc2efb108} {x44508000 x44812000} {0 x42efb110} {x4246d290 0} {x443a0000 x449c4000} {xc246d290 0} {0 x42efb110} {x44238000 x44812000} {0 xc2efb108}}} {cc {f 8192} {p {{{x42ca0000 xc246d290}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 x4246d290}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 xc2efb108}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 x42efb110}}} {{{x42ca0000 x4246d290}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 xc246d290}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 x42efb110}}} {{{x42ca0000 0}} {{x42ca0000 0}}} {{{x42ca0000 0}} {{x42ca0000 xc2efb108}}}}}} {tx x42ca0000 x443a0000 x44812000} {a a 0 osw x41200000 osf 0 str 1 spx x44800000 spy x44428000 sb 1 ltn x42ca0000 ltm x42ca0000 tt x40e00000}}}}}} toolbox {selectAll { { selectAll str 1 ssx 1 ssy 1 sf 1 } { createBezier str 1 ssx 1 ssy 1 sf 1 sb 1 tt 4 } { createBezierCusped str 1 ssx 1 ssy 1 sf 1 sb 1 } { createBSpline str 1 ssx 1 ssy 1 sf 1 sb 1 } { createEllipse str 1 ssx 1 ssy 1 sf 1 sb 1 tt 7 } { createRectangle str 1 ssx 1 ssy 1 sf 1 sb 1 } { createRectangleCusped str 1 ssx 1 ssy 1 sf 1 sb 1 } { brush str 1 ssx 1 ssy 1 sf 1 sb 1 } { eraser src 2 str 1 ssx 1 ssy 1 sf 1 sb 1 } { clone src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { reveal src 3 str 1 ssx 1 ssy 1 sf 1 sb 1 } { dodge src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { burn src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { blur src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { sharpen src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } { smear src 1 str 1 ssx 1 ssy 1 sf 1 sb 1 } } } toolbar_brush_hardness 0.200000003 toolbar_source_transform_scale {1 1} toolbar_source_transform_center {1024 778} color {1 1 1 0} colorOverlay {0 0 0 0} lifetime_type "all frames" lifetime_start 101 lifetime_end 101 motionblur_shutter_offset_type centred source_black_outside true name Roto1 selected true xpos -284 ypos 297 } Premult { name Premult1 selected true xpos -284 ypos 335 } Project3D2 { inputs 2 project_on front occlusion_mode world name Project3D3 selected true xpos -284 ypos 377 } Camera2 { inputs 0 translate {0 0 2.048000097} name Camera3 selected true xpos -342 ypos 120 } Text2 { inputs 0 font_size_toolbar 100 font_width_toolbar 100 font_height_toolbar 100 cliptype bbox message "Remember to use it sparingly or your node graph will quickly bloated up." old_message {{82 101 109 101 109 98 101 114 32 116 111 32 117 115 101 32 105 116 32 115 112 97 114 105 110 103 108 121 32 111 114 32 121 111 117 114 32 110 111 100 101 32 103 114 97 112 104 32 119 105 108 108 32 113 117 105 99 107 108 121 32 98 108 111 97 116 101 100 32 117 112 46} } box {0 1440 800 1556} transforms {{0 2} } cursor_position 72 font {{ Arial : Regular : arial.ttf : 0 }} scale {1 1} cursor_initialised true autofit_bbox false initial_cursor_position {{0 1556} } group_animations {{0} imported: 0 selected: items: "root transform/"} animation_layers {{1 11 1024 778 0 0 1 1 0 0 0 0} } color {1 1 1 1} color_panelDropped true name Text2 selected true xpos -180 ypos 70 } Crop { box {0 1036 834 1556} reformat true crop false name Crop2 selected true xpos -180 ypos 96 } Project3D2 { inputs 2 project_on front name Project3D4 selected true xpos -180 ypos 140 } Camera2 { inputs 0 translate {-1.460000038 0.09000000358 -0.05499993637} rotate {0 -90 0} name Camera2 selected true xpos -296 ypos -53 } Text2 { inputs 0 font_size_toolbar 100 font_width_toolbar 100 font_height_toolbar 100 cliptype bbox message Texture old_message {{84 101 120 116 117 114 101} } box {0 1440 529 1556} transforms {{0 2} } cursor_position 7 font {{ Arial : Regular : arial.ttf : 0 }} scale {1 1} cursor_initialised true autofit_bbox false initial_cursor_position {{0 1556} } group_animations {{0} imported: 0 selected: items: "root transform/"} animation_layers {{1 11 1024 778 0 0 1 1 0 0 0 0} } color {0.705009 1 0 1} color_panelDropped true name Text1 selected true xpos -176 ypos -121 } Crop { box {0 1449 529 1556} reformat true crop false name Crop1 selected true xpos -176 ypos -73 } Project3D2 { inputs 2 project_on front name Project3D2 selected true xpos -176 ypos -33 } push $cut_paste_input Camera2 { translate {0 0.04199999943 3.234999895} name Camera1 selected true xpos -127 ypos -206 } ColorBars { inputs 0 name ColorBars1 selected true xpos -17 ypos -298 } Project3D2 { inputs 2 name Project3D1 selected true xpos -17 ypos -186 } MergeMat { inputs 2 name MergeMat1 selected true xpos -17 ypos -33 } MergeMat { inputs 2 name MergeMat3 selected true xpos -17 ypos 140 } MergeMat { inputs 2 name MergeMat2 selected true xpos -17 ypos 377 } Cube { name Cube1 selected true xpos -17 ypos 450 } Scene { name Scene1 selected true xpos -7 ypos 527 } push 0 ScanlineRender { inputs 3 conservative_shader_sampling false motion_vectors_type distance name ScanlineRender1 selected true xpos -17 ypos 620 }