Hello,
I’ve recently started using the maxObjectTab parameter array after reading about it and its benefits on Paul Neale’s website. Here a few quick scripts I wrote which I thought I’d share
Dynamic Parenting:
(
delete objects
redBox = Box name:"Red Box" position:[-30,0,0] wireColor:red length:20 width:20 height:20
greenBox = Box name:"Green Box" position:[0,0,0] wireColor:green length:20 width:20 height:20
blueBox = Box name:"Blue Box" position:[30,0,0] wireColor:blue length:20 width:20 height:20
parentPt = Point name:"Parent Point" position:[0,0,0] centerMarker:false axisTripod:false cross:false box:false size:0
childBox = Box name:"Child Box" position:[0,30,0] wireColor:yellow length:10 width:10 height:10
childBox.parent = parentPt
posCon = Position_Constraint()
posCon.appendTarget redBox 0
posCon.appendTarget greenBox 0
posCon.appendTarget blueBox 0
parentPt.position.controller = posCon
rotCon = Orientation_Constraint()
rotCon.appendTarget redBox 0
rotCon.appendTarget greenBox 0
rotCon.appendTarget blueBox 0
parentPt.rotation.controller = rotCon
ca = attributes myParentTest
(
parameters myParentP rollout:myParentR
(
listItem type:#integer ui:parentList default:1
objectTab type:#maxObjectTab tabSizeVariable:on tabSize:0
)
rollout myParentR "Parent Switching"
(
dropDownList parentList "Parent List:" items:#("World", "Red", "Green", "Blue")
on parentList selected item do
(
childRot = objectTab[2].node.rotation
childPos = objectTab[2].node.position
disableSceneRedraw()
with animate on
(
sliderTime += -1
case of
(
(objectTab[1].node.position.controller.getWeight 1 == 0 and objectTab[1].node.position.controller.getWeight 2 == 0 and objectTab[1].node.position.controller.getWeight 3 == 0):
(
objectTab[1].node.position.controller.setWeight 1 0
objectTab[1].node.position.controller.setWeight 2 0
objectTab[1].node.position.controller.setWeight 3 0
objectTab[1].node.rotation.controller.setWeight 1 0
objectTab[1].node.rotation.controller.setWeight 2 0
objectTab[1].node.rotation.controller.setWeight 3 0
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
(objectTab[1].node.position.controller.getWeight 1 == 100):
(
objectTab[1].node.position.controller.setWeight 1 100
objectTab[1].node.position.controller.setWeight 2 0
objectTab[1].node.position.controller.setWeight 3 0
objectTab[1].node.rotation.controller.setWeight 1 100
objectTab[1].node.rotation.controller.setWeight 2 0
objectTab[1].node.rotation.controller.setWeight 3 0
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
(objectTab[1].node.position.controller.getWeight 2 == 100):
(
objectTab[1].node.position.controller.setWeight 1 0
objectTab[1].node.position.controller.setWeight 2 100
objectTab[1].node.position.controller.setWeight 3 0
objectTab[1].node.rotation.controller.setWeight 1 0
objectTab[1].node.rotation.controller.setWeight 2 100
objectTab[1].node.rotation.controller.setWeight 3 0
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
(objectTab[1].node.position.controller.getWeight 3 == 100):
(
objectTab[1].node.position.controller.setWeight 1 0
objectTab[1].node.position.controller.setWeight 2 0
objectTab[1].node.position.controller.setWeight 3 100
objectTab[1].node.rotation.controller.setWeight 1 0
objectTab[1].node.rotation.controller.setWeight 2 0
objectTab[1].node.rotation.controller.setWeight 3 100
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
)
sliderTime += 1
case of
(
(item == 1):
(
objectTab[1].node.position.controller.setWeight 1 0
objectTab[1].node.position.controller.setWeight 2 0
objectTab[1].node.position.controller.setWeight 3 0
objectTab[1].node.rotation.controller.setWeight 1 0
objectTab[1].node.rotation.controller.setWeight 2 0
objectTab[1].node.rotation.controller.setWeight 3 0
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
(item == 2):
(
objectTab[1].node.position.controller.setWeight 1 100
objectTab[1].node.position.controller.setWeight 2 0
objectTab[1].node.position.controller.setWeight 3 0
objectTab[1].node.rotation.controller.setWeight 1 100
objectTab[1].node.rotation.controller.setWeight 2 0
objectTab[1].node.rotation.controller.setWeight 3 0
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
(item == 3):
(
objectTab[1].node.position.controller.setWeight 1 0
objectTab[1].node.position.controller.setWeight 2 100
objectTab[1].node.position.controller.setWeight 3 0
objectTab[1].node.rotation.controller.setWeight 1 0
objectTab[1].node.rotation.controller.setWeight 2 100
objectTab[1].node.rotation.controller.setWeight 3 0
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
(item == 4):
(
objectTab[1].node.position.controller.setWeight 1 0
objectTab[1].node.position.controller.setWeight 2 0
objectTab[1].node.position.controller.setWeight 3 100
objectTab[1].node.rotation.controller.setWeight 1 0
objectTab[1].node.rotation.controller.setWeight 2 0
objectTab[1].node.rotation.controller.setWeight 3 100
objectTab[2].node.rotation = childRot
objectTab[2].node.position = childPos
)
)
)
enableSceneRedraw()
)
)
)
addModifier childBox (EmptyModifier name:"Parent Switching")
custAttributes.add childBox.modifiers[1] ca
append childBox.modifiers[1].myParentTest.objectTab (nodeTransformMonitor node:parentPt forwardTransformChangeMsgs:false)
append childBox.modifiers[1].myParentTest.objectTab (nodeTransformMonitor node:childBox forwardTransformChangeMsgs:false)
)
I uploaded a brief video to Vimeo showing how to work with it: https://vimeo.com/89361411
Animatable Pivot
(
delete objects
myBox = Box name:"myBox"
myAnimHelper = Point name:"animHelper" centerAxis:false axisTripod:false cross:false box:true
myMoveHelper = Point name:"moveHelper" centerAxis:false axisTripod:false cross:true box:false
myObjs = #(myBox, myAnimHelper, myMoveHelper)
myAnimHelper.parent = myBox
myMoveHelper.parent = myBox
myBox.transform.controller = CATHDPivotTrans()
myBox.transform.controller[#PRS].position.controller = Position_List()
myAnimHelper.position.controller = Bezier_Position()
myBox.transform.controller.pivot.controller = myAnimHelper.position.controller
paramWire.connect myAnimHelper.transform.controller[#Position] myBox.transform.controller[#PRS][#Position][#Position_XYZ] "Position"
myBox.transform.controller[#PRS][#Position][#Available].controller = Position_XYZ()
myBox.transform.controller[#PRS][#Position].active = 2
ca = attributes animPivotCA
(
parameters animPivotP rollout:animPivotR
(
nodeArray type:#maxObjectTab tabSize:0 tabSizeVariable:true
)
rollout animPivotR "Pivot Controls"
(
button hideMove "Show/Hide Mover" align:#center width:130
button snapMove "Snap Pivot to Move" align:#center width:130
on hideMove pressed do
if nodeArray[2].node.isHidden == true then
(
nodeArray[2].node.isHidden = false
nodeArray[3].node.isHidden = false
)
else
(
nodeArray[2].node.isHidden = true
nodeArray[3].node.isHidden = true
)
on snapMove pressed do
(
myLocalPos = nodeArray[3].node.position.controller.value
myPos = nodeArray[3].node.position
myWorldPos = nodeArray[2].node.position
nodeArray[2].node.position.controller.value = myLocalPos
nodeArray[1].node.position= myPos
)
)
)
addModifier myBox (EmptyModifier())
custAttributes.add myBox.modifiers[1] ca
for a in myObjs do
append myBox.modifiers[1].animPivotCA.nodeArray (nodeTransformMonitor node:a forwardTransformChangeMsgs:false)
)
The animatable pivot script is a strange one, it works perfectly well without Auto Key enabled but messes up with it on, but I thought it might be a good starting point for someone to do further development (I know Felix Joleanes has an animatable pivot plug-in but, hey, it’s fun trying to write your own stuff). It’s based on Jason Schleifer’s approach in Maya, use the cross helper to get the location of where you want the pivot to be and then “Snap Pivot to Move” button to actually reposition the pivot
Hopefully they’ll be of use to someone.
-Harry