コンストレイン 2
鎖を作る
ここでは pin コンストレインを使用して鎖を作ってみよう。
コンストレインを使用して鎖を作ると、
物理的に正確な動きにはならないが、
リジッドボディのコリジョンだけを使用した場合に比べて計算が軽くなるし、
リジッドボディ同士が貫入するというトラブルを避けることができる。
作り方
- 輪を作る。
- 次の輪を前の輪と重ならないように、適当に回転・移動させて作る。
- 2 つ輪の間を pin コンストレインでとめる。
- 2, 3 を繰り返す。
constrain コマンドの使用例 2
上の作り方を参考にして、以下のように鎖を作るスクリプトを作ってみよう。
- プログラムを簡単にするために輪としてトーラスを使う。
- 1 個目の輪だけ nail コンストレインで固定しておく。
- すぐにアニメーションを実行できるように gravity フィールドを作用させておく。
- 以下のMELスクリプトを makeChain1.mel という名前で作る。
global proc makeChain1()
{
int $i;
string $tname[];
string $ptname;
string $gname[] = `gravity`;
for($i = 1; $i <= 10; $i++)
{
$tname = `torus -hr 0.2`;
scale 2 3 2;
rotate 0 ($i % 2 * 90) 90;
move ($i * 4) 0 0;
if($i == 1)
{
constrain -nail -p 0 5 0 $tname[0];
}
else
{
constrain -pin $ptname $tname[0];
}
connectDynamic -f $gname[0] $tname[0];
$ptname = $tname[0];
}
}
- の によって makeChain1.mel を読み込む。
- の下のウインドウから makeChain1(); と打ち込んで実行する。
- プレイバックしてアニメーションを実行する。
スクリプトの解説
int $i;
for
ループ用の変数。
string $tname[];
- 鎖の輪になるトーラスの名前を入れておく変数。
torus コマンドの返り値は2つ(トランスフォームノードとインプットノード)なので配列になる。
string $ptname;
- 次の鎖の輪と pin コンストレインでつなぐために一時的にトーラスの名前(トランスフォームノードの名前)を入れておく変数。
string $gname[] = `gravity`;
- gravity フィールドを作って名前を $gname に代入する。
for($i = 1; $i <= 10; $i++)
- $i を 1 から 10 まで 10 回ループさせて鎖の輪を 10 個作る。
$tname = `torus -hr 0.2`;
- トーラスの輪の半径をトーラスの半径の 0.2 倍にして作り(-hr)、名前を $tname に代入する。
トーラスの半径はデフォールトで 1.0 なので輪の半径は 0.2 になる。
scale 2 3 2;
- トーラスに適当にスケールをかける。
同時に輪の半径もスケールされることに注意すること。
rotate 0 ($i % 2 * 90) 90;
- 一つおきに Y 軸方向に 90 度回転させる。
輪が X 軸方向に並ぶように Z 軸にも 90 度回転させる。
move ($i * 4) 0 0;
- となりの輪が重ならない程度に X 軸方向に移動させる。
if($i == 1)
constrain -nail -p 0 5 0 $tname[0];
- 1 個目の輪だけは nail コンストレイン(-nail)を使って
0 5 0 の位置にとめておく。
else
constrain -pin $ptname $tname[0];
- 2 個目以降の輪($tname)は 1 個前の輪($ptname)と pin コンストレイン(-pin)でとめてゆく。
costrainコマンドを使用することによって、2 つのトーラス $tname と $ptname は、自動的にリジッドボディになる。
connectDynamic -f $gname[0] $tname[0];
- 輪に gravity フィールド($gname)を作用させる。
$ptname = $tname[0];
- 次の輪とコンストレインするために、現在の輪の名前(トランスフォームノードの名前 $tname[0])を$ptname に代入しておく。
練習
- 使用例の makeChain1.mel を参考にして、makeChain2.mel を作り輪の個数、太さ、X, Y, Z 方向のスケールを引数で変化させることができるようにしてみよう。
また、太さやスケールの値によって各輪を移動させる距離も計算するようにしてみよう。
makeChain2(int 輪の個数, float 太さ, float X方向のスケール, float Y方向のスケール, float Z方向のスケール)
(注意)
トーラスの輪同士がぶつからないように各パラメータの値を決めないとエラーがでるので注意すること。
(例)
makeChain2(10, 0.1, 3.0, 4.0, 3.0)
プレイバック実行後
練習課題
参考
Prev | Next
Home | Contents
Mail