MakeArm

導入

v4.0

カテゴリ

キャラクタ リギング

詳細

2 本のボーンを持つ腕とアップベクター コントロール オブジェクトを作成します。 腕のボーンは、肩、肘、手のそれぞれの位置のオブジェクトを持つガイド オブジェクトのコレクションから作成されます。 上腕のボーンは肩と肘のオブジェクトを接続し、前腕のボーンは肘と手のオブジェクトを接続します。

MakeArm コマンドは、オプションで上腕と前腕に回転分割を追加することができます。 分割は、隣接するボーンとの回転の差異をボーンの長さ全体に分散させるために使用します。 エンベロープのデフォーマとして使用すると、ボーンの長さ全体に均等にツイストを分散し、より自然なスキンのデフォーメーションを実現できます。 回転分割は、MakeBicepRollおよびMakeForearmRollコマンドを使用して、別途追加することもできます。 前腕の回転を使用するときには、手のルートを引数として渡すことができるよう、MakeArm を呼び出す前に手を作成します。

必要に応じて、腕にシャドウ リグをアタッチすることができます。 シャドウ オブジェクトは腕の各チェイン エレメントに対して作成され、シャドウの腕のボーンは実際の腕のボーンにポーズで拘束されます。 シャドウ リグはリグのアニメーションをプロットする際に使用できます。

スクリプト構文

oArm = MakeArm( ArmParent, GuideObjectCollection, [Prefix], [ArmRootConstrainingObj], [NbForearmDivisions], [NbBicepDivisions], [ShadowType], [ShadowParent], [HandRoot], [NegativeScale] );

戻り値

Arm JScript を戻します。

パラメータ

パラメータ タイプ 詳細
ArmParent 文字列 新しい腕の親となるオブジェクト。
GuideObjectCollection 文字列 肩、肘、手それぞれの 3 つのガイド オブジェクトのコレクション。
Prefix 文字列 新しい腕を作成する際に、新しいオブジェクトの名前に付加するプリフィックス。 たとえば、「L」、「R」など。
ArmRootConstrainingObj 文字列 腕のルートを位置で拘束するオブジェクト。 何も指定しない場合、腕のルートに拘束は適用されません。
NbForearmDivisions Integer 前腕の回転分割の数(MakeForearmRollコマンドを参照)。 値がゼロの場合には、前腕に回転分割は与えられません。

デフォルト値: 0

NbBicepDivisions Integer 上腕の回転分割の数(MakeBicepRollコマンドを参照)。 値がゼロの場合には、上腕に回転分割は与えられません。

デフォルト値: 0

ShadowType Integer 腕にアタッチするシャドウ リグのタイプ。 シャドウ リグは、アニメーションを転送または再マップするために使用します。

デフォルト値: 0

指定可能な値:

説明:

0 影無し
1 SI|3Dスケルトンのシャドウリグ
2 XSIスケルトンのシャドウリグ
3 ヌルのシャドウリグ
4 ボックスのシャドウリグ
ShadowParent 文字列 シャドウ リグ階層の親。 空の場合には、シャドウ リグは作成されません。
HandRoot 文字列 前腕の回転分割に必要な、手のルートとして動作するオブジェクト。 このオブジェクトはチェイン エレメント(ルート、ボーン、エフェクタ)でなくてはなりません。 空の場合には前腕の回転分割は適用されませんが、上腕の回転は適用されます。
NegativeScale ブール チェイン上の負のスケーリング。 負のスケーリングは、左と右の腕を対称に操作する場合に便利です。

デフォルト値: False

JScript の例

/*
        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"
//

関連項目

MakeForearmRoll MakeBicepRoll MakeHand MakeJointCompression