2010年5月30日日曜日

パーティクルの寿命(Life)に応じた変化

エクスプレッション「$LIFE」を使用する。
例:「color」POPの「Ramp」に使用すると
誕生時:左端の色
消 滅時:右端の色
になる。

2010年5月27日木曜日

おわび

一部のブログのエントリ内容が、気をつけてはいたのですが、現在学習している有料チュートリアルの内容に非常に似通った部分があり、著作権に抵触する恐れがあるため、削除いたしました。

元々このブログはメモのためで、現在、生活をかけて学習中です。
生活がかかっているため、効率を上げるために短期で学習するために現在、有料、無料を問わずチュートリアルを利用しています。

その内容を自分なりにかみ砕いて、エントリにしてきたつもりですが、どうしても似たような内容になってしまってう部分があります。

それらに気を遣って、よりよくまとめることもできるのかもしれませんが、そのために時間をさいていては本末転倒で、自分の学習を効率よく進めることができ なくなります。


そこで、いままでごらんにただいた方には誠に申し訳ないのですが、
これからは、有料コンテンツの内容は個人用「魔法使いの弟子」で管理し、
一般公開用「魔法使いの弟子」では、無料で公開 されているものや自分のオリジナルに限り、公開することとします。

一般公開用と言っても、普通には公開していませんので、URLをご存じない方はアクセスできないので、それほどたくさんのアクセスはないのですが、これまでご覧いただいた方のためにも、できるだけ一般公開用を継続したいと思います。



コリジョンしたパーティクルを分裂させる(コリジョン・イベント) その2

コリジョンイベントで発生したパーティクルにもグラビティーとコリジョンが作用するようにする。

問題:
「Sourc1」と「Split1」は、別のパーティクルのネットワークである。
そのため、グラビティーはどちらか一方にしか作用できない。
(「Split1」は一部の情報を「Source1」からとってきているので、点線でつながって一つのネットワークになっている。)

このため、まず両方のネットワークを集めて、一つにしてそれに対してグラビティーを作用させるようにする必要がある。

パラ-メータに関する、ショートカットと色の意味


<ショートカット・キー>
Alt + LMB: キーを打つ
Ctrl + LMB: キーを削除
Alt + E: エクスプレッション・エディターの表示
Ctrl + Shift + LMB: チャンネル情報(エクスプレッション、キーフレームなど)を削除
パラ-メータ名をクリック: エクスプレッション表示と値表示の切り替え。



 <色について>
参照1:Editing Parameters
参照2:Animation basics

現時点では、まだ正確に把握できていないが大体、以下のような感じ。

薄い緑: エクスプレッションによりコントロールかつ、現在のフレームにキーがある。
(ヘルプには上記のように書かれているが、キーフレームだけでも薄い緑になる)





シアン(薄い青): エクスプレッションによってコントロールされているが、現在のフレームにはキーは存在しない。(または、ドープシートから現在のフレームのチャンネルバリューが無効にされている) (ヘルプには上記のように書かれているが、キーフレームだけでも薄い緑になる)



黄色: キーフレームが一時無効になっている。(このフレームにおける現在の値は、キーが打たれた値とは異なっている。しかし、キーフレームを打っていない。)


Orange: パラ-メータは現在チャンネル・オペレータ(CHOP)によってコントロールされている。


灰色: ロックされている。



紫: Pythonスクリプトによるエクスプレッション

2010年5月26日水曜日

コリジョンしたパーティクルを分裂させる(コリジョン・イベント) その1

1)先ほどのシーンファイル(パーティクルのコリジョン)を開く。


2)「Collison1」のパラメータ・エディタ「Behavior」タブで、以下のように入力。

Collision Event: Collision1
Collision Group: SplitGroup1


Collision Event: 各パーティクルが対象ジオメトリと衝突した時このイベントを発生させる。
Collision Group: 衝突したパーティクルを入れるグループの名称。
今まさに衝突したパーティクルをソース・パーティクルから分離して、識別するために使用するグループ。
一連のオペレーター(例えば「Split」POP)は、トリガーとなるパーティクルを選択するために、このグループを使うことができる。
Preserve Group: Collision Groupのパラメータに登録されたグループがあれば、コリジョンで発生するパーティクルをそのグループと入れ替えないで、追加する。 


