ゴール
ゴールとは
ゴール(Goal)とは、パーティクルが移動するときに目標とするオブジェクトのことです。
ゴールを設定することによって、
パーティクルと目標の物体の間に、スプリングがついているかのようなアニメーションを作成することができます。
カーブオンサーフェイスを除く、すべてのオブジェクトをゴールにすることができ 、
1 つのパーティクルに対してゴールを複数対応させることもできます。
ゴール使用例
文字を NURBS カーブで作成し、そのカーブから作られた プラナーサーフェス にゴールを設定してみましょう。
- 以下の MEL スクリプトを makeString1.mel という名前で作ります。
global proc makeString1()
{
string $text[] = `textCurves -f "Times-Roman" -t "Maya"`;
string $chars[] = `listRelatives $text[0]`;
string $psurf[];
int $i = 0;
for($curv in $chars)
{
string $pln[] = `planarSrf -polygon 1 $curv`;
$psurf[$i] = $pln[0];
setAttr ($psurf[$i] + ".v") 0;
$i++;
}
for($ps in $psurf)
{
string $ename[] = `emitter -pos 1.5 10.0 1.5 -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2`;
string $pname[] = `particle`;
setAttr ($pname[0] + ".particleRenderType") 4;
string $shp[] = `listRelatives -s $pname`;
addAttr -ln "radius" -at "float" $shp;
setAttr ($shp[0] + ".radius") 0.05;
connectDynamic -emitters $ename[0] $pname[0];
goal -goal $ps -weight 0.2 $pname[0];
setAttr ($pname[0] + ".conserve") 0.9;
}
}
- の によって makeString1.mel を読み込みます。
- のインプットウインドウで、makeString1() を実行します。
(makeString1() 実行後の図)
- アニメーションを実行します。
スクリプトの解説
global proc makeString1()
- makeString1 というプロシージャの宣言です。
string $text[] = `textCurves -f "Times-Roman" -t "Maya"`;
- Times-Roman というフォントを使用して、 Maya という文字の形で NURBS カーブを作ります。
変数 $text[0] には作られたカーブシェイプのトランスフォームノードの名前が入ります。
以下の図では、 Text_Maya_2 が $text[0] に入る名前です。
string $chars[] = `listRelatives $text[0]`;
- トランスフォームノードから各カーブシェープの名前を求めます。
上の図では、 Char_M_2, Char_a_3, Char_y_2, Char_a_4 が $chars に入る名前です。
string $psurf[];
- この後に作成される プラナーサーフェス の名前を入れるための配列宣言です。
int $i = 0;
- 整数変数 $i を宣言し、 0 で初期化します。
for($curv in $chars)
- 各カーブシェイプの名前を 1 つづつ変数 $curv に代入して以下のコマンドを実行します。
string $pln[] = `planarSrf -polygon 1 $curv`;
- カーブシェイプから プラナーサーフェス を作ります。
$pln[0] にトランスフォームノードの名前、
$pln[1] にインプットノードの名前が入ります。
- -polygon 1
- ポリゴンのサーフェイスを作成します。
以下の値をとることができます。
- 0
- NURBSサーフェイス
- 1
- ポリゴン
- 2
- Subdivision サーフェイス
- 3
- Bezier サーフェイス
- 4
- Subdivision サーフェイスソリッド
$psurf[$i] = $pln[0];
- プラナーサーフェス の トランスフォームノード名を $psurf[$i] に代入します。
setAttr ($psurf[$i] + ".v") 0;
- プラナーサーフェス の visibirity を 0 にして、表示されないようにしておきます。
$i++;
- $i に 1 を加算します。
for($ps in $psurf)
- 1 つ 1 つの プラナーサーフェス の名前を変数 $ps に代入して以下のコマンドを実行します。
string $ename[] = `emitter -pos 1.5 10.0 1.5 -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2`;
- エミッターを作ります。
- -pos 1.5 3.0 1.5
- (1.5, 3.0, 1.5) の位置にエミッターを作成します。
- -type "direction" -dx 0.0 -dy -1.0 -dz 0.0
- (0.0, 1.0, 0.0) の方向にパーティクルを発生させます。
- -spread 0.2
-
パーティクルを発生させる角度を決定します。
1.0 で 180 度になります。
string $pname[] = `particle`;
- エミッターから放出されるパーティクルを作ります。
setAttr ($pname[0] + ".particleRenderType") 4;
- パーティクルの particleRenderType アトリビュートを 4 にして、
パーティクルの形を球体にします。
string $shp[] = `listRelatives -s $pname`;
- パーティクルのシェープノードを求めて、変数 $shp に代入します。
addAttr -ln "radius" -at "float" $shp;
- パーティクルのシェープノードに float 型のアトリビュート radius を追加します。
この radius アトリビュートが球体の半径を表します。
setAttr ($shp[0] + ".radius") 0.05;
- 球体の半径を 0.05 にします。
connectDynamic -emitters $ename[0] $pname[0];
- エミッターとパーティクルをコネクトして、
エミッターからパーティクルが放出されるようにします。
goal -goal $ps -weight 0.2 $pname[0];
- パーティクルを文字を表す プラナーサーフェス に対してゴールの設定をします。
setAttr ($pname[0] + ".conserve") 0.9;
- パーティクルのゴールに対する振れのぐあいを設定をします。
このアトリビュートを 0.0 にすると、まったく振れなくなります。
Tips (フォントのリスト)
Maya で使用できるフォントのリストを表示するには、
以下のコマンドを実行します。
fontDialog;
練習
- 使用例の makeString1.mel を参考にして、makeString2.mel を作り、
エミッターから放出されるパーティクルの個数を制限できるようにしてみましょう。
ここでは 1 文字あたり、
1秒間に放出されるパーティクル数を 300 にして、
1 秒後にパーティクルの放出が止まるようにしてください。
(実行例)
- の によって makeString2.mel を読み込みます。
(makeString2() 実行後の図)
- アニメーションを実行します。
1 文字あたり 300 個のパーティクルが作られて、1 秒後にエミッターからの放出が止まります。
(ヒント)
パーティクルの放出量をコントロールするためには、
エミッターの rate アトリビュートを 0 フレーム目に 300 、
30 フレーム目に 0 になるようにアニメーションをつければよいでしょう。
そのためには、 キーフレームによる方法と、
エクスプレッションを使用する方法があります。
キーフレームによって rate アトリビュートにアニメーションをつける場合には、
以下のコマンドによってタンジェントのタイプを step にしておいたほうがよいでしょう。
keyTangent -outTangentType "step" -attribute "rate" エミッター名;
練習課題
参考
- Maya
Maya, MEL, Maya関係のコマンドなどのページ。
Prev | Next
Home | Contents
Mail