ソフトボディ

ソフトボディとは

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

soft 関数のフラグ

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

soft 関数の使用例

シンプルな、風になびく旗を作る Python スクリプトです。

  1. 以下のPythonスクリプトを makeFlag1.py という名前で作ります。
    import maya.cmds
    
    def makeFlag1():
        pname = maya.cmds.nurbsPlane(width=12.0, lengthRatio=0.5, patchesU=12, patchesV=12)
        maya.cmds.rotate(0, 90, 0)
        soname = maya.cmds.soft(pname[0], goal=0.5)
    
        maya.cmds.setAttr((pname[0] + '.visibility'), 0)
    
        tname = maya.cmds.turbulence(pos=(-6.0, 0.0, 0.0), magnitude=100.0, attenuation=0.0)
        maya.cmds.connectDynamic(soname[0], f=tname[0])
        maya.cmds.expression(o=tname[0], s='phaseX = 10.0 * frame; phaseY = 10.0 * frame; phaseZ = 10.0 * frame;')
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeFlag1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ のインプット ウインドウから makeFlag1() と打ち込んで実行します。
    [makeFlag1.mel の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeFlag1.mel のアニメーション実行図]

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def makeFlag1():
makeFlag1() という関数の宣言です。
pname = maya.cmds.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
maya.cmds.rotate(0, 90, 0)
NURBS プレーンを Y 軸周りに 90 度回転します。
soname = maya.cmds.soft(pname[0], goal=0.5)
NURBS プレーンをソフトボディに変換します。
旗のように、元の形がゆれるようなアニメーションをさせる場合は、 goal が必要です。
goal=0.5
オリジナルの NURBS プレーンにしたがう値は 0.5
この関数によって pname[0] をトランスフォームノードとする NURBS プレーン nurbsPlaneShape1 から duplicate された NURBS プレーン copyOfnurbsPlaneShape1 が作られ、 その NURBS プレーンがパーティクル copyOfnurbsPlane1ParticleShape によってアニメーションされるようになります。
[ソフトボディの hypergraph]
maya.cmds.setAttr((pname[0] + ".visibility"), 0)
オリジナルの NURBS プレーンを不可視にするために、 オリジナルの NURBS プレーンのアトリビュート visibility に 0 を設定します。
tname = maya.cmds.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
maya.cmds.connectDynamic(soname[0], f=tname[0])
ソフトボディとturbulence フィールドをコネクトします。
maya.cmds.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)というアトリビュートを設定すると波の大きさを変えることができます。
上のスクリプトでは以下のように実行します。
maya.cmds.setAttr(($tname[0] + ".frequency"), frequencyの値)

frequency が 0.5 の場合
[frequency が 0.5 の場合の図]
frequency が 1.5 の場合
[frequency が 1.5 の場合の図]

練習

参考


Prev | Next
Home | Contents
Mail