MakeHand

Introduced

4.0

Description

Creates a one-bone hand and a set of finger bones using guide objects to position and orient the bone joints. Two collections of guide objects are necessary to create a hand: a collection of finger guide objects to position finger joints; and a collection of "blade" objects that control the curl direction of the fingers. The finger chain is set up so that bone Z rotation is in the plane of the blade.

Optionally a shadow rig can be attached to the hand and fingers. A shadow object is created for each chain element in the arm, and pose constrained to that element. Shadow rigs can be used to plot animation off of a rig.

Scripting Syntax

MakeHand( HandParent, FingerGuideCollection, BladeGuideCollection, HandGuideCollection, [Prefix], [FingerBoneType], [ShadowType], [ShadowParent], [NegativeScale] )

Parameters

Parameter

Type

Description

HandParent

String

The object to which the new hand will be parented.

FingerGuideCollection

String

A collection of guides objects for the start of each finger. Given a guide object in the collection like "LRing1" make hand will search for "LRing2", "LRing3", etc. until it can't find more joints. At least one extra joint per root needs to be found in the scene for a bone to be drawn.

BladeGuideCollection

String

A collection of blade objects showing the orientation of the fingers being drawn. Needs to be in the same order as the Root Guides.

HandGuideCollection

String

A collection of two objects in the order: start of hand bone, end of hand bone.

Prefix

String

The prefix used to name new objects when making the new hand. For example, "L" and "R".

FingerBoneType

Integer

Option to construct finger bones from 2D or 3D chains.

Default Value: 0

Possible Values:

0: Fingers are 2D chains and the preference angles orient with Finger blades.

1: Fingers are 3D chains and preference angles are the pose of the guide.

ShadowType

Integer

The type of shadow rig to attach to the hand. Shadow rigs can be used to transfer or remap animation.

Default Value: 0

Possible Values:

0: No shadow

1: SI|3D Skeleton shadow rig

2: XSI Skeleton shadow rig

3: Null shadow rig

4: Box shadow rig

9: SI|3D Skeleton hand shadow (no fingers)

10: XSI Skeleton hand shadow (no fingers)

11: Null hand shadow (no fingers)

12: Box hand shadow (no fingers)

ShadowParent

String

Parent of the shadow rig hiearchy. If empty, no shadow rig is generated.

NegativeScale

Boolean

Negative scaling on the chain. Negative scaling is useful for manipulating the left and right hands or fingers symmetrically.

Default Value: False

Return Value

Returns a Hand JScript object.

Examples

JScript Example

/*
   Loads the Biped Guide then generates a left 
   hand matched to the guide
*/

GetProportionalGuide("Biped_Guide", 0, 0);

var Guide    = ActiveSceneRoot.FindChild("Biped_Guide" );
var LFingers = new ActiveXObject("XSI.Collection");
var LBlades  = new ActiveXObject("XSI.Collection");

var handKeys = new Array("Pinky", "Ring", "Middle", "Index", "Thumb");

for(i=0;i<handKeys.length;i++){

   var finger = Guide.FindChild("L" + handKeys[i] + 1);
   var blade  = Guide.FindChild("L" + handKeys[i] + "_fingerBlade");

   if(finger && blade){

       LFingers.add(finger);
       LBlades.add(blade);
   }
}

var LHBone = new ActiveXObject("XSI.Collection");

LHBone.add(Guide + ".LHand");
LHBone.add(Guide + ".LHandEnd");

var LHand = makeHand(ActiveSceneRoot, LFingers, LBlades, LHBone, "L", 0, 0, null, 0);

DumpHand(LHand);

//Delete the guide
DeleteObj("B:"+Guide);

//Move hand to the origin 
var xfo
xfo = LHand.Root.Kinematics.Global.Transform;
xfo.SetTranslationFromValues(0,0,0);
LHand.Root.Kinematics.Global.Transform = xfo;

function DumpHand(inHand)
{
       logmessage ("Data in the returned hand object:");
       logmessage ("---------------------------------");
       logmessage ("HandRoot  : " + inHand.Root);
       logmessage ("HandEff   : " + inHand.Eff);
       logmessage ("#FingRoots: " + inHand.FingerRoots.count);

       for(var b=0;b<inHand.FingerRoots.count;b++)
       {logmessage (" FingerRoot" + b + ": " + inHand.FingerRoots(b));}

       logmessage ("Hidden    : " + inHand.Hidden);
       logmessage ("Envelope  : " + inHand.Envelope);
       logmessage ("Shadows   : " + inHand.Shadows);
}

//results from running this script:
//INFO : "Data in the returned hand object:"
//INFO : "---------------------------------"
//INFO : "HandRoot  : LHandRoot"
//INFO : "HandEff   : LHandEffector"
//INFO : "#FingRoots: 5"
//INFO : " FingerRoot0: LPinkyRoot"
//INFO : " FingerRoot1: LRingRoot"
//INFO : " FingerRoot2: LMiddleRoot"
//INFO : " FingerRoot3: LIndexRoot"
//INFO : " FingerRoot4: LThumbRoot"
//INFO : "Hidden    : LPinkyRoot,LPinkyEffector,LRingRoot,LRingEffector,LMiddleRoot,LMiddleEffector,LIndexRoot,LIndexEffector,LThumbRoot,LThumbEffector,LHandRoot,LHandEffector"
//INFO : "Envelope  : LPinky1,LPinky2,LPinky3,LRing1,LRing2,LRing3,LMiddle1,LMiddle2,LMiddle3,LIndex1,LIndex2,LIndex3,LThumb1,LThumb2,LThumb3,LHand"
//INFO : "Shadows   : undefined"

See Also

MakeArm



Autodesk Softimage v7.5