3)「Split」パーティクルノードをパーティクルネットワーク(Popnet1の下層)の一番最後(Collisionもしくは、Gravity(Force)Popになっている)に追加。

問題: 現時点では、すべてのパーティクルが分裂し、コリジョンイベントが成立していない。
これは「split」のActivationが1で、CollisionEventと関係なくSplitするからである。
注意: 「Split」は新しいパーティクルのソース(エミッター)であり、新しいパーティクルのネットワークとなる。


4)「Split」POPのパラメータ・エディタ 「Activation」に以下のエクスプレッションを追加。
popevent("collision1")

「popevent」関数は、名称付きのイベントを検知するために使われる。
http://www.sidefx.com/docs/houdini9.5/expressions/popevent
http://www.sidefx.com/docs/houdini9.5/particles/events
あるパーティクル・イベントが発生していれば1を返す。

popevent(event_name)
(event_nameは、文字列なのでエクスプレッション内では””で囲む必要がある)
この関数は、パーティクルノード内でのみ利用可能。
これはPOPノードのActivationパラメータに対して使うとイベントが発生したときのみそのノードが実行されるようにできるのでとても便利である。
イベントは名前の文字列によって区別される。
(文字列なのでエクスプレッション内では””で囲む必要がある)
問題: コリジョン(Collision1)の発生時にパーティクルの分裂が始まるようになったが、衝突してないパーティクルも含めて一度に分裂し始める。
これは、Collison Groupが指定されていないからである。


5)「Split」POPのパラメータ・エディタで、「Source Group」に「SplitGroup1」を選択、もしくは入力する。

結果: 衝突したパーティクルのみが分裂するようになる。
問題: 新たに発生したパーティクルは「Gravity」POPの影響を受けない。また分裂前のパーティクルがそのまま存在している。

6)「Split」POPのパラメータ・エディタで、「Kill original particle」をオンにする。

結果: 衝突前のパーティクルは分裂後に消える。
問題: 分裂後のパーティクルは「Gravity」POPの影響を受けていない。(これは次回)

「Split」パーティクル・ノード (オンラインヘルプ訳)

「Split」POP

メモ:
基本的にはエミッターである。
「Source」POPがジオメトリからのエミッターであるのに対して、「Split」はパーティクル からのエミッターである。
 


また「Split1」POPは図ではGravityPOPと点線でつながっている。
これは「Split1」が関連性があるものの、独立したネットワークであることを示している。
よって「Source1」 POPから始まるネットワークは、「Split1」に影響するのはパーティクル、コリジョンイベントからもたらされるデータだけであり、「Split1」移行のネットワークも「Source1」のネットワークには影響しない。


----------
(以下ヘルプの翻訳)
毎フレームごとに、インプット(またはSource Groupパラメータに設定されているグループにある)パーティクルの各粒子にランダムな数の新しいパーティクルを「Birth Probability」パラメータ(Birthタブ内)の「Minimum」、「Maximum」間の値で発生させる。

Birthタブの「Kill Original Particle」をオンにすれば、オリジナルのパーティクルを消滅させて真にパーティクルを分裂させることができる。

Attributeタブのパラメータは、新しいパーティクルがどのように発生元パーティクルからアトリビュートを引き継ぐかをコントロールするためにある。
また新しく分裂してできたパーティクルの速度(velocity)を設定することもできる。
もし、「Initial velocity」を「Use inherited velocity」のままにしておけば、新しいパーティクルはオリジナルと全く同じ方向とスピードを維持したまま移動する。
しかし、それらをグループ化し、そのグループに異なるレンダリング設定をしなければ、ビュー上では区別ができない。

一般的には、「Initial Velocity」を「Add to inherited velocity」に設定する(パーティクルの新しい速度をオリジナルのパーティクルに関連付ける)か、「Set initial velocity」に設定する(オリジナルのパーティクルを参照しないで新しいVelocityを設定する)。
Velocity」パラメータは、ランダムな「Variance(変動値)」によって、各パーティクル毎に新しいパーティクルの速度(velocity)を設定できる。(もしランダムな速度を望まないなら「Variance」を0,0,0に設定する。)

このノードは、時間の経過に従ってパーティクルの数を増加させるのに便利です。
複数のグループにあるグループ


