はい、Mayaで作る軌跡エフェクトの作例、2例目です。
今回はExpressionを使って軌跡を作っていきたいと思います。
Expressionといっても、それほど難しくない(と思う)ので気軽に試せるのでは、と。
前回と同じものを作るのもアレなので、今回はライン状の軌跡を作ってみようと思います。
こんなヤツ↓
パーティクルでやれば、とか言わないように。
レシピはLocatorが一つと、ほどよい長さのCurveが一つ、あとはExpressionがちょいちょい。
Locatorの動いた軌跡をCurveが辿る、というふうなExpressionを作成したいのです。
Nフレーム前(Nは自然数)のLocatorの位置に、カーブの各Control Vertex(以下CV)を移動すればできる気がします。
こんな感じ。
位置情報を取得する場合は “getAttr”コマンドで取得可能です。
また”-t”オプションで指定したフレームの情報を取得することができます。
getAttr -t 時間 Locatorの位置情報
あとは取得した各フレームのLocator位置へ、カーブの各CVを移動していけば・・・
その前に、カーブのCVがいくつあるかを取得する必要もあるな・・・
記述するExpressionの内容を少し言葉でまとめてみましょう。
①:カーブを構成するCVの数を取得
②:Nフレーム前のLocatorの位置を取得
③:N個目のCVを①の場所まで移動
④:②~③の処理をCVの数だけ繰り返す
いきなりですが、上をExpressionにするとこんな感じになりました。
string $curve = "curve1"; string $locator = "locator1"; //現在のフレームを取得 int $frm = frame; //SpanとDegreeからControl Vertexの数を取得 int $cSpan = `getAttr ("curveShape1.spans")`; int $cDegree = `getAttr ("curveShape1.degree")`; int $iCV = $cSpan + $cDegree; //フレームごとのLocator位置に、CurveのCVを移動 //Control Vertexの数だけ処理を繰り返す for($i = 0; $i < $iCV; $i++){ //0フレームより前のフレームを参照する場合は、すべて0フレを参照。 if($frm-$i<0){ vector $pos = `getAttr -t 0 ($locator+".t")`; move -ws -a ($pos.x) ($pos.y) ($pos.z) ($curve + ".cv["+$i+"]"); }else{ vector $pos = `getAttr -t ($frm - $i) ($locator+".t")`; move -ws -a ($pos.x) ($pos.y) ($pos.z) ($curve+".cv["+$i+"]"); } }
ちなみに、必要な機能を並べたコードになってますので、あしからず(・ω≦)
Expression? 何それって人は、新規でシーンからLocatorとCurveを一個ずつ作り、
[Window]→[Animation Editor]→[Expression Editor]を開いて、
Expressionの欄に、上のコードを貼り付けてCreateボタンを押すと、
Locatorに追従するCurveが見れると思います。
上で作れる軌跡は1本ですが、配列使えば任意の数の軌跡を作成可能です。
もっとも、Expressionなので数が多くなりすぎると処理が重くなります。
複数の軌跡をLoftで繋げると、”その1”で作ったような軌跡になります。
また上の例のように、ラインのみレンダリングしたいなんて場合は、CurveにPaintEffectをアタッチすると簡単だったりします。
Mentalrayでレンダリンスするときは、さらにポリゴンにコンバート。
上記の機能を昔Tool化したものがあったので公開。→ FX_AddStroke.mel
melを実行すると、↑のToolが起動します。
ちょっと解説!
[Num]に作成したいLineの軌跡の数を入力し、[CreateStrokeLine]ボタンを押す。
Boxとnullが作成されます。
Boxをアニメーションさせると、nullからLineの軌跡が生成されます。
Boxにはコントロール用のパラメータがあります。
・Echo Frame :軌跡の長さ
・Global Scale:軌跡の太さ
・Thin:末端の太さ
Expressionなので、軌跡の数が多くなると比例して重くなります。ご注意を。
コメント