日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2012年2月29日水曜日

パーティクル101 その3:saveInitialState無しで追加したパーティクルを保存する(1)

<はじめに>
最初に結論を述べておきますと今回の、こころみは勘違いから始まっており、さほど実りある物ではありませんでした。(個人的には長年、気に掛かっていたところが明白になりすっきりしましたがw)



参考になるとすればアスキーファイルの分析手順。
setAttrコマンドでパーティクルのアトリビュートを設定する方法がわかるぐらいでしょうか。
(いずれも次回、説明します。)

「勘違い」というのは、
●パーティクルの初期設定はパーティクルキャッシュのように初期状態を別ファイルに保存しており、ファイルを開くときに読み込んでいる(と思っていた。実際はそうではない)
●そのためプロジェクト設定が間違っているとか、バグで読めないとかになるのは嫌だから確実にファイル内に設定を組み込みたい。
●そのため「saveInitialState」は使わない方法を見つけたい
というところです。

これはただの取り越し苦労であったことは次回にわかりますが、結論を先に言うと
saveInitialState」(メニューでは Solvers > Initial State )を実行した時点で
particleShapeアトリビュートに初期状態は組み込まれる」とうことです。








<Expressionを利用する方法>
 Expressionを使えばMelを毎回実行しなくとも、自動的に設定したスクリプトを実行してくれます。
 これで最初のフレームでパーティクルがEmitされるようにすればいいはずです。

でやってみました。
詳しいことは省略しますが、ParticleShapeのPerParticleAttributeからCreateExpressionを追加しました。
が一つ追加したいだけなのになぜか大量のパーティクルが生まれてしまったり、二度と生まれなかったりで挫折しました。

Twitterで@spx808さんにヘルプをお願いし、以下のアドバイスをいただきました。

「if (frame==2)emit -pos 0 0 0; とか。
パーティクルのシェイプノードに入れるとパーティクルの数だけ実行されてしまうので

単独のエクスプレッションにするといいと思います。」

まさにおっしゃる通りのことが起きていましたw
よく考えたらそうですね、PerParticleAttributeなのでパーティクル毎に発生します。


というわけで、アドバイスに従ってやりなおしました。
これまでのように「particle」コマンドでparticleShapeを作成し
メニューから windows > animation > Expression Editor で単独のエクスプレッションを作成。
(注:このプロジェクトの開始フレームは「1」です)

でも上記のままのエクスプレッションではエラーになります。
// Error: A particle object flag must be specified with the -object flag. //
// Error: An execution error occured in the expression expression1. //


どのパーティクルシェイプに追加すべきかという-object(-o)フラグが無いからです。
正解は
if (frame==2) emit -o particle1 -pos 0 0 0;
となります。

ところでこれだとパーティクルが出現するのはフレーム2からで、フレーム1では表示されません
例外は最初にこのエクスプレッションを「Create」もしくは「Edit」ボタンを押した時だけです。
タイムフレームを進めてフレーム1に戻って、再び再生してもフレーム1では表示されません。


その理由はヘルプ「エクスプレッションが実行される頻度」にあります。
「エクスプレッションは、アニメーション時間またはフレーム番号が変わるたびに実行されます。」

ようするにフレーム1ではエクスプレッションがまだ実行されていないのです。

そのためフレーム1では初期状態が表示されます
このケースでは、particleShape1の初期状態はパーティクル数ゼロです。
(初期状態が異なる場合はそれに応じた数のパーティクルが表示されます)

同じ理由で、「frame == 2」を「frame == 1」に変えてもフレーム1でパーティクルは表示されません。


※「frame == 1」でタイムラインをすすめてもパーティクルは表示されません。
最初にエクスプレッションが実行される時(フレーム1から2へ進むとき)は、フレーム数は「2」になっており、それ以降も同様に「frame == 1」の条件が成り立つ機会がないからです。
このような場合は、「frame >1」にすれば条件が一致するようになりパーティクルが表示されます。


この方法を利用すれば、初期フレーム以外の好きなタイミングでパーティクルを出現させることが出来ます。
例:フレーム15でパーティクルを追加する。
if (frame==15) emit -o particle1 -pos 0 0 0;

0 件のコメント:

コメントを投稿