フィールド
フィールドとは
フィールドによって自然界にある様々な力をシュミレートしてアニメーションを実行することができる。
作られたフィールドは connectDynamic -fields によってパーティクル・ソフトボディ・リジッドボディなどにコネクトする。
フィールドの種類
- スタンドアローンフィールド
どのオブジェクトにも属さない単独のフィールド
- air
- 気体の動きをシュミレートするフィールド
- drag
- オブジェクトの動きに対して摩擦のような力が働くフィールド
- gravity
- 重力をシュミレートするフィールド
- newton
- 2つのオブジェクトが引力によってお互いに引きあう動きをシュミレートするフィールド
- radial
- 磁石のようにある点から離れたり、吸いつくような動きをシュミレートするフィールド
- turbulence
- 乱気流のようにランダムな動きを起こさせるフィールド
- uniform
- オブジェクトを一方向へ動かすフィールド
- vortex
- 渦や竜巻のような動きをシュミレートするフィールド
- volumeAxis
- ある空間領域内で働くフィールドを定義できる
- オブジェクトフィールド
オブジェクト(ポリゴン、Nurbs、パーティクル、lattice)に属すことができるフィールド。
フィールドが属しているオブジェクトの動きによってフィールドが作用する。
ひとつのオブジェクトには複数のフィールドが属することができ、
すべて、または一部の CV、エディトポイント、頂点、ラティスポイントの動きによってフィールドが作用する。
オブジェクトフィールドによってキャラクターが歩くと、ほこりが舞上がるようなアニメーションを作ることができる。
- air
- newton
- radial
- turbulence
- uniform
- vortex
- 空間領域フィールド
フィールドの影響範囲を立方体・球・シリンダ・コーン・トーラスなどの空間領域に限定することができる。
すべてのフィールドを空間領域フィールドにすることができる。
フィールドの使用例 (air)
以下のプロシージャーによってエミッターから発生するパーティクルがairフィールドによって飛ばされる。
- 以下のMELスクリプトをmakeField1.melという名前で作る。
global proc makeField1()
{
particle -p 0 5 0;
string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
string $pname[] = `particle`;
connectDynamic -emitters $ename[0] $pname[0];
string $aname[] = `air -pos 3 0 0 -maxDistance 5.0 -magnitude 1.0 -dx -1.0 -dy 0.0 -dz 0.0`;
connectDynamic -fields $aname[0] $pname[0];
}
- の によって makeField1.mel を読み込む。
- の下のウインドウから makeField1(); と打ち込んで実行する。
- プレイバックしてアニメーションを実行する。
上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示している。
スクリプトの解説
particle -p 0 5 0;
- パーティクルを(0, 5, 0)の位置に作る。
(パーティクルの発生源)
string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
- そのパーティクルに対してY軸に対して下方向に発生・運動するエミッターを作り、作られたエミッターの名前を $ename (配列)に代入する。
$ename[0] にエミッターの名前が入る。
string $pname[] = `particle`;
- emitterによって発生させられるパーティクルを作る。
$pname[0]にパーティクルの Transform ノード、
$pname[1]にパーティクルの Shape ノードが入る。
connectDynamic -emitters $ename[0] $pname[0];
emitter($ename[0]) とパーティクル($pname[0])をコネクトする。
これでエミッターからパーティクルを発生するようになる。
string $aname[] = `air -pos 3 0 0 -maxDistance 5.0 -magnitude 1.0 -dx -1.0 -dy 0.0 -dz 0.0`;
- air フィールド作る。(スタンドアローンフィールド)
作られた air フィールドの名前を $aname[0] に代入しておく。
各フラグの意味は以下の通り。
- -pos 3 0 0
- 位置は3 0 0
- -maxDistance 5.0
- air の届く範囲は5.0の距離まで
(この値が -1 であればコネクトされているすべてのパーティクルに air の影響がおよぶ)
- -magnitude 1.0
- airのスピード
- -dx -1.0 -dy 0.0 -dz 0.0
- -magnitude の方向
(X軸に平行でマイナス方向)
connectDynamic -fields $aname[0] $pname[0];
- air フィールド($aname)をパーティクル($pname)にコネクトする。
これでパーティクルが air フィールドによって影響されるようになる。
フィールドの使用例(newton)
以下のプロシージャーによってエミッターから発生するパーティクルが newton フィールドによって nurbsPlane の中に吸い込まれてゆく。
- 以下のMELスクリプトを makeField2.mel という名前で作る。
global proc makeField2()
{
particle -p 5 10 0;
string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
string $pname[] = `particle`;
connectDynamic -emitters $ename[0] $pname[0];
nurbsPlane;
scale 0 10 10;
string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;
connectDynamic -fields $nname[0] $pname[0];
}
- の によって makeField2.mel を読み込む。
- の下のウインドウから makeField2(); と打ち込んで実行する。
- プレイバックしてアニメーションを実行する。
上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示している。
スクリプトの解説
スクリプトの前半はmakeField1.melと同じなので、後半のみ解説する。
nurbsPlane;
- フィールドを追加するための nurbsPlane を作る。
scale 0 10 10;
- アニメーションを見やすくするために、適当にスケールをかける。
string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;
nurbsPlane に属するフィールドを作成する。(オブジェクトフィールド)
nurbsPlane はセレクトされた状態なので名前を指定する必要は無い。
各フラグの意味は以下の通り。
- -magnitude 1.0
- フィールドの強さは 1.0
- -maxDistance 8.0
- フィールドの作用する距離が 8.0
- -attenuation 0.98
- フィールドとパーティクルの距離が大きくなるに従って 0.98 乗づつ強さが小さくなる。
この値が 0 だと距離に関係なく力は一定になる。
connectDynamic -fields $nname[0] $pname[0];
- newton フィールド($nname)をパーティクル($pname)にコネクトする。
これでエミッターによって作られたパーティクルが newton フィールドによって影響されるようになる。
練習
-
使用例の makeField1.mel を参考にして、makeField3.mel を作り air フィールドの速度(-magnitude)の値と、その方向(-dx, -dy, -dz)を引数で変化させることができるようにしてみよう。
makeField3(float 速度, float X方向, float Y方向, float Z方向)
-
使用例の makeField2.mel を参考にして、makeField4.mel を作り newton フィールドの強さ(-magnitude)の値と、最大距離(-maxDistance)と力の変化(-attenuation)を引数で変化させることができるようにしてみよう。
makeField4(float 強さ, float 最大距離, float 力の変化)
練習課題
参考
Prev | Next
Home | Contents
Mail