/*-------------------------------------------------------------------------- -- Camera JibRig Creator -- By Trond Hille 2011 -- tronotrond@gmail.com -- www.tronotrond.com -- -- ToDo: -- * Add Attribute holder and camera setting sliders to anim-object -- -- * Fix animator object to stick to rig -- Semifixed with position limits -- * Fix rigging after scaling problems - Fixed ---------------------------------------------------------------------------*/ VERSION_STRING = "V1.11" global rootCtrlWire = [255,0,0] global animCtrlWire = [0,255,0] global crcDebug = true global partsArray = #() global crcHelpers = #() global wcol = [120, 120, 120] -- wirecolor global camInheritance = #{1,2,3} global fullInheritance = #{1,2,3,4,5,6} global debug = true -- set debug mode on/off global camTargetBefore = false --{POS_X,POS_Y,POS_Z,ROT_X,ROT_Y,ROT_Z,SCALE_X,SCALE_Y,SCALE_Z} gc() -- Garbage Collect if crcRollout != undefined do ( if classOf crcRollout == RolloutClass do destroyDialog crcRollout ) rollout crcRollout "Camera JibRig Creator v1.0" width:238 height:119 ( label lbl1 "Scale" pos:[10,9] width:50 height:18 label lbl2 "Base Height" pos:[10,29] width:75 height:18 label lbl3 "Arm Length" pos:[10,49] width:74 height:18 button btn1 "Create" pos:[170,9] width:60 height:20 enabled:true button btn2 "Rig" pos:[171,46] width:60 height:20 enabled:false -- Spinner for rig scale spinner spnScale "" pos:[94,9] width:50 height:16 range:[0.1,100,1] scale:0.01 -- Spinners for Rig adjustment spinner spnHeight1 "" pos:[94,29] width:50 height:16 range:[0,10000,200] scale:0.5 spinner spnHeight2 "" pos:[94,50] width:50 height:16 range:[0,10000,300] scale:0.5 label lbl7 "Camera JibRig Script by Tronotrond - www.tronotrond.com" pos:[14,82] width:219 height:28 color:[255,255,255] on btn1 pressed do ( -- should track mouse for placing rig in later version -- create rig partsArray[1] = box length: (100*spnScale.value) width: (100*spnScale.value) height: (10*spnScale.value) partsArray[2] = box length: (10*spnScale.value) width: (10*spnScale.value) height: spnHeight1.value partsArray[3] = box length: (10*spnScale.value) width: (10*spnScale.value) height: spnHeight2.value pos:[0,0,(partsArray[2].height-(partsArray[2].height/5))] partsArray[3].pivot = [0, 0, partsArray[2].height] rotate partsArray[3] (angleaxis 90 [0,1,0]) -- rotate part 3 90 degrees for easy placement of next part partsArray[4] = dummy pos:[(partsArray[3].height-(partsArray[2].height/5)),0,partsArray[2].height] partsArray[5] = box length: (10*spnScale.value) width: (10*spnScale.value) height: (30*spnScale.value) pos:[(partsArray[3].height-(partsArray[2].height/5)),0,partsArray[2].height] rotate partsArray[5] (angleaxis 180[0,1,0]) -- flip upside down -- create camera partsArray[6] = targetcamera name:"rigCamera" pos:[(partsArray[3].height-(partsArray[2].height/5)),0,(partsArray[2].height-(partsArray[5].height*3))] rotate partsArray[6] (angleaxis -90 [0,0,1]) -- rotate camera rotate partsArray[6] (angleaxis -90 [0,1,0]) setInheritanceFlags partsArray[2] fullInheritance setInheritanceFlags partsArray[3] fullInheritance -- remove inhertic scaling to prevent skewing setInheritanceFlags partsArray[5] camInheritance -- set camera parent inheritance parameter setInheritanceFlags partsArray[6] camInheritance -- set camera parent inheritance parameter for i in partsArray.count to 2 by -1 do ( partsArray[i].parent = partsArray[i-1] ) rotate partsArray[3] (angleaxis -45 [0,1,0]) btn1.enabled = false btn2.enabled = true -- Freeze rig to stop unwanted modification in viewport, unless in debug mode if debug == false then ( for i in 1 to partsArray.count do freeze partsArray[i] ) ) on btn2 pressed do ( -- Unfreeze rig and make unrenderable for i in 1 to partsArray.count do ( unfreeze partsArray[i] partsArray[i].renderable = false ) -- Set up root controller crcHelpers[1] = circle radius:partsArray[1].width pos:[0,0, partsArray[1].height/2] crcHelpers[1].name = "crcRootCtrl" crcHelpers[1].render_renderable = false crcHelpers[1].render_displayRenderMesh = true crcHelpers[1].render_thickness = partsArray[1].height crcHelpers[1].wirecolor = rootCtrlWire partsArray[1].parent = crcHelpers[1] -- Link base of rig to root control -- Create rig animation controller crcHelpers[2] = circle radius:(partsArray[1].width/2) pos:partsArray[5].position crcHelpers[2].render_renderable = false crcHelpers[2].render_displayRenderMesh = true crcHelpers[2].render_thickness = partsArray[1].height/3 crcHelpers[2].wirecolor = animCtrlWire tempHelper1 = circle radius:(partsArray[1].width/2) pos:partsArray[5].position tempHelper1.render_renderable = false tempHelper1.render_displayRenderMesh = true tempHelper1.thickness = partsArray[1].height/3 rotate tempHelper1 (angleaxis -90 [1,0,0]) -- rotate helper to create a "ball" tempHelper2 = circle radius:(partsArray[1].width/2) pos:partsArray[5].position tempHelper2.render_renderable = false tempHelper2.render_displayRenderMesh = true tempHelper2.thickness = partsArray[1].height/3 rotate tempHelper2 (angleaxis -90 [1,0,0]) -- rotate helper to create a "ball" rotate tempHelper2 (angleaxis -90 [0,0,1]) -- rotate helper to create a "ball" -- attach tempHelpers convertTo crcHelpers[2] TriMeshGeometry meshOp.attach crcHelpers[2] tempHelper1 meshOp.attach crcHelpers[2] tempHelper2 crcHelpers[2].renderable = false crcHelpers[2].name = "crcAnimController" -- Add orientation constraint to camera - linked to crcAnimController oc = Orientation_Constraint(); oc.appendTarget crcHelpers[2] 50; --oc.controller.relative = on; -- set up IK-chain ikChain = HDIKSys.ikChain partsArray[2] partsArray[4] true --ikChain.name = "crcIK" ik.setAxisActive partsArray[2] #rotational #{3} -- Set only Z axis rotaional active - bitArray ik.setAxisActive partsArray[3] #rotational #{2} -- Set only Y axis rotaional active partsArray[6].rotation.controller = oc partsArray[6].rotation.controller.relative = on if crcDebug == true then print partsArray[6].rotation.controller -- Position constraint end effector to crcAnimController pc = Position_Constraint(); pc.appendTarget crcHelpers[2] 50; partsArray[4].position.controller = pc partsArray[4].position.controller.relative = on -- link animController to Root crcHelpers[2].parent = crcHelpers[1] -- set up move limits for anim controller crcHelpers[2].pos.controller.X_Position.controller = float_limit () crcHelpers[2].pos.controller.Y_Position.controller = float_limit () crcHelpers[2].pos.controller.Z_Position.controller = float_limit () crcHelpers[2].pos.controller.X_Position.controller.upper_limit = partsArray[3].height crcHelpers[2].pos.controller.X_Position.controller.lower_limit = -partsArray[3].height crcHelpers[2].pos.controller.Y_Position.controller.upper_limit = partsArray[3].height crcHelpers[2].pos.controller.Y_Position.controller.lower_limit = -partsArray[3].height crcHelpers[2].pos.controller.Z_Position.controller.upper_limit = (partsArray[3].height+partsArray[2].height) crcHelpers[2].pos.controller.Z_Position.controller.lower_limit = (partsArray[2].height-partsArray[3].height) -- Setup custom attributes for anim object eM = emptyModifier() if debug then print "setupAnimCTRL running" global camLAC = LookAt_Constraint() /* -- OLD CODE WITH LOOKAT ON ANIM DUMMY -- setup Orientation List with Lookat controller crcHelpers[2].rotation.controller = rotation_list () crcHelpers[2].rotation.controller.Available.controller = camLAC crcHelpers[2].rotation.controller.weight[1] = 1 -- set controller weight 1 (euler xyz to 100%) crcHelpers[2].rotation.controller.weight[2] = 0 -- set lookat weight to 0 */ -- setup Orientation List with Lookat controller partsArray[6].rotation.controller = rotation_list () partsArray[6].rotation.controller.Available.controller = camLAC partsArray[6].rotation.controller.weight[1] = 1 -- set controller weight 1 (euler xyz to 100%) partsArray[6].rotation.controller.weight[2] = 0 -- set lookat weight to 0 -- Add Custom_Attributes modifier to helper object addModifier crcHelpers[2] eM def = attributes camrigAttributes ( parameters test123 rollout:attribRoll1 ( camPickButton type: #boolean UI:lookatButton slider1 type:#float UI:lookatSlider ) -- display the rollout in the modifier panel rollout attribRoll1 "LookAt" width:162 height:117 ( pickbutton lookatButton "LookAt" pos:[12,8] width:138 height:37 toolTip:"Camera LookAt Target" slider lookatSlider "LookAt <-> FG" pos:[10,48] width:135 height:45 enabled:true range:[0,1,0] ticks:2 scale:0.1 on lookatButton picked obj do -- lookat button presset ( lookatButton.caption = obj.name if camLAC.constraints.getNumTargets() > 0 then -- check for prior objects in the lookat list, and remove them if so ( for i in 1 to camLAC.constraints.getNumTargets() do camLAC.constraints.deleteTarget i ) if camTargetBefore == false then ( crcHelpers[2].modifiers[#Attribute_Holder].camrigAttributes.slider1 = 0 -- Set slider to 0 - LookAt camTargetBefore = true ) camLAC.constraints.appendTarget obj 100 ) ) parameters test1234 rollout:attribRoll2 ( spn1 type:#float UI:Lens ) rollout attribRoll2 "Camera Adjustments" width:162 height:60 ( spinner Lens "FOV:" pos:[18,8] width:81 height:16 enabled:true range:[0,175,45] type:#integer scale:1 value:45 ) ) custAttributes.add eM def crcHelpers[2].modifiers[#Attribute_Holder].camrigAttributes.spn1 = 45 -- Set spinner startup value to 45 crcHelpers[2].modifiers[#Attribute_Holder].camrigAttributes.slider1 = 1 -- Set slider to 1 - FG -- Wire connect lookAt slider in attribute holder to lookAt controller paramWire.connect crcHelpers[2].modifiers[#Attribute_Holder].camrigAttributes[#slider1] partsArray[6].rotation.controller.weights[1] "slider1" paramWire.connect crcHelpers[2].modifiers[#Attribute_Holder].camrigAttributes[#slider1] partsArray[6].rotation.controller.weights[2] "1-slider1" -- Wire connect Lens slider to camera lens paramWire.connect crcHelpers[2].modifiers[#Attribute_Holder].camrigAttributes[#spn1] partsArray[6].baseObject[#FOV] "degToRad spn1" -- camera lookat settings partsArray[6].rotation.controller.LookAt_Constraint.controller.target_axis = 2 partsArray[6].rotation.controller.LookAt_Constraint.controller.upnode_axis = 2 partsArray[6].rotation.controller.LookAt_Constraint.controller.StoUP_axis = 1 partsArray[6].rotation.controller.LookAt_Constraint.controller.target_axisFlip = on partsArray[6].rotation.controller.LookAt_Constraint.controller.StoUP_axisFlip = off --- end of anim setup select crcHelpers[1] -- select root object destroyDialog crcRollout -- close rolltout ) on spnScale changed val do ( if partsArray[2] != undefined then -- check to see if rig is created ( -- Scale value of the other sliders spnHeight1.value = 100*spnScale.value spnHeight2.value = 150*spnScale.value -- Needs optimization! Create old rig and create new scaled one. for i in 1 to partsArray.count do delete partsArray[i] -- create rig partsArray[1] = box length: (50*spnScale.value) width: (50*spnScale.value) height: (5.0*spnScale.value) partsArray[2] = box length: (5.0*spnScale.value) width: (5.0*spnScale.value) height: spnHeight1.value partsArray[3] = box length: (5.0*spnScale.value) width: (5.0*spnScale.value) height: spnHeight2.value pos:[0,0,(partsArray[2].height-(partsArray[2].height/5))] partsArray[3].pivot = [0, 0, partsArray[2].height] rotate partsArray[3] (angleaxis 90 [0,1,0]) -- rotate part 3 90 degrees for easy placement of next part partsArray[4] = dummy pos:[(partsArray[3].height-(partsArray[2].height/5)),0,partsArray[2].height] partsArray[5] = box length: (5.0*spnScale.value) width: (5.0*spnScale.value) height: (15*spnScale.value) pos:[(partsArray[3].height-(partsArray[2].height/5)),0,partsArray[2].height] rotate partsArray[5] (angleaxis 180[0,1,0]) -- flip upside down -- create camera partsArray[6] = targetcamera name:"rigCamera" pos:[(partsArray[3].height-(partsArray[2].height/5)),0,(partsArray[2].height-(partsArray[5].height*3))] rotate partsArray[6] (angleaxis -90 [0,0,1]) -- rotate camera rotate partsArray[6] (angleaxis -90 [0,1,0]) setInheritanceFlags partsArray[2] fullInheritance setInheritanceFlags partsArray[3] fullInheritance -- remove inhertic scaling to prevent skewing setInheritanceFlags partsArray[5] camInheritance -- set camera parent inheritance parameter setInheritanceFlags partsArray[6] camInheritance -- set camera parent inheritance parameter for i in partsArray.count to 2 by -1 do ( partsArray[i].parent = partsArray[i-1] ) rotate partsArray[3] (angleaxis -45 [0,1,0]) btn1.enabled = false btn2.enabled = true -- Freeze rig to stop unwanted modification in viewport for i in 1 to partsArray.count do freeze partsArray[i] ) ) on spnHeight1 changed val do ( if partsArray[2] != undefined then ( partsArray[3].pos.Z = val partsArray[2].height = val ) ) on spnHeight2 changed val do ( if partsArray[2] != undefined then ( partsArray[3].height = val rotate partsArray[3] (angleaxis 45 [0,1,0]) partsArray[4].pos.X = (partsArray[3].height-(partsArray[2].height/5)) partsArray[4].pos.Z = partsArray[2].height rotate partsArray[3] (angleaxis -45 [0,1,0]) ) ) ) createDialog crcRollout -- Custom attributes setup for animcontroller fn setupAnimCTRL = ( )