コンストレイン 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 コンストレインでも作成できますが、
動きの方向がずれるので、うまくいきません。
- 以下の 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(); と打ち込んで実行します。
- プレイバックしてアニメーションを実行します。
スクリプトの解説
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 フィールドと球をコネクトします。
練習
- 使用例の makeFuriko1.mel を参考にして、makeFuriko2.mel を作り球の個数、
リジッドボディの質量(-mass)、
弾性係数(-bounciness)を引数で変化させることができるようにしてみましょう。
(プロシージャーの名前と引数)
makeFuriko2(int 球の個数, float 質量, float 弾性係数)
(例)
makeFuriko2(5, 1.0, 1.5)
プレイバック実行後
練習課題
課題ボタンは授業2時間目の開始時に表示される。
授業終了30分後に課題ボタンの表示が消えるので注意すること。
授業時間後に課題を提出したい者は、他の全クラスの授業が終了するまで待って、ボタンが表示されてから提出すること。
(全クラスの授業が終了するまでボタンは表示されない。)
参考
Prev | Next
Home | Contents
Mail