コンストレイン 1

コンストレインとは

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

コンストレインは constrain コマンドによって作られます。

コンストレインの種類

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

Nail コンストレイン
1 つのリジッドボディーから作られるコンストレインで、 一方を空間中の点に固定されたひもによってつながれたオブジェクトを表現できます。
Pin コンストレイン
2 つのリジッドボディーから作られるコンストレインで、 2 つのリジッドボディの間をピンでとめたようになります。
Hinge コンストレイン
1 つまたは 2 つのリジッドボディーから作られるコンストレインで、 空間の 1 点、または他のリジッドボディにとめられたようになります。
壁につけたドアなどを作ることができます。
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() のアニメーション実行図]

スクリプトの解説

global proc makeFuriko1()
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