ソフトボディ

ソフトボディとは

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

soft のフラグ

-convert
ジオメトリをソフトボディに変換する。
-duplicate
ジオメトリのコピーをソフトボディに変換する。
ゼラチン状にゆれる形状を作る時などに使用される。
-goal float
ジオメトリのコピーをソフトボディに変換(duplicate)し、オリジナルのオブジェクトにしたがう値(weight)を決める。(0.0 〜 1.0)
weigth の値が 0.0 であれば、自由に動く柔らかいソフトボディになり、 1.0 であればオリジナルと変らない固いソフトボディになる。
-goal フラグを使用すると自動的に -duplicate フラグを指定したことになる。

soft コマンドの使用例

シンプルな、風になびく旗を作ってみよう。

  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 のアニメーション実行図]

スクリプトの解説

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 プレーンがシーンの中で見えたままなので、以下のコマンドでシェープノードの 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 コマンドによって返されるフィールド名は一つだけだが、名前を代入する変数は配列にしないとエラーになる。
-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 == 0.5
frequency が 1.5 の場合
frequency == 1.5

練習

練習課題

参考


Prev | Next
Home | Contents
Mail