コンストレイン 2

鎖を作る

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

作り方

  1. 輪を作る。
    [1 つ目の鎖の輪]
  2. 次の輪を前の輪と重ならないように、適当に回転・移動させて作る。
    [2 つの鎖の輪]
  3. 2 つ輪の間を pin コンストレインでとめる。
    [鎖の輪と輪をつなぐ pin コンンストレイン]
  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. Script EditorFile → Source Script によって makeChain1.mel を読み込む。
  3. Script Editor の下のウインドウから makeChain1(); と打ち込んで実行する。
    [makeChain1() の実行図]
  4. プレイバックしてアニメーションを実行する。
    [makeChain1() のアニメーション実行図]

スクリプトの解説

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

練習

練習課題

参考


Prev | Next
Home | Contents
Mail