コンストレイン 1

コンストレインとは

コンストレインとはリジッドボディの運動を制限するものである。
これによって振り子、蝶番(ちょうつがい)など、 空間中の点や他のリジッドボディに動きを拘束されたアニメーションを作成することができる。
オブジェクトにコンストレインを設定すると、そのオブジェクトは自動的にリジッドボディになる。

コンストレインの種類

各コンストレンは作成した後、オブジェクトやコンストレインを移動すると コンストレンの長さや位置を変化させることができる。

Nail コンストレイン
1つのリジッドボディーから作られるコンストレインで、 一方を空間中の点に固定されたひもにつながれたオブジェクトを表現できる。
Pin コンストレイン
2つのリジッドボディーから作られるコンストレインで、 2つのリジッドボディの間をピンでとめたようになる。
Hinge コンストレイン
1つまたは2つのリジッドボディーから作られるコンストレインで、 空間の一点、または他のリジッドボディにとめられたようになる。
壁につけたドアなどを作ることができる。
Barrierコンストレイン
1つのリジッドボディーから作られるコンストレインである。
Barrierコンストレインは大きな平面でオブジェクトのバリアとなって、 それ以上オブジェクトが進めなくなる。
Spring コンストレイン
1つまたは2つのリジッドボディーから作られるコンストレインである。
オブジェクトがバネにつながれたような状態になる。

constrain のフラグ

-na | -nail
1つのリジッドボディーから Nail コンストレインを作成する。
-pin | -pinConstraint
2つのリジッドボディーから Pin コンストレインを作成する。
-hi | -hinge
1つまたは2つのリジッドボディーから Hinge コンストレインを作成する。
-dhi | -directionalHinge
2つのリジッドボディーから一方向の Hinge コンストレインを作成する。
-br | -barrier
1つのリジッドボディーから Barrierコンストレインを作成する。
-s | -spring
1つまたは2つのリジッドボディーから Springコンストレインを作成する。
-st | -stiffness float
スプリングの固さの定数を設定する。デフォルト値は 5.0。
-d | -damping float
ダンピングコンストレインを作成する。 デフォルト値は 0.1、 範囲は -1000.0 〜 1000.0。
-rl | -restLength float
休止の長さを設定する。デフォルト値: 1.0
-p | -position float float float
コンストレインの位置を設定する。
デフォルト値は1つのリジッドボディから作られるコンストレインではオブジェクトの重心、 2つのリジッドボディから作られるコンストレインではリジッドボディの中間点になる。
-o | -orientation float float float
コンストレインの向きを設定する。
Hinge および Barrier のみについて有効。 デフォルト値は <0.0, 0.0, 0.0>。
-i | -interpenetrate boolean
リジッドボディーが貫通するかどうかを設定する。
true で貫通、false で貫通しない。

constrain コマンドの使用例

Hinge コンストレインを使用してニュートンの振り子を作ってみよう。
Nail コンストレインでも作成できるが、動きの方向がずれるので、うまくいかない。

  1. 以下のMELスクリプトを makeFuriko1.mel という名前で作る。
    global proc makeFuriko1()
    {
    	int $i;
    	string $sname[];
    
    	string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
    	for($i = 0; $i < 3; $i++)
    	{
    		$sname = `sphere`;
    		float $x = 2.03 * $i;
    		move $x 0 0;
    		if($i == 0)
    		{
    			move 0 5 0 ($sname[0] + ".rotatePivot");
    			rotate 0 0 -80;
    		}
    		rigidBody -active -mass 0.5 -bounciness 1.0;
    		constrain -hinge -p $x 5 0 ;
    		connectDynamic -f $gname[0] $sname[0];
    	}
    }
    
  2. Script EditorFile → Source Script によって makeFuriko1.mel を読み込む。
  3. Script Editor の下のウインドウから makeFuriko1(); と打ち込んで実行する。
    [makeFuriko1() の実行図]
  4. プレイバックしてアニメーションを実行する。
    [makeFuriko1() のアニメーション実行図]

スクリプトの解説

string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
gravity フィールドを(0, 0, 0)の位置に、フィールドの強さ 9.8 で作る。
for($i = 0; $i < 3; $i++)
以下のループを 3 回繰り返し実行する。
この結果、3 個のヒンジのついた球が作られる。
$sname = `sphere`;
NURBS の球を作り、トランスフォームノードの名前を $sname[0] に、 インプットノードの名前を $sname[1] に代入する。
float $x = 2.03 * $i;
球とコンストレインの translateX 値の計算。
$i に 2.0 ではなく 2.03 を乗算しているのは、 球の間にわずかなすき間を開けておかないと、 うまくアニメーションしてくれないからである。
move $x 0 0;
作られた球を($x, 0, 0)だけ移動する。
if($i == 0)
$i が 0 の時(1 個目の球の場合)、以下のブロック({ から }まで)を実行する。
プレイバックする時に便利なように 1 個目の球だけ回転させておく。 
move 0 5 0 ($sname[0] + ".rotatePivot");
球の回転の中心(ピボット)を(0, 5, 0)に移動する。
rotate 0 0 -80;
移動したピボットを中心に Z 軸周り -80 度回転させる。
rigidBody -active -mass 0.5 -bounciness 1.0;
球をリジッドボディにする。
オブジェクトにコンストレインを設定すると自動的にリジッドボディになるが、 リジッドボディのアトリビュートを設定するために、あらかじめリジッドボディにしておく。
-mass 0.5
質量は 0.5
-bounciness 1.0
弾性係数は 1.0
constrain -hinge -p $x 5 0 ;
球にコンストレインを設定する。
-hinge
コンストレインの形式はヒンジにする。
-p $x 5 0
ヒンジの位置は $x
connectDynamic -f $gname[0] $sname[0];
gravity フィールドと球をコネクトする。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail