ソフトボディ
ソフトボディとは
ソフトボディ によって NURBS、ポリゴンやラティスを柔らかい物体として表現できます。
ただし、トリムされた NURBS はポリゴンに変換しないとソフトボディに変換できません。
ソフトボディを作ると対応する CV や頂点にパーティクルが作られ、
そのパーティクルがフィールドなどによってアニメーションされることによって、
対応した CV や頂点が同じようにアニメーションをするようになります。
MEL によってソフトボディを作るためには soft コマンドを使用する。
soft コマンドのフラグ
- -convert
- NURBS、ポリゴンなどのジオメトリをソフトボディに変換します。
- -duplicate
- ジオメトリのコピーをソフトボディに変換します。
ゼラチン状にゆれる形状を作る時などに使用されます。
- -goal float
- ジオメトリのコピーをソフトボディに変換し、
オリジナルのオブジェクトにしたがう weight 値を決めます。
値は 0.0 から 1.0 の間です。
weigth の値が 0.0 であれば、
自由に動く柔らかいソフトボディになり、
1.0 であればオリジナルと変らない固いソフトボディになります。
-goal フラグを使用すると自動的に
-duplicate フラグを指定したことになります。
soft コマンドの使用例
シンプルな、風になびく旗を作る MEL スクリプトです。
- 以下のMELスクリプトを makeFlag1.mel という名前で作ります。
global proc makeFlag1()
{
string $pname[] = `nurbsPlane -width 12.0 -lengthRatio 0.5 -patchesU 12 -patchesV 12`;
rotate 0 90 0;
string $soname[] = `soft -goal 0.5 $pname[0]`;
string $shname[] = `listRelatives -s $pname[0]`;
setAttr ($shname[0] + ".visibility") 0;
string $tname[] = `turbulence -pos -6.0 0.0 0.0 -magnitude 100.0 -attenuation 0.0`;
connectDynamic -f $tname[0] $soname[0];
expression -o $tname[0] -s "phaseX = 10.0 * frame; phaseY = 10.0 * frame; phaseZ = 10.0 * frame;";
}
- の によって makeFlag1.mel を読み込みます。
- の下のウインドウから makeFlag1(); と打ち込んで実行します。
- プレイバックしてアニメーションを実行します。
スクリプトの解説
global proc makeFlag1()
- makeFlag1() というプロシージャーの宣言です。
string $pname[] = `nurbsPlane -width 12.0 -lengthRatio 0.5 -patchesU 12 -patchesV 12`;
- NURBS プレーンを作ります。
各フラグの意味は以下の通りです。
- -width 12.0
- 幅幅は 12.0
- -lengthRatio 0.5
- 縦・横の比率は 0.5
横幅が 12.0 なので、縦は 6.0 になります。
- -patchesU 12
- U 方向のスパン数は 12
- -patchesV 12
- V 方向のスパン数は 12
rotate 0 90 0;
- NURBS プレーンを Y 軸周りに 90 度回転します。
string $soname[] = `soft -goal 0.5 $pname[0]`;
- NURBS プレーンをソフトボディに変換します。
旗のように、元の形がゆれるようなアニメーションをさせる場合は、
-goal が必要です。
- -goal 0.5
- オリジナルの NURBS プレーンにしたがう値は 0.5
このコマンドによって $pname[0] をトランスフォームノードとする NURBS プレーン nurbsPlaneShape1 から duplicate された NURBS プレーン copyOfnurbsPlaneShape1 が作られ、
その NURBS プレーンがパーティクル copyOfnurbsPlane1ParticleShape によってアニメーションされるようになります。
この時点では、まだオリジナルの NURBS プレーンがシーンの中で見えたままなので、
以下のコマンド(listRelatives と setAttr コマンド)でシェープノードの visibility アトリビュートを 0 (off)にして不可視にします。
string $shname[] = `listRelatives -shapes $pname[0]`;
- NURBS プレーンのトランスフォームノード($pname[0])からシェープノードを求めます。
$pname には、
$pname[0] の中にトランスフォームノードの名前 nurbsPlane1 と、
$pname[1] の中にインプットノードの名前 makeNurbPlane1 しか入っていないので、
シェープノードの名前を求めるためには listRelatives コマンドを使用する必要があります。
setAttr ($shname[0] + ".visibility") 0;
- オリジナルの NURBS プレーンを不可視にするために、
シェープノードのアトリビュート .visibility に 0 を設定します。
string $tname[] = `turbulence -pos -6.0 0.0 0.0 -magnitude 100.0 -attenuation 0.0`;
- 旗をアニメーションさせるために、
turbulence フィールドを作ります。
turbulence コマンドによって返されるフィールド名は 1 つだけですが、
名前を代入する変数は配列にしないとエラーになります。
- -pos -6.0 0.0 0.0
- turbulence フィールドの位置は (-6.0, 0.0, 0.0)
- -magnitude 100.0
- フィールドの強さは 100.0
- -attenuation 0.0
- フィールドの減衰率は 0.0
connectDynamic -f $tname[0] $soname[0];
- ソフトボディとturbulence フィールドをコネクトします。
expression -o $tname[0] -s "phaseX = 10.0 * frame; phaseY = 10.0 * frame; phaseZ = 10.0 * frame;";
- turbulence フィールドのアトリビュートにエクスプレッションを定義します。
ここでは phaseX, phaseY, phaseZ の 3 つのアトリビュートの式を同時に定義しています。
これらの位相を表すアトリビュートを変化させることによって波のような動きをさせることができます。
- -o $tname[0]
- エクスプレッションを定義するオブジェクトを指定します。
ここでは turbulence フィールドです。
- phaseX = 10.0 * frame;
- turbulence フィールドのアトリビュート
phaseX(X方向の位相)に
10.0 * frame
というエクスプレッションの式を定義します。
- phaseY = 10.0 * frame;
- phaseX と同じです。
- phaseZ = 10.0 * frame;
- phaseX と同じです。
Tips
上で説明した turbulence のアトリビュート
phaseX, phaseY, phaseZ 以外のアトリビュートで
frequency (デフォールトは 1.0)というアトリビュートを設定すると波の大きさを変えることができます。
上のスクリプトでは以下のように実行します。
setAttr ($tname[0] + ".frequency") frequencyの値;
frequency が 0.5 の場合
frequency が 1.5 の場合
練習
- 使用例の makeFlag1.mel を参考にして、makeFlag2.mel を作り、
turbulence フィールドの強さ -magnitude、
オリジナルのオブジェクトにしたがう値 -goal、
XYZ 方向の位相を表すアトリビュート phaseX, phaseY, phaseZ のエクスプレッションにおける係数 10.0 を引数で指定できるようにしてみましょう。
(プロシージャーの名前と引数)
makeFlag2(float 強さ, float したがう値, float X方向の位相, float Y方向の位相, float Z方向の位相)
(例)
makeFlag2(50.0, 0.42, 0.1, 0.2, 0.3) の実行例
(ヒント)
エクスプレッションにおける phaseX, phaseY, phaseZの係数を変数に置き換えるには、文字列の結合を使用します。
例えば、以下のような式があったとして
"x = 5 + y"
この式の 5 の部分を MEL の変数 $a にするには以下のようにします。
("x = " + $a + " + y")
練習課題
参考
Prev | Next
Home | Contents
Mail