v4.0
character rigging
Creates a two bone arm and an up vector control object. The arm
bones are created from a collection of guide objects, which should
contain objects for shoulder, elbow, and hand positions
respectively. A bicep bone will connect the shoulder and elbow
objects, and a forearm bone will connect the elbow and hand
objects.
MakeArm can optionally add roll divisions to the bicep and forearm.
Divisions are used to distribute the roll difference between
adjacent bones over the length of a bone. When used as deformers on
an envelope they evenly distribute twist along the length of a bone
giving a more natural skin deformation. Roll divisions can also be
added separately using the MakeBicepRoll and MakeForearmRoll commands. If using
forearm roll, create the hand before calling MakeArm so that the
hand root can be passed as an argument.
Optionally a shadow rig can be attached to the arm. Shadow objects
will be created for each chain element in the arm, and shadow arm
bones will be pose constrained to the acutal arm bones. Shadow rigs
can be used to plot animation off of a rig.
oArm = MakeArm( ArmParent, GuideObjectCollection, [Prefix], [ArmRootConstrainingObj], [NbForearmDivisions], [NbBicepDivisions], [ShadowType], [ShadowParent], [HandRoot], [NegativeScale] ); |
Returns an Arm JScript.
Parameter | Type | Description | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ArmParent | String | The object to which the new arm will be parented. | ||||||||||||
GuideObjectCollection | String | A collection of three guide objects for the shoulder, elbow, and hand respectively. | ||||||||||||
Prefix | String | The prefix used to name new objects when making the new arm. Example "L", "R" | ||||||||||||
ArmRootConstrainingObj | String | Object to which the arm root will be position-constrained. If not specified, no constraint is applied to the arm root. | ||||||||||||
NbForearmDivisions | Integer | The number of forearm roll divisions (see the MakeForearmRoll command). If the value
is zero there is no forearm roll
Default Value: 0 |
||||||||||||
NbBicepDivisions | Integer | The number of bicep roll divisions (see the MakeBicepRoll command). If the value is
zero there is no bicep roll.
Default Value: 0 |
||||||||||||
ShadowType | Integer | The type of shadow rig to attach to the arm. Shadow rigs can be
used to transfer or remap animation.
Default Value: 0
|
||||||||||||
ShadowParent | String | Parent of the shadow rig hiearchy. If empty, no shadow rig is generated. | ||||||||||||
HandRoot | String | Object acting as hand root, required for forearm roll division. This object must be a chain element(root,bone,effector). If empty, forearm roll division will not be applied, but bicep roll will. | ||||||||||||
NegativeScale | Boolean | Negative scaling on the chain. Negative scaling is useful for
manipulating the left and right arms symmetrically.
Default Value: False |
/* This script creates two arms, left and right Left arm also has a hand bone and roll divisions. */ var guidecoll = new ActiveXObject("XSI.Collection"); guidecoll.Add( GetPrim("Null", "ShoulderGuide") ); guidecoll.Add( GetPrim("Null", "ElbowGuide") ); guidecoll.Add( GetPrim("Null", "HandGuide") ); var lXfm = guidecoll(0).Kinematics.Global.Transform var lPos = XSIMath.CreateVector3(); /* Right Arm */ lXfm.SetTranslationFromValues(0,0,0); guidecoll(0).Kinematics.Global.Transform = lXfm; lXfm.SetTranslationFromValues(4,0,-2); guidecoll(1).Kinematics.Global.Transform = lXfm; lXfm.SetTranslationFromValues(8,0,0); guidecoll(2).Kinematics.Global.Transform = lXfm; var RArm = MakeArm(GetPrim("Null", "RArmParent"), guidecoll, "R",null, 0,0,0,null ,null, 0); Logmessage("Right RArm"); DumpArm(RArm); /* Left Arm */ lXfm.SetTranslationFromValues(0,0,0); guidecoll(0).Kinematics.Global.Transform = lXfm; lXfm.SetTranslationFromValues(-4,0,2); guidecoll(1).Kinematics.Global.Transform = lXfm; lXfm.SetTranslationFromValues(-8,0,0); guidecoll(2).Kinematics.Global.Transform = lXfm; var lPosStart = XSIMath.CreateVector3(); var lPosEnd = XSIMath.CreateVector3(); lPosStart.Set(-8,0,0); lPosEnd.Set(-9,0,0); var HandChain = ActiveSceneRoot.Add2DChain(lPosStart, lPosEnd); var LArm = MakeArm(GetPrim("Null", "LArmParent"), guidecoll, "L",null, 4,4,0,ActiveSceneRoot,HandChain, 0); Logmessage("Left Arm"); DumpArm(LArm); function DumpArm(inArm) { logmessage ("Data in the returned arm object:"); logmessage ("-------------------------------"); logmessage ("Bind Null : " + inArm.Root); logmessage ("Top Null : " + inArm.Eff); logmessage ("Base Null : " + inArm.UpVParent); logmessage ("#ForeDiv : " + inArm.ForearmDivisions); if(inArm.BicepDivisions > 0) { for(var b=0;b<inArm.ForeArmRoll.Divisions.count;b++) {logmessage (" RollDif" + b + ": " + inArm.ForeArmRoll.Divisions(b));} } logmessage ("#BicepDiv : " + inArm.BicepDivisions); if(inArm.BicepDivisions > 0) { for(var b=0;b<inArm.BicepRoll.Divisions.count;b++) {logmessage (" RollDif" + b + ": " + inArm.BicepRoll.Divisions(b));} } logmessage ("Upvector : " + inArm.UpV); logmessage ("Hidden : " + inArm.Hidden); logmessage ("Envelope : " + inArm.Envelope); logmessage ("Shadows : " + inArm.Shadows); } //results of running this script //INFO : "Right RArm" //INFO : "Data in the returned arm object:" //INFO : "-------------------------------" //INFO : "Bind Null : RRoot" //INFO : "Top Null : RArmEff" //INFO : "Base Null : undefined" //INFO : "#ForeDiv : 0" //INFO : "#BicepDiv : 0" //INFO : "Upvector : RArmUpV" //INFO : "Hidden : RRoot" //INFO : "Envelope : RBicep,RForearm" //INFO : "Shadows : undefined" //INFO : "Left Arm" //INFO : "Data in the returned arm object:" //INFO : "-------------------------------" //INFO : "Bind Null : LRoot" //INFO : "Top Null : LArmEff" //INFO : "Base Null : undefined" //INFO : "#ForeDiv : 4" //INFO : " RollDif0: LElbow" //INFO : " RollDif1: LForearmRoll" //INFO : " RollDif2: LForearmRoll1" //INFO : " RollDif3: LForearmRoll2" //INFO : "#BicepDiv : 4" //INFO : " RollDif0: LBicepRoll1" //INFO : " RollDif1: LBicepRoll2" //INFO : " RollDif2: LBicepRoll3" //INFO : " RollDif3: LBicepRoll4" //INFO : " RollDif4: LBicepRoll_5" //INFO : "Upvector : LArmUpV" //INFO : "Hidden : LRoot" //INFO : "Envelope : LBicepRoll1,LBicepRoll2,LBicepRoll3,LBicepRoll4,LBicepRoll_5,LElbow,LForearmRoll,LForearmRoll1,LForearmRoll2" //INFO : "Shadows : undefined" // |