コンストレイン 2

鎖を作る

ここでは、 ピン コンストレインを使用して鎖を作ってみましょう。
コンストレインを使用して鎖を作ると、物理的には正確な動きにはなりません。 その代わり、リジッドボディのコリジョンだけを使用した場合に比べて、計算が軽くなるし、 リジッドボディ同士が貫入するというトラブルを避けることができます。

作り方

  1. 鎖の輪を作ります。
    輪はプリミティブのトーラスでも、独自のオブジェクトでもかまいません。
    [1 つ目の鎖の輪]
  2. 次の輪を前の輪と重ならないように、適当に回転・移動させて作ります。
    [2 つの鎖の輪]
  3. 2 つ輪の間を ピン コンストレインでとめます。
    [鎖の輪と輪をつなぐ ピン コンンストレイン]
  4. 2, 3 を繰り返します。

constrain コマンドの使用例 2

上の作り方を参考にして、以下のように鎖を作るスクリプトを作ってみましょう。

  1. 以下の MEL スクリプトを makeChain1.mel という名前で作ります。
    global proc makeChain1()
    {
    	int $i;
    	string $tname[];
    	string $ptname;
    
    	string $gname[] = `gravity`;
    	for($i = 1; $i <= 10; $i++)
    	{
    		$tname = `torus -hr 0.2`;
    		scale 2 3 2;
    		rotate 0 ($i % 2 * 90) 90;
    		move ($i * 4) 0 0;
    		if($i == 1)
    		{
    			constrain -nail -p 0 5 0 $tname[0];
    		}
    		else
    		{
    			constrain -pin $ptname $tname[0];
    		}
    		connectDynamic -f $gname[0] $tname[0];
    		$ptname = $tname[0];
    	}
    }
    
  2. スクリプト エディタファイル → ソース スクリプト によって makeChain1.mel を読み込みます。
  3. スクリプト エディタ のインプット ウインドウから makeChain1(); と打ち込んで実行します。
    [makeChain1() の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeChain1() のアニメーション実行図]

スクリプトの解説

global proc makeChain1()
makeChain1() というプロシージャの宣言です。
int $i;
for ループ用の変数です。
string $tname[];
鎖の輪になる、トーラスの名前を入れておく配列変数です。
string $ptname;
次の鎖の輪と ピン コンストレインでつなぐために、 一時的にトーラスのトランスフォームノードの名前を入れておく変数です。
string $gname[] = `gravity`;
重力 フィールドを作って名前を $gname に代入します。
for($i = 1; $i <= 10; $i++)
$i を 1 から 10 まで、 10 回ループさせて鎖の輪を 10 個作ります。
$tname = `torus -hr 0.2`;
NURBS のトーラスを作成します。
輪の半径は、-hr フラグによってトーラスの半径の 0.2 倍で作り、 名前を $tname に代入します。
トーラスの半径は、デフォールトで 1.0 なので、輪の半径は 0.2 になります。
torus コマンドの返り値は、 トランスフォームノード名とインプットノード名の 2 つです。 $tname[0] にトランスフォームノード、 $tname[1] にインプットノードの名前が入ります。
scale 2 3 2;
トーラスに適当にスケールをかけておきます。
同時に、輪の半径もスケールされることに注意してください。
rotate 0 ($i % 2 * 90) 90;
トーラスを、1 つおきに Y 軸方向に 90 度回転させます。
輪が X 軸方向に並ぶように、 Z 軸にも 90 度回転させます。
move ($i * 4) 0 0;
となりの輪が重ならない程度に X 軸方向に移動させます。
if($i == 1)
  constrain -nail -p 0 5 0 $tname[0];
1 個目の輪だけは、 ネイル コンストレイン(-nail)を使って 0 5 0 の位置にとめておきます。
else
  constrain -pin $ptname $tname[0];
2 個目以降の輪($tname)は、 1 個前に作られた輪($ptname)と ピン コンストレイン(-pin)でとめてゆきます。
costrainコマンドを使用することによって、 2 つのトーラス $tname$ptname は、 自動的にリジッドボディになります。
connectDynamic -f $gname[0] $tname[0];
輪に 重力 フィールド($gname)を作用させます。
$ptname = $tname[0];
次の輪とコンストレインするために、 現在の輪のトランスフォームノードの名前 $tname[0]$ptname に代入しておきます。

Tips(torus)

トーラスにおける全体の半径と、輪の半径との関係は、以下のようになっています。

NURBS
-r フラグで表される、 全体の半径に -hr フラグで表される数値を乗算した値が、輪の半径になります。
(例)
全体の半径が 4 、輪の半径が 2 ( = 4 * 0.5) の NURBS トーラス
torus -r 4 -hr 0.5;
ポリゴン
-r フラグで表される全体の半径、 -sr フラグの値が輪の半径になります。
(例)
全体の半径が 4 、輪の半径が 2 の ポリゴントーラス
polyTorus -r 4 -sr 2;

Tips(ベイク)

鎖の個数が多くなった場合には、 ベイク処理をしてアニメーションをキーフレームに変換しておくと、 アニメーションの表示が軽くなります。
GUI のメニューでは 編集 → キー → ベイク シミュレーション □ 、 MEL では bakeResults コマンドを使用します。
以下のコマンドは、nurbsTorus1 〜 nurbsTorus10 に対して 1 フレームから 300 フレームまで アトリビュートの tx, ty, tz, rx, ry, rz をベイク処理するコマンドです。
bakeResults -simulation true -t "1:300" -sampleBy 1 -at "tx" -at "ty" -at "tz" -at "rx" -at "ry" -at "rz" nurbsTorus1 nurbsTorus2 nurbsTorus3 nurbsTorus4 nurbsTorus5 nurbsTorus6 nurbsTorus7 nurbsTorus8 nurbsTorus9 nurbsTorus10;
ダイナミクスのベイク処理をする場合には、上のように -simulation true が必要です。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail