ソフトボディ
ソフトボディとは
ソフトボディ によって Nurbs、ポリゴンやラティスを柔らかい物体として表現できる。
(ただし、トリムされた NURBS はポリゴンに変換しないとソフトボディに変換できない)
ソフトボディを作ると対応する CV や頂点にパーティクルが作られ、
そのパーティクルがフィールドなどによってアニメーションされると、
対応した CV や頂点が同じようにアニメーションをする。
ソフトボディを作るには soft コマンドを使用する。
soft のフラグ
- -convert
- ジオメトリをソフトボディに変換する。
- -duplicate
- ジオメトリのコピーをソフトボディに変換する。
ゼラチン状にゆれる形状を作る時などに使用される。
- -goal float
- ジオメトリのコピーをソフトボディに変換(duplicate)し、オリジナルのオブジェクトにしたがう値(weight)を決める。(0.0 〜 1.0)
weigth の値が 0.0 であれば、自由に動く柔らかいソフトボディになり、
1.0 であればオリジナルと変らない固いソフトボディになる。
-goal フラグを使用すると自動的に -duplicate フラグを指定したことになる。
soft コマンドの使用例
シンプルな、風になびく旗を作ってみよう。
- 以下の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(); と打ち込んで実行する。
- プレイバックしてアニメーションを実行する。
スクリプトの解説
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 プレーンがシーンの中で見えたままなので、以下のコマンドでシェープノードの 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 コマンドによって返されるフィールド名は一つだけだが、名前を代入する変数は配列にしないとエラーになる。
- -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 フィールドのアトリビュートにエクスプレッションを定義する。
ここでは 3 つのアトリビュート(phaseX, phaseY, phaseZ)の式を ; で区切ることによって同時に定義している。
これらの位相を表すアトリビュートを変化させることによって波のような動きをさせることができる。
- -o $tname[0]
- エクスプレッションを定義するオブジェクトを指定する。
ここでは turbulence フィールド。
- phaseX = 10.0 * frame;
- turbulence フィールドの
アトリビュート
phaseX(X方向の位相)に
10.0 * frame
というエクスプレッションの式を定義する。
- phaseY = 10.0 * frame;
- phaseX と同じ。
- phaseZ = 10.0 * frame;
- phaseX と同じ。
turbulence のアトリビュート
上で説明した phaseX, phaseY, phaseZ 以外のアトリビュートで
frequency (デフォールトは 1.0)というアトリビュートを設定すると波の大きさを変えることができる。
上のスクリプトでは
setAttr ($tname[0] + ".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