ソフトボディ

ソフトボディとは

ソフトボディ によって 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 スクリプトです。

  1. 以下の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;";
    }
    
  2. Script EditorFile → Source Script によって makeFlag1.mel を読み込みます。
  3. Script Editor の下のウインドウから makeFlag1(); と打ち込んで実行します。
    [makeFlag1.mel の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeFlag1.mel のアニメーション実行図]

スクリプトの解説

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 によってアニメーションされるようになります。
[ソフトボディの hypergraph]
この時点では、まだオリジナルの NURBS プレーンがシーンの中で見えたままなので、 以下のコマンド(listRelativessetAttr コマンド)でシェープノードの visibility アトリビュートを 0 (off)にして不可視にします。
string $shname[] = `listRelatives -shapes $pname[0]`;
NURBS プレーンのトランスフォームノード($pname[0])からシェープノードを求めます。
$pname には、 $pname[0] の中にトランスフォームノードの名前 nurbsPlane1 と、 $pname[1] の中にインプットノードの名前 makeNurbPlane1 しか入っていないので、 シェープノードの名前を求めるためには listRelatives コマンドを使用する必要があります。
[NURBS プレーンの hypergraph]
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 == 0.5
frequency が 1.5 の場合
frequency == 1.5

練習

練習課題

参考


Prev | Next
Home | Contents
Mail