コンストレイン 1

コンストレインとは

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

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

コンストレインの種類

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

ネイル(Nail) コンストレイン
1 つのアクティブリジッドボディーから作られるコンストレインです。
一方を空間中の点に固定された、棒によってつながれたような動きを表現できます。
ピン(Pin) コンストレイン
2 つのリジッドボディーから作られるコンストレインです。
2 つのリジッドボディの間を、ピンでとめたようになります。
ヒンジ(Hinge) コンストレイン
1 つまたは 2 つのリジッドボディーから作られるコンストレインです。
空間の 1 点、または他のリジッドボディにとめられた、 蝶番(ちょうつがい)のような動きを作ることができます。
壁につけたドアや、窓などを作ることができます。
バリア(Barrier) コンストレイン
1 つのリジッドボディーから作られるコンストレインです。
バリア(Barrier) コンストレインは大きなプレーンがオブジェクトのバリアとなって、 それ以上オブジェクトが進めなくなります。
スプリング(Spring) コンストレイン
1 つまたは 2 つのリジッドボディーから作られるコンストレインです。
オブジェクトが、バネにつながれたような状態になります。

constrain コマンドのフラグ

-nail
1 つのリジッドボディーから ネイル(Nail) コンストレインを作成します。
-pinConstraint
2 つのリジッドボディーから ピン(Pin) コンストレインを作成します。
-hinge
1 つまたは 2 つのリジッドボディーから ヒンジ(Hinge) コンストレインを作成します。
-directionalHinge
2 つのリジッドボディーから一方向の ヒンジ(Hinge) コンストレインを作成します。
-barrier
1 つのリジッドボディーから バリア(Barrier) コンストレインを作成します。
-spring
1 つまたは 2 つのリジッドボディーから スプリング(Spring) コンストレインを作成します。
-stiffness float
スプリングの固さの定数を設定します。デフォルト値は 5.0 です。
-damping float
ダンピング定数を設定します。
値を大きくすると、動きに対して抵抗力が大きくなります。 負の値にすると、動きを増すような力が働きます。
デフォルト値は 0.1、 範囲は -1000.0 〜 1000.0 です。
-restLength float
休止の長さを設定します。デフォルト値: 1.0 です。
-position float float float
コンストレインの位置を設定します。
デフォルト値は、 1 つのリジッドボディから作られるコンストレインでは、オブジェクトの重心、 2 つのリジッドボディから作られるコンストレインでは、リジッドボディの中間点になります。
-orientation float float float
コンストレインの向きを設定します。
ヒンジ(Hinge) および バリア(Barrier) のみについて有効です。 デフォルト値は (0.0, 0.0, 0.0) です。
-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. スクリプト エディタファイル → ソーススクリプト によって makeFuriko1.mel を読み込みます。
  3. スクリプト エディタ の下のウインドウから makeFuriko1(); と打ち込んで実行します。
    [makeFuriko1() の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeFuriko1() のアニメーション実行図]

スクリプトの解説

global proc makeFuriko1()
makeFuriko1() というプロシージャの宣言です。
string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8`;
重力 フィールドを(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;
球体とコンストレインの 移動X 値の計算です。
$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];
重力 フィールドと球体をコネクトします。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail