ソフトボディ

ソフトボディとは

ソフトボディ によって、 NURBS、ポリゴンやラティスを柔らかい物体として表現できます。
ただし、トリムされた NURBS は、ポリゴンに変換しないとソフトボディに変換できません。
ソフトボディを作ると、対応する CV や頂点にパーティクルが作られます。 そのパーティクルが、フィールドなどによってアニメーションされると、 対応した CV や頂点が同じようにアニメーションをするようになります。
MEL でソフトボディを作るためには、 soft コマンドを使用します。

soft コマンドのフラグ

-convert
NURBS、ポリゴンなどのジオメトリをソフトボディに変換します。
-duplicate
ジオメトリのコピーをソフトボディに変換します。
ゼラチン状にゆれる形状を作る時などに使用されます。
-goal float
ジオメトリのコピーをソフトボディに変換し、 オリジナルのオブジェクトにしたがう ウエイト 値を決めます。
値は 0.0 から 1.0 の間です。
ウエイト の値が 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]`;
    
    	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;";
    }
    
  2. スクリプト エディタファイル → ソーススクリプト によって makeFlag1.mel を読み込みます。
  3. スクリプト エディタ のインプット ウインドウから 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 プレーンのトランスフォームノード名が入った配列変数です。
このコマンドによって、以下の 2 つのノードが作成されます。
copyOfnurbsPlaneShape1
NURBS プレーン nurbsPlaneShape1 から複製されたノードです。
copyOfnurbsPlane1ParticleShape
複製された NURBS プレーンをアニメーションさせるためのパーティクルです。
オリジナルの NURBS プレーンのジオメトリが、 copyOfnurbsPlane1ParticleShape によって移動されて、 copyOfnurbsPlaneShape1 のジオメトリになります。
[ソフトボディの hypergraph]
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 が 0.5 の場合の図]
frequency が 1.5 の場合
[frequency が 1.5 の場合の図]

練習

練習課題

参考


Prev | Next
Home | Contents
Mail