ソフトボディ
ソフトボディとは
ソフトボディ によって、 NURBS、ポリゴンやラティスを柔らかい物体として表現できます。
ただし、トリムされた NURBS は、ポリゴンに変換しないとソフトボディに変換できません。
ソフトボディを作ると、対応する CV や頂点にパーティクルが作られます。
そのパーティクルが、フィールドなどによってアニメーションされると、
対応した CV や頂点が同じようにアニメーションをするようになります。
MEL でソフトボディを作るためには、 soft コマンドを使用します。
soft コマンドのフラグ
- -convert
- NURBS、ポリゴンなどのジオメトリをソフトボディに変換します。
- -duplicate
- ジオメトリのコピーをソフトボディに変換します。
ゼラチン状にゆれる形状を作る時などに使用されます。
- -goal float
- ジオメトリのコピーをソフトボディに変換し、
オリジナルのオブジェクトにしたがう ウエイト 値を決めます。
値は 0.0 から 1.0 の間です。
ウエイト の値が 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]`;
setAttr ($pname[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 プレーンのトランスフォームノード名が入った配列変数です。
このコマンドによって、以下の 2 つのノードが作成されます。
- copyOfnurbsPlaneShape1
- NURBS プレーン nurbsPlaneShape1 から複製されたノードです。
- copyOfnurbsPlane1ParticleShape
- 複製された NURBS プレーンをアニメーションさせるためのパーティクルです。
オリジナルの NURBS プレーンのジオメトリが、
copyOfnurbsPlane1ParticleShape によって移動されて、
copyOfnurbsPlaneShape1 のジオメトリになります。
setAttr ($pname[0] + ".visibility") 0;
- この時点では、まだオリジナルの NURBS プレーンがシーンの中で見えたままです。
この NURBS プレーンを不可視にするために、
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;
- 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、
X, Y, Z 方向の位相を表すアトリビュート
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) の実行例
練習課題
参考
Prev | Next
Home | Contents
Mail