v4.0
Creates roll nulls along 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.
The start and end rotations are determined differently for a forearm roll and bicep roll (MakeBicepRoll).
In forearm roll, the starting rotation is the forearm's rotation minus any spin, calculated using the bicep's rotation. The end
rotation is the next bone's rotation (wrist) with spin. Roll division rotations are then interpolated between the start and end.
In the case of bicep roll the bicep bone is used for both start and end rotations. The start rotation is the bone's rotation minus spin,
the end rotation is its rotation with spin.
oForeArmRoll = MakeForearmRoll( Bicep, Forearm, ArmEff, HandEff, HandBone, [Prefix], [NbDivisions], [RollOffset] ); |
Returns a ForeArmRoll JScript object.
Parameter | Type | Description |
---|---|---|
Bicep | String | The chain element before the forearm, used to calculate the unspun forearm rotation. |
Forearm | String | The object to which the roll nulls will be parented. |
ArmEff | String | Effector of the chain that contains the bicep and forearm. |
HandEff | String | The effector of the wrist chain. |
HandBone | String | The wrist or hand bone, used to calculate the end rotation. |
Prefix | String | Prefix added to the name of the new dividers. |
NbDivisions | Integer |
The number of roll divisions. If the value is zero no roll is created. Default Value: 3 |
RollOffset | Double |
Offset in degrees to roll the forearm. The roll has a range of -180 to 180 and this lets you place the seam of that roll.
The value is driving a custom parameter that will be placed under the Hand Bone to interactively control this value.
Default Value: 0 |
/* This script creates an arm, then puts roll division on the forearm. */ 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(ActiveSceneRoot, guidecoll, "R",null, 0,0,0,null ,null, 0); /* Add a Hand */ 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 ForeArmRoll = MakeForearmRoll( RArm.Root.Bones(0), //bicep RArm.Root.Bones(1), //forearm RArm.Eff, //arm effector HandChain.Effector, //hand effector HandChain.Bones(0), //hand "R"); //new object name prefix DumpForearmRoll(ForeArmRoll ); function DumpForearmRoll(inForeArmRoll ) { logmessage ("Data in the returned arm object:"); logmessage ("-------------------------------"); logmessage ("Sliders : " + inForeArmRoll.Sliders); logmessage ("RollOffset: " + inForeArmRoll.RollOffset.value); logmessage ("#Divisions: " + inForeArmRoll.Nb); for(var b=0;b<ForeArmRoll.Divisions.count;b++) {logmessage (" RollDif" + b + ": " + inForeArmRoll.Divisions(b));} } //results of running this script: //INFO : "Data in the returned arm object:" //INFO : "-------------------------------" //INFO : "Sliders : bone.Roll_Compensation" //INFO : "RollOffset: 0" //INFO : "#Divisions: 3" //INFO : " RollDif0: RElbow" //INFO : " RollDif1: RForearmRoll" //INFO : " RollDif2: RForearmRoll1" // |