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

2009年5月1日金曜日

goalU,goalV (1): ゴールの作成

ここ数日goalU,goalVを使ったスクリプトと格闘していた。
といっても自分が作った物ではなくもっと詳しい人がつくったもので、何がどのように動くのか解析して、シーンに合わせて調整しようとしていただけだが。
結論から言うといまだにgoalU, goalVがよくわかっていない。

シンプルにして考えるためにパーティクルを作成し、goalPPをPer Particle Attributeに追加しようとした。
エクスプレッションを作成すればparticle -> goalでゴールを作成しなくても大丈夫だろうと思ったからだ。

Expression Editorから
particleShape1.goalPP=1;
と入力したが、

// Error: Attribute not found or variable missing '$': particleShape1.goalPP
となってしまった。


スクリプトではできないのか??
とりあえず、goalU, goalVを調べる前に、ゴールというものを通常の手順から分析し、その性質を見ていく必要がある。

まずパーティクルを作成した時点で、
「goalPP」というアトリビュートは「particleShape」内に存在しない。
Goal Weight and Objectsという項目にはgoal Smoothnessが設定できるスライダが存在するだけで、weight値などの調整はできない。

要するに、goalのアトリビュートはデフォルトでは作られない。

それがなぜなのかを考えてみた。
「ゴール」とはパーティクルが、あるオブジェクトに向かって到達しようとする時の、その対象の事である。

これには、
1)パーティクルが存在する。
2)対象となるオブジェクトが存在する。
3)そのオブジェクトとパーティクルがゴールと追従者いう関係で定義されている。
という条件を満たす必要がある。


上記のgoalPPだが、goalPPはそのゴールにどれぐらい引きつけられるかという度合いであり、
対象となるオブジェクトを設定しているわけではない。
エクスプレッションに「goalPP=1」と書いたが、対象となるオブジェクトが何かが定義されないのでエラーになってしまっていたのである。

同じ理由から作られたばかりのパーティクル内にゴールのWeigth値が設定できていないのだと思う。

パーティクル作成時にロケーターなどのゴールオブジェクトを同時に作ればデフォルトで、ゴールWeight値をアトリビュートに持つことも可能だが、自由さに欠けるので、望む人はほとんどいないだろう。


--------------------
さて、goalを有効にするには、そのパーティクルにゴールオブジェクトを関連づけてやる必要がある。
パーティクルを選択し、対象オブジェクトを選択後、Particle> Goalをクリックでゴールが関連づけられる。

goalPPにしろgoalU,goalVにしろそのアトリビュートをエクスプレッションで使用するには、まずgoalを設定錘留必要があるのだ。

Goal Weight and Objectsのの中にオブジェクト名とその他の設定項目が表示される。
オブジェクト名の右どなりがそのWeight値になる。
そして、「goalPP」がPer Particle Attributeセクションに作成される。


ちなみにweight値が1の場合は、アニメーションを再生したとたん、、そのオブジェクトのCVに拘束される。

weight値が1でも、goalPP = 0; とするとwight値が0の時とおなじくゴールの効き目はなくなる。
weight値が0の時、goalPP = 1; とするとwight値が優先されるため、goalPPの値は意味をなさない。
ようするにgoalPPをエクスプレッションでコントロールする時には、weghtは1でなくてはならない。
また、ためしてみたところgoalweightPPもgoalPPと同じ動きをする。


オンラインヘルプには以下のように書かれている。

goalPP 値とオブジェクト単位のゴール ウェイトとが乗算され、各パーティクルの合計ゴール ウェイトが作成されます。

たとえば、オブジェクト単位のゴール ウェイトが 0.5 で、パーティクルの一部にパーティクル単位のゴール ウェイト 0.5 を加えた場合、これらのパーティクルの合計ゴール ウェ イトは 0.25 になります。2 つめのゴールオブジェクトがあり、対応するオブジェクト単位のゴール ウェイトが 0.1 である場合は、パーティクルの合計ゴール ウェイトは 0.05 になります。

わかり易く書き直すと、以下のようになる。
goal wieght =0.5 goalweightPP =0.5 //total goal wieght is 0.25
2nd object, goalwieghtPP = 0.1 //total goal wieght is 0.05


goalweightPPとgoalPPが同じ働きをするなら二つも必要ないはずなので、その違いを調べてみた。


オンラインヘルプには、

パーティクル単位の goalPP アトリビュートを使用して、各パーティクルにおけるゴール フォースの全体的な効果を軽減することはできますが、他のパーティクルとオブジェクトの反応から独立して、特定のパーティクルにおける特定のゴールのインフルエンスを選択的に変更することはできません。

この変更を行うには、特定のゴール オブジェクトにパーティクル単位でゴール ウェイト値を指定できるユーザ定義アトリビュートを使用する必要があります。これらのアトリビュートを使用して、1 つのパーティクル システム内で、1 つのゴール オブジェクトにさまざまなゴール引力を作成できます。

と書かれている。

短く書くと、goalPPは、パーティクル全体でしかコントロールできないが、goalweightPPは、パーティクル単位でウェイト値を設定できるということだと思う。
でもPPはパーティクル単位でのアトリビュートなのに、パーティクル全体でしかコントロールできないというのはどうもふにおちない。
自分の解釈が間違えているのか、どうにもわかりにくい説明である。

ヘルプを読み進めてみて少しわかってきた。
goalWeightPPは、それぞれの対象オブジェクトにひとつアトリビュートが存在する。
たとえば2つのゴールオブジェクトが存在する時、このアトリビュートは
goalWeight0PP
goalWieght1PP
という具合にそれぞれのオブジェクトに対してひとつのアトリビュートが存在する。

しかし、goalPPは一つしか存在しないので対象ゴールによってweight値を変えるようなことはできない。
これがその違いだ。

 

0 件のコメント:

コメントを投稿