ここでは ピン コンストレインを使用して鎖を作ってみましょう。
コンストレインを使用して鎖を作ると、
物理的に正確な動きにはなりませんが、
リジッドボディのコリジョンだけを使用した場合に比べて計算が軽くなるし、
リジッドボディ同士が貫入するというトラブルを避けることができます。
上の作り方を参考にして、以下のように鎖を作るスクリプトを作ってみましょう。
import maya.cmds
def makeChain1():
ptname = ''
gname = maya.cmds.gravity()
for i in range(1, 11):
tname = maya.cmds.torus(hr=0.2)
maya.cmds.scale(2, 3, 2)
maya.cmds.rotate(0, (i % 2 * 90), 90)
maya.cmds.move((i * 4), 0, 0)
if i is 1:
maya.cmds.constrain(tname[0], nail=True, p=(0, 5, 0))
else:
maya.cmds.constrain(ptname, tname[0], pin=True)
maya.cmds.connectDynamic(tname[0], f=gname[0])
ptname = tname[0]
import maya.cmds
def makeChain1():
ptname = ''
gname = maya.cmds.gravity()
for i in range(1, 11):
tname = maya.cmds.torus(hr=0.2)
maya.cmds.scale(2, 3, 2)
maya.cmds.rotate(0, (i % 2 * 90), 90)
maya.cmds.move((i * 4), 0, 0)
if i is 1:
maya.cmds.constrain(tname[0], nail=True, p=(0, 5, 0))
else:
maya.cmds.constrain(ptname, tname[0], pin=True)
maya.cmds.connectDynamic(tname[0], f=gname[0])
ptname = tname[0]
トーラスにおける全体の半径と、輪の半径との関係は以下のようになっています。
鎖の個数が多くなった場合には、
ベイク処理をしてアニメーションをキーフレームに変換しておくと、
アニメーションの表示が軽くなります。
GUI のメニューでは 編集 → キー → ベイク シミュレーション □ 、
Python では bakeResults() 関数を使用します。
以下のコマンドは、nurbsTorus1 〜 nurbsTorus10 に対して
1 フレームから 300 フレームまで
アトリビュートの tx, ty, tz, rx, ry, rz をベイク処理する関数です。
maya.cmds.bakeResults('nurbsTorus1', 'nurbsTorus2', 'nurbsTorus3', 'nurbsTorus4', 'nurbsTorus5', 'nurbsTorus6', 'nurbsTorus7', 'nurbsTorus8', 'nurbsTorus9', 'nurbsTorus10', simulation=True, t='1:300', sampleBy=1, at="tx", -at "ty", -at "tz", -at "rx", -at "ry", -at "rz")
オブジェクトの名前がすべて nurbsTorus で始まることがわかっていれば、
maya.cmds.bakeResults('nurbsTorus*', simulation=True, t='1:300', sampleBy=1, at="tx", -at "ty", -at "tz", -at "rx", -at "ry", -at "rz")
以下のように実行できます。
ダイナミクスのベイク処理をする場合には、上のように simulation=True が必要です。