コンストレイン 2

鎖を作る

ここでは ピン コンストレインを使用して鎖を作ってみましょう。
コンストレインを使用して鎖を作ると、 物理的に正確な動きにはなりませんが、 リジッドボディのコリジョンだけを使用した場合に比べて計算が軽くなるし、 リジッドボディ同士が貫入するというトラブルを避けることができます。

作り方

  1. 鎖の輪を作ります。
    輪はプリミティブのトーラスでも、独自のオブジェクトでもかまいません。
    [1 つ目の鎖の輪]
  2. 次の輪を前の輪と重ならないように、適当に回転・移動させて作ります。
    [2 つの鎖の輪]
  3. 2 つ輪の間を ピン コンストレインでとめます。
    [鎖の輪と輪をつなぐ ピン コンンストレイン]
  4. 2, 3 を繰り返します。

constrain コマンドの使用例 2

上の作り方を参考にして、以下のように鎖を作るスクリプトを作ってみましょう。

  1. 以下の Python スクリプトを makeChain1.py という名前で作ります。
    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]
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeChain1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ のインプット ウインドウから makeChain1() と打ち込んで実行します。
    [makeChain1() の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeChain1() のアニメーション実行図]

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def makeChain1():
makeChain1() という関数の宣言です。
ptname = ''
次の鎖の輪と ピン コンストレインでつなぐために、 一時的にトーラスのトランスフォームノードの名前を入れておく変数です。
gname = maya.cmds.gravity()
重力 フィールドを作って名前を gname に代入します。
for i in range(1, 11):
i を 1 から 10 まで 10 回ループさせて鎖の輪を 10 個作ります。
tname = maya.cmds.torus(hr=0.2)
トーラスの輪の半径を、 hr フラグによってトーラスの半径の 0.2 倍にして作り、 名前を tname に代入します。
トーラスの半径はデフォールトで 1.0 なので輪の半径は 0.2 になります。
maya.cmds.scale(2, 3, 2)
トーラスに適当にスケールをかけておきます。
同時に輪の半径もスケールされることに注意してください。
maya.cmds.rotate(0, (i % 2 * 90), 90)
1 つおきに Y 軸方向に 90 度回転させます。
輪が X 軸方向に並ぶように Z 軸にも 90 度回転させます。
maya.cmds.move((i * 4), 0, 0)
となりの輪が重ならない程度に X 軸方向に移動させます。
if i is 1:
  maya.cmds.constrain(tname[0], nail=True, p=(0, 5, 0))
1 個目の輪だけは ネイル コンストレイン(nail)を使って 0 5 0 の位置にとめておきます。
else:
  maya.cmds.constrain(ptname, tname[0], pin=True)
2 個目以降の輪(tname)は 1 個前の輪(tname)と ピン コンストレイン(pin)でとめてゆきます。
costrain()関数を使用することによって、 2 つのトーラス tnameptname は、 自動的にリジッドボディになります。
maya.cmds.connectDynamic(tname[0], f=gname[0])
輪に 重力 フィールド(gname)を作用させます。
ptname = tname[0]
次の輪とコンストレインするために、 現在の輪のトランスフォームノードの名前 tname[0]ptname に代入しておきます。

Tips(torus)

トーラスにおける全体の半径と、輪の半径との関係は以下のようになっています。

NURBS
r フラグで表される全体の半径に hr フラグで表される数値を乗算した値が輪の半径になります。
(例)
全体の半径が 4 、輪の半径が 2 ( = 4 * 0.5) の NURBS トーラス
maya.cmds.torus(r=4, hr=0.5)
ポリゴン
r フラグで表される全体の半径、 sr フラグの値が輪の半径になります。
(例)
全体の半径が 4 、輪の半径が 2 の ポリゴントーラス
maya.cmds.polyTorus(r=4, sr=2)

Tips(ベイク)

鎖の個数が多くなった場合には、 ベイク処理をしてアニメーションをキーフレームに変換しておくと、 アニメーションの表示が軽くなります。
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 が必要です。

練習

参考


Prev | Next
Home | Contents
Mail