コンストレイン 1

コンストレインとは

コンストレインとはリジッドボディの運動を制限するものです。
これによって振り子、蝶番(ちょうつがい)など、 空間中の点や他のリジッドボディに動きを拘束されたアニメーションを作成することができます。
オブジェクトにコンストレインを設定すると、 そのオブジェクトは自動的にリジッドボディになります。

コンストレインは maya.cmds.constrain() 関数によって作られます。

コンストレインの種類

各コンストレンは作成した後、 オブジェクトやコンストレインを移動すると コンストレンの長さや位置を変化させることができます。

ネイル(Nail) コンストレイン
1 つのリジッドボディーから作られるコンストレインで、 一方を空間中の点に固定されたひもによってつながれたオブジェクトを表現できます。
ピン(Pin) コンストレイン
2 つのリジッドボディーから作られるコンストレインで、 2 つのリジッドボディの間をピンでとめたようになります。
ヒンジ(Hinge) コンストレイン
1 つまたは 2 つのリジッドボディーから作られるコンストレインで、 空間の 1 点、または他のリジッドボディにとめられたようになります。
壁につけたドアなどを作ることができます。
バリア(Barrier) コンストレイン
1 つのリジッドボディーから作られるコンストレインです。
バリア(Barrier) コンストレインは大きな平面がオブジェクトのバリアとなって、 それ以上オブジェクトが進めなくなります。
スプリング(Spring) コンストレイン
1 つまたは 2 つのリジッドボディーから作られるコンストレインです。
オブジェクトがバネにつながれたような状態になります。

constrain 関数のフラグ

na | nail=True
1 つのリジッドボディーから ネイル(Nail) コンストレインを作成します。
pin | pinConstraint=True
2 つのリジッドボディーから ピン(Pin) コンストレインを作成します。
hi | hinge=True
1 つまたは 2 つのリジッドボディーから ヒンジ(Hinge) コンストレインを作成します。
dhi | directionalHinge=True
2 つのリジッドボディーから一方向の ヒンジ(Hinge) コンストレインを作成します。
br | barrier=True
1 つのリジッドボディーから バリア(Barrier) コンストレインを作成します。
s | spring=True
1 つまたは 2 つのリジッドボディーから スプリング(Spring) コンストレインを作成します。
st | stiffness=float
スプリングの固さの定数を設定します。デフォルト値は 5.0 です。
d | damping=float
ダンピングコンストレインを作成します。 デフォルト値は 0.1、 範囲は 1000.0 〜 1000.0 です。
rl | restLength=float
休止の長さを設定します。デフォルト値: 1.0 です。
p | position=(X, Y, Z)
コンストレインの位置を設定します。
デフォルト値は 1 つのリジッドボディから作られるコンストレインではオブジェクトの重心、 2 つのリジッドボディから作られるコンストレインではリジッドボディの中間点になります。
o | orientation=(X, Y, Z)
コンストレインの向きを設定します。
ヒンジ(Hinge) および バリア(Barrier) のみについて有効です。 デフォルト値は <0.0, 0.0, 0.0> です。
i | interpenetrate=True
リジッドボディーが貫通するように設定します。

constrain 関数の使用例

ヒンジ(Hinge) コンストレインを使用してニュートンの振り子を作ってみましょう。
ネイル(Nail) コンストレインでも作成できますが、 動きの方向がずれるので、うまくいきません。

  1. 以下の Python スクリプトを makeFuriko1.py という名前で作ります。
    import maya.cmds
    
    def makeFuriko1():
        gname = maya.cmds.gravity(pos=(0, 0, 0), magnitude=9.8)
        for i in range(0, 3):
            sname = maya.cmds.sphere()
            x = 2.03 * i
            maya.cmds.move(x, 0, 0)
            if i is 0:
                maya.cmds.move(0, 5, 0, (sname[0] + '.rotatePivot'))
                maya.cmds.rotate(0, 0, -80)
            maya.cmds.rigidBody(active=True, mass=0.5, bounciness=1.0)
            maya.cmds.constrain(hinge=True, p=(x, 5, 0))
            maya.cmds.connectDynamic(sname[0], f=gname[0])
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeFuriko1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ の下のウインドウから makeFuriko1(); と打ち込んで実行します。
    [makeFuriko1() の実行図]
  4. プレイバックしてアニメーションを実行します。
    [makeFuriko1() のアニメーション実行図]

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
def makeFuriko1():
makeFuriko1() という関数の宣言です。
gname = maya.cmds.gravity(pos=(0, 0, 0), magnitude=9.8)
重力 フィールドを(0, 0, 0)の位置に、フィールドの強さ 9.8 で作ります。
for i in range(0, 3):
以下のループを 3 回繰り返し実行します。
この結果、3 個のヒンジのついた球が作られます。
sname = maya.cmds.sphere()
NURBS の球を作り、 トランスフォームノードの名前を sname[0] に、 インプットノードの名前を sname[1] に代入します。
x = 2.03 * i
球とコンストレインの 移動X 値の計算です。
i に 2.0 ではなく 2.03 を乗算しているのは、 球の間にわずかなすき間を開けておかないと、 うまくアニメーションしてくれないからです。
maya.cmds.move(x, 0, 0)
作られた球を(x, 0, 0)だけ移動します。
if i is 0:
i が 0 の時(1 個目の球の場合)、 move<() 関数と rotate()関数を実行します。
プレイバックする時に便利なように 1 個目の球だけ回転させておきます。 
maya.cmds.move(0, 5, 0, (sname[0] + '.rotatePivot'))
球の回転の中心(ピボット)を(0, 5, 0)に移動します。
maya.cmds.rotate(0, 0, -80)
移動したピボットを中心に Z 軸周り -80 度回転させます。
maya.cmds.rigidBody(active=True, mass=0.5, bounciness=1.0)
球をリジッドボディにします。
オブジェクトにコンストレインを設定すると自動的にリジッドボディになりますが、 リジッドボディのアトリビュートを設定するために、 ここで、あらかじめリジッドボディにしておきます。
mass=0.5
質量は 0.5
bounciness=1.0
弾性係数は 1.0
maya.cmds.constrain(hinge=True, p=(x, 5, 0))
球にコンストレインを設定します。
hinge=True
コンストレインの形式はヒンジにします。
p=(x, 5, 0)
ヒンジの位置を (x, 5, 0) に設定します。
maya.cmds.connectDynamic(sname[0], f=gname[0])
重力 フィールドと球をコネクトします。

練習

参考


Prev | Next
Home | Contents
Mail