エクスプレッション
エクスプレッションによるアニメーション
エクスプレッションの機能を使用すると、各ノードのアトリビュートを数式・プロシージャなどでアニメーションさせることができます。
エクスプレッション内で使用できる文法は MEL に似ているものになります。
Python は使用できません。
エクスプレッションを定義・編集するには、通常 エクスプレッション エディタ を使用しますが、
ここでは Python の expression 関数を使用して実行する方法を紹介します。
expression 関数
expression 関数では string フラグの後にエクスプレッションを定義しますが、
エクスプレッションには数式だけでなく、
MEL のように変数を使用したり if, while, for, switch などの制御構造や自分で作ったプロシージャーも使用できるので MEL プログラムで表現できることなら、
どんな複雑なアニメーションでも実行できます。
expression のキーワード
エクスプレッションでは以下の特別なキーワード(変数のようなもの)を使用して式・プロシージャを作ってゆきます。
これらの変数をエクスプレッションで使用する時は、他の MEL 変数のように $ をつける必要はありません。
- frame
- 現在のフレーム数
- time
- 現在の時間
NTSC に設定してあれば 1 秒あたり 30 フレームになっているので 1 フレームで 1/30 = 0.033 秒時間が進みます。
(厳密には 1 秒あたり 29.97 フレームです)
expression 関数のフラグ
- string=エクスプレッションの式
- エクスプレッションの式を定義します。
- name=エクスプレッション名
- エクスプレッションの名前を定義します。
- object=ノード名
- エクスプレッションで使うノードの名前を指定します。
このオプションで指定されたノードの名前は、エクスプレッションの中で省略できます。
- query=True
- string フラグや name フラグと共に使用して、それらの値を返します。
- edit=True
- string フラグや name フラグと共に使用して、それらの値を変更します。
expression 関数の使用例 1
- を表示しておいてください。
以下の関数は
のインプットウィンドウから実行します。
- 適当な名前で球を 1 個作ります。
ここでは、sphere1 という名前にしておきます。
maya.cmds.sphere(n='sphere1')
- エクスプレッションを expression 関数で定義します。
以下の関数は球体 sphere1 のアトリビュート translateX を sin() 関数で変化させます。
maya.cmds.expression(string='sphere1.tx = sin(time);')
string によって定義されるエクスプレッションの式は
MEL に似た文法になっていることに注意してください。
この関数を実行した後 に表示される # 結果: の右の expresson1 が、このエクスプレッションの名前になります。
- この後、アニメーションを実行すると球が X 軸方向に -1.0 から 1.0 の間を振動します。
- 以上のエクスプレッションでは、移動距離が短くてアニメーションさせても動きが良く分からないので、エクスプレッションの定義を変更してみましょう。
そのためには edit フラグを使用して以下のように関数を実行します。
関数の最後の expression1 は変更するエクスプレッションの名前です。
maya.cmds.expression('expression1', edit=True, string='sphere1.tx = 5 * sin(time);')
expression 関数の使用例 2
エクスプレッションは エクスプレッション エディタ によって設定できますが、
大量のオブジェクトに設定しようとするとたいへんです。
そのような場合には Python スクリプトを使用すると効率良く設定できます。
以下の Python スクリプトは指定された個数のコーンを作って、
それぞれのコーンに スケール Y をアニメーションするという、
少しづつ違うエクスプレッションの式を定義するプロシージャーです。
- 以下のプロシージャを makeExpression1.py と言う名前でファイルに書き込みます。
import maya.cmds
def makeExpression1(num):
for i in range(0, num):
name = maya.cmds.cone()
maya.cmds.move(i * 2, 0, 0)
val = i * 0.3
maya.cmds.expression(object=name[0], string=('sy = 3 * sin(time + ' + str(val) + ');'))
- スクリプト エディタ の によって makeExpression1.py を読み込んで、テンキーの Enter キーなどで実行します。
- で以下の関数を実行します。
makeExpression1(10)
コ−ンが 10 個現れて、それぞれに違うエクスプレッションが設定されます。
アニメーションのレンダリング例
スクリプトの解説
import maya.cmds
- maya.cmds モジュールをインポートします。
-
def makeExpression1(num):
- makeExpression1 という名前の関数の宣言です。
引数の num は作られるコーンの個数を表します。
-
for i in range(0, num):
- i を 0 から 1 づつ増やして num - 1 になるまで num 回 for 文を繰り返し実行します。
-
name = maya.cmds.cone()
- コーンを作り、その名前を name に代入しておきます。
-
maya.cmds.move(i * 2, 0, 0)
- 作ったコーンを X 軸方向に i * 2 だけ移動します。
この式の 2 はコーンの高さ(底から頂点まで)を表します。
-
val = i * 0.3
- コーンの動きを少しづつずらすために val に i * 0.3 の結果を代入しておきます。
この式の 0.3 は適当な値なので、別の値にしてもかまわいません。
-
maya.cmds.expression(object=name[0], string=('sy = 3 * sin(time + ' + str(val) + ');'))");
- エクスプレッションを定義しています。
コーンの名前が入っている name[0] に string フラグ以下の式を定義しています。
このエクスプレッションの定義は複雑なので、
string 以下の部分がどのように実行されるか以下に解説しておきます。
- ('sy = 3 * sin(time + ' + str(val) + ');')の外側の括弧内は 3 つの部分に分かれます。
- 'sy = 3 * sin(time + '
- str(val)
- ');'
この式の sy (スケール Y) は object フラグで指定されたコーン(name[0])のアトリビュートです。
- まず、val の部分が val = i * 0.3 で計算された値に置き換えられます。
- val の値は数値になっているので、str 関数によって文字列に変換します。
- それから上の 3 つの部分が文字列を結合する演算子 + によってひとつの文字列になります。
その文字列がエクスプレッションの式として、
name[0] で表されるコーンに割り当てられます。
具体的な例として i が 2 の場合(3 個目のコーンの場合)にどのように式が作られるかを見てみましょう。
-
val = i * 0.3 の部分を計算し、
val に 2 * 0.3 の計算結果 0.6 を代入します。
- expression 関数の string フラグ以下の
('sy = 3 * sin(time + ' + str(val) + ');') は
('sy = 3 * sin(time + ' + '0.6' + ');') となります。
- 式の 3 つの部分
- 'sy = 3 * sin(time + '
- '0.6'
- ');'
が + によってひとつの文字列に結合されます。
- 結合された文字列
'sy = 3 * sin(time + 0.6 )'
が 3 個目のコーンのエクスプレッションとして定義されます。
もし引数 num が 10 ならば 10 個のコーンに対して、それぞれ以下のエクスプレッションが定義されます。
- 1 個目 sy = 3 * sin(time + 0.0 )
- 2 個目 sy = 3 * sin(time + 0.3 )
- 3 個目 sy = 3 * sin(time + 0.6 )
- 4 個目 sy = 3 * sin(time + 0.9 )
- 5 個目 sy = 3 * sin(time + 1.2 )
- 6 個目 sy = 3 * sin(time + 1.5 )
- 7 個目 sy = 3 * sin(time + 1.8 )
- 8 個目 sy = 3 * sin(time + 2.1 )
- 9 個目 sy = 3 * sin(time + 2.4 )
- 10 個目 sy = 3 * sin(time + 2.7 )
三角関数について
三角関数はエンジンのピストン運動や、波などのような往復運動をさせたい場合に良く使われます。
Maya の MEL・エクスプレッションで使用できる三角関数の種類には、
sin、 cos、 tan、 asin、
acos、 atan などがありますが、
通常は sin と cos で十分でしょう。
三角関数には非常に多くの性質や定理がありますが、エクスプレッションで使用するときには基本的な性質だけわかっていれば良いでしょう。
例えば、
$a * sin($b * time + $c)
という式があったとすると、以下のような性質があります。
- $a の値が大きくなると波が大きくなり、
小さくなると波が小さくなります。
- $b の値が大きくなると波のスピードが速くなり、
小さくなると波のスピードが遅くなります。
- $c の値によってアニメーションのタイミングをずらすことができます。
練習
- 上の makeExpression1.py を参考にして makeExpression2.py を作り、スケールのかかる方向を引数によって変えることができるようにしてみましょう。
引数は 2 つで 1 番目の引数 num は makeExpression1.py と同じ、
2 番目の引数 axis によってアニメーションの方向を変えます。
makeExpression2(num, axis)
2 番目の引数 axis は以下の 1 から 3 の値をとることとします。
(それ以外の値は無視してよいことにしておきます)
- 1
- X 方向にアニメーションさせる。
(スケール X をアニメーション)
- 2
- Y 方向にアニメーションさせる。
(スケール Y をアニメーション)
- 3
- Z 方向にアニメーションさせる。
(スケール Z をアニメーション)
参考
Prev | Next
Home | Contents
Mail