異なるレンダリングのセカンダリ・パーティクル(それらを異なるグループ内に分裂させる)を発生する「メイン」・パーティクルのグループを持つために複数のグループと結合させると便利です。
※訳注※ メインパーティクルのグループと、セカンダリパーティクルのグループをわけておくということか??

例えば爆発のエフェクトで、中心分が白く、そこからオレンジや赤のセカンダリ部分が発生する時など。


その他のお馴染みの例としては、花火の分裂: 「Activation」パラメータを特定のフレームのみ分裂を有効にするために使う。
ロケットの位置から爆発の位置まで分裂し、オリジナルのロケットの位置は消滅する。

注意:オリジナル・パーティクルは、毎フレームで、新しいパーティクルに分裂するので、birth probalityの最大値が大きいか、Life Expectancyが長く設定されていると、パーティクルの総数が簡単にふくれあがってしまいます。



<Birthタブ>
Birth Probability: 各ソースポイントからどのぐらいの数のパーティクルがエミットされるのかを決める。
最初は各フレームで発生するであろう、パーティクルの数の最小値。
次の数字はその最大値。

例: 0, 1の値は各フレームで、一つのパーティクルが分裂する確率は50%(最小値が新しいパーティクル数ゼロ、最大値が新しいパーティクル数1)。
5,10の値は、5~10(それぞれの数を含む)のランダムな数のパーティクルが各フレームで発生する。


Birth Group: 新しいポイント(パーティクル)が格納されるグループの名前。


Preserve Group:
 もし「Birth Group」がすでに存在しているなら、新しいパーティクルをその中身と入れ替えずに、追加する。


Lif Expectancy: パーティクルがどのぐらい長く存在するか(秒数)

Life Variance(変動値): パーティクルは「Life Expectancy」の秒数だけ生存する。それに対して追加またはマイナスされる秒数。 全く変動さえない場合はゼロを設定する。

Kill Original Particle: 新しいパーティクルに分裂した後、ソースとなったパーティクルを削除する。

パーティクル・コリジョンの作成

0)パーティクルをエミットさせる。

1)床のコリジョン・オブジェクトに使用する「Grid」を作成。
結果: 「grid_object1」オブジェクトが作成される。


2)Gravityを適用して、パーティクルが床(Grid)に向かって移動するようにする。
Drive Prticleタブから「Gravity」をクリックして、パーティクルを二回選択。
必要に応じてScaleを調整。(自分の例では、0.05~0.5程度を使用)
Tips:Houdiniはデフォルトで、1ユニットが1mであることを考慮してScaleを決めると良い。
注:このステップはコリジョンを見やすくするためのもので、コリジョンの対象やシーンの内容によっては、必ずしも必要ではない。


3)アニメーションを進めてパーティクルがビューポートに見える状態にする。


4)パーティクルをビューポートで選択して、Drive Prticleタブから「Collison」をクリック

注: Networkエディターはシーンレベルに移動しておく。


5)パーティクルを再度選択しEnterキー、つぎにコリジョン対象のオブジェクト(Grid)を選択しEnterキーを押す。
結果: 「collision1」POPが、「gravity1」POPのアウトプットに接続され、パーティクルがGridで跳ね返るようになる。
注: すべてビューポート内での操作
ヘルプ: <Collison>POP
このオペレータは参照されるSOPのジオメトリとパーティクルとの間のコリジョンを検出、実行する。
Behaviorの設定について
Die on collision: コリジョン時に消滅
Bounce on collision: コリジョン時にサーフェイスで跳ね返る
Stop on collision: コリジョン時に停止する。
Stick on collision: コリジョン時にサーフェイス上にくっついて停止する。
Slide on collision: コリジョン時にサーフェイス上をスライドしていく。


コリジョン後の振る舞いを設定するには、「Final Behavior」を使う。
例えば、Behaviorを「Bounce on Collision」に設定して、バウンス後に坂をスライドしてほしい場合には「Slide on Collision」を選択しなければパーティクルはバウンス後にその場にとどまる。
Bounce on Collision: バウンスし続けた後に停止(目に見えないバウンスを続けているのかも?)
Die on Collision: バウンス後に消滅
Stop on Collision: バウンス後に停止
Stick on Collision: バウンス後にサーフェイスに貼り付く
Slide on Collision: バウンス後にサーフェイス上を滑る。

Minimum Impulse: Final Behaviorに置き換わる程度の設定。



6)バウンスが強すぎるようなら「Collision1」SOPのGain Tangent、Gain Normalを下げる。
結果: バウンスが適度になる。
Tips: 設定の数値は、ゼロ=エネルギーを得ない。 数値=数値の大きさによりエネルギーを得る量が増減する。
Gain Tangent: コリジョン時のタンジェント方向へのエネルギー
Gain Normal: コリジョン時のノーマル方向へのエネルギー


7)オブジェクトを透過するパーティクルがある場合は、Collision Toleranceを少しだけ(0.01)つけてやる。
結果: コリジョンがより正確になり透過するパーティクルが現象もしくは無くなる。
Tips: Collision Toleranceはジオメトリからパーティクルがコリジョンする場所までの距離を決める。デフォルトはゼロで距離がないため、いくつかのパーティクルは計算誤差により透過してしまう。場合によっては0.01でも小さすぎることもある。

ポリゴンの一部からパーティクルをエミットする。(一部削除)

1)Sphereを作成
結果: sphere_object1オブジェクトが作成される。

2)Sphereに対して「Source From Geometry」を適用。
結果: particle_emitter1オブジェクトが作成される。
Tips: 以下のステップで「Delete」SOPを使うが、パーティクルのインプットジオメトリだけに適用しないと、すべてのジオメトリの見た目が変化(削除)されてしまう。

3)「particle_emitter1」の下層にある「object_merge1」SOPを可視化(右端の青トグルボタン)し、エミットさせたいフェイスのみを選択。

Tips: SelectionモードのGeometory select modeをPrimitiveにすること


<著作権侵害の恐れがあるため、一部削除&改変>

6)「delete」サーフェイスノードを作成
注:「blast1」と同じInput(object_merge1)とOutput(popnet1)がつながっていること。
Tips:「Dlete」SOPは「blast」よりもより多くの操作ができる。

7)「delete1」SOPの「Group」にエミットさせたい部分のポリゴンの番号をペースト。


8)「delete1」のParameterエディタで、「Operation」を「Delete Non-selected」に変更。
結果:選択したところだけが残る。

9)ポリゴンのノーマル方向へのみエミットさせたい場合は、「delete1」SOPのアウトプットを右クリックして「point」サーフェイスノードを作成する。

10)「point1」SOPのparameterエディタでの「standard」タブで、「Keep Normal」を「Add Normal」に切り替え。



----------
Mayaで同じ操作をするとしたら
ポリゴン・フェイスを選択してExtraxctし、それに対してEmit from surfaceを適用。

2010年5月24日月曜日

ユニットサイズ

3D CG soft system unit. MAX、MAYA、SI、Houdini

http://succhin.blogspot.com/2010/04/cg-soft-unit.html
(ブログ:Succhin。より)

Houdiniは 1ユニット=1m

サーフェイスからパーティクルをエミットする。

1)Sphereを作成。

オブジェクトレベルで「sphere_object1」ができる。
一つ下の階層に「sphere1」サーフェイスノードがある。

「sphere_object1」コンテナ・オブジェクト:トランスフォーム、ピボット情報など。
sphere」SOP:プリミティブの種類、半径、中心座標、向き(axis)を決める。


----------
2)「sphere_object1」もしくは「sphere」SOPが選択された状態で、「Source from Object」を適用

「particle_emitter1」ができる。
一つ下の階層に「object_merge1」サーフェイスノード、「popnet1」サーフェイスノードがある。
さらに「popnet1」の下層に「source1」パーティクルノードがある。

「particle_emitter1」コンテナ・オブジェクト:トランスフォーム、ピボット情報など。

object_merge1」SOP:ほかの複数ジオメトリオブジェクトからジオメトリを合併(マージ)する。
<Object1>アトリビュート:併合するジオメトリへのパス。選択もしくはタイプして入力。
(例:/obj/sphere_object1/sphere1)
<Gropu1>アトリビュート:併合するオブジェクトの中にあるプリミティブのグループ。
オブジェクトの一部だけを併合したいときに使う。
空欄でオブジェクト全体

ponet1」SOP:パーティクルノードのネットワーク
ジオメトリオブジェクト内で、パーティクルネットワークを利用できる良ようにする。
パーティクルネットワークの中で「context Geometry」として、このノードのインプットに接続された、どんなジオメトリでも参照可能。
DOP(ダイナミック・オペレータ)インポート・タブでの設定は、SOPのアウトプットを上書きします。

「source1」POP:ジオメトリからパーティクルを発生させる。そのためのアトリビュートはここにある。
例1)パーティクルを頂点でなく、サーフェイスからエミットする。:Emission Type
例2)エミット時の速度。:Variance, Velocity

Tips:Varianceを0,0,0に設定しておけば、エミットされたパーティクルが誕生時の場所にとどまるので、エミットされている位置を確認するのに便利。


----------
3)「particle_emitter1」→「source1」→「source」タブ
Emission TypeをSurface (randamu)に設定。

これでサーフェイスからパーティクルが発生する。

注意:発生方向は裏表両方を含み、このままではスフィアとパーティクルのコリジョンは存在しない。 
Sphereの外側方向にのみパーティクルが移動するようにするには、以下の手順を実行する。


----------
 4)「particle_emitter1」の下層に移動。
「object_merge1」のアウトプットを右クリックし「point」とタイプしてPointサーフェイスノードを作成する。

「point1」SOPが「object_merge1」と「popnet1」の間に作成される。



Point」SOP:ポイントのアトリビュートをマニュアル操作で追加もしくは編集する。

各ジオメトリ・プリミティブは0から始まるポイントのリストを持っている。
各ポイントはXYZ位置、色、アルファ、テクスチャーUV、ウエイト、ノーマル方向などのアトリビュートを持っている。
(ポリゴン、NURBSそしてプリミティブもまた頂点のリストを持っている。
ポイントのリストのそれらの位置によって参照されるポイントである。
これらのポイントは複数のポリゴンやNURBS、プリミティブによって共有される)

PointSOPは、そのポイントの位置を含んだアトリビュートの編集を可能にする。
例えば、あるポイントに対するオブジェクトのバウンディング・ボックスの中心からの距離を変更できる。(ローカル変数の$BBX, $BBY, $BBZを使う)。ポイントの色($CR, $CG, $CB)の変更、ポイントのノーマルの変更 ($NX, $NY, $NZ)も可能だ。

これは、とても一般的かつパワフルなオペレータである。
サーフェイスの(ポイントの位置を変更することにより)デフォームや、
(ポイントの色を変えることによる)おもしろい色の効果を作ったり、
(ポイントのノーマルを変えることで)放出されるパーティクルの軌道を変更することを含み、ほとんど無限の目的に対してこれを使うことができる。

このオペレーター内で使われるエクスプレッションは、各ポイント毎に評価されることに注意しておかなくてはなりません。
ローカルの変数「$PT」は現在処理されているポイントのポイントナンバーを持っています。

Tips
●ポイントの編集のためにエクスプレッションを書くときには、pointとpointavg関数が便利です。
●ビューワー内のポイントのポイントナンバーをみるには、ディスプレイ・オプション・ウインドウ(Viewport Menu > Display > Display Options, またはDキーを押す)か、ビューワーの右側にあるディスプレイ・ツールバーにある、「Point numbers」アイコンをオンにします。
● ノーマルを裏返すにはAdd normalsにして-$NX -$NY -$NZと入力します。
●このオペレータは、ポイントのアトリビュートを編集し、primitiveSOPはプリミティブ全体のアトリビュートを編集します。
●pointSOP内のローカル変数は、ポイントに関係しています。
detail, primitive, vertexといった変数を使うために、「det」、「prim」、「vtx」といったprefixを使うことができます。
例えば $primTX, $primTY, $primTZは、そのポイントが属する最初のプリミティブの重心です。


----------
5)「popnet1」→「Standard」タブ
「Keep Normal」を「Add Normal」へ変更。


Point」SOPの基本事項
 <Keep> :デフォルト値を使用。
 <Add>  :新しい値を入力可能にする。
 <No>   :すべての値を削除。


「Add Normal」にすると、自動的に$NX, $NY, $NZというローカル変数が入力される。
これは正方向へのノーマル方向を示している。
負方向へしたいのであれば、-$NX, -$NY, -$NZとする。

ただし、ノーマル方向を変えても、パーティクルのエミッション方向は変わらない。
エミッション方向を変えるには「source1」の「inherit Velocity」を-1に設定する必要がある。
これがすべての場合に言えるのかどうかはわからないが、Mayaとは異なる点である。