コンストレイン 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 コンストレインでも作成できるが、動きの方向がずれるので、うまくいかない。
- 以下の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];
}
}
- の によって makeFuriko1.mel を読み込む。
- の下のウインドウから 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 フィールドと球をコネクトする。
練習
- 使用例の makeFuriko1.mel を参考にして、makeFuriko2.mel を作り球の個数、リジッドボディの質量(-mass)、弾性係数(-bounciness)を引数で変化させることができるようにしてみよう。
makeFuriko2(int 球の個数, float 質量, float 弾性係数)
(例)
makeFuriko2(5, 1.0, 1.5)
プレイバック実行後
練習課題
参考
Prev | Next
Home | Contents
Mail