2013年05月

2013年05月31日

2014の新機能を調べてみた その3 3dsmax 2014

今回も引き続き「高度なデータ操作」について調べてみたい。

パーティクルビューのコンテナにはオペレータ、テスト、フローの3種類のアイコンが並んでいて、「オペレータ」はイベント内でパーティクルを操作する様々な手段を提供するもので、「テスト」はパーティクルを条件でふるい分けして別のイベントに送り込む仕組みだ。

fig05

そしてその中にパーティクルフローと高度なデータ操作を繋ぐデータ系のアイコンは次の7つある。
  • データアイコン
  • データオペレータ
  • データプリセット
  • データアイコンテスト
  • データテスト
  • データプリセット(テスト)
  • データ表示

このうち「データ表示」を除く6つのアイコンはオペレータとテストのカスタム版として働くようになっていて、「データアイコン」「データオペレータ」「データプリセット」がオペレータで、「データアイコンテスト」「データテスト」「データプリセット(テスト)」がテストになる。

fig01

「データプリセット」については前回ちょっと触れたけど、データオペレータなどのロールアウトの「プリセットを保存」で

fig03

「データプリセット」を指定して保存すれば、

fig02

データプリセットアイコンをメインウインドウにドロップした時に下のようなダイアログが出て、ここから保存したプリセットを選んで読み込むことで、保存したデータオペレータまたはデータテストがいつでも呼び出して使えるって仕組みだ。

fig04

また、「データオペレータ」と「データアイコン」、「データテスト」と「データアイコンテスト」の違いは自前でアイコンを持っているかどうかの違いだけだ。

fig06アイコン付きのオペレータやテストを追加するとシーンには左のようなアイコンが挿入される。

fig07そしてロールアウトにもこのアイコンに関するパラメータがあって、アイコンの形状や大きさなんかが設定出来るようになっている。

また、データビューのコンテナにも「アイコン」という名のサブオペレータが追加されている。下の画像は左が「データオペレータ」のデータビューのコンテナで右が「データアイコンオペレータ」のコンテナ。

fig08

このように「データアイコン」と「データアイコンテスト」は「データオペレータ」と「データテスト」の拡張セットなので「データアイコン」と「データアイコンテスト」だけ知っていれば「高度なデータ操作」についてはほぼカバーできる。

さらにオペレータとテストも違いはサブオペレータに「出力テスト」があるかどうかだけなので、さらに突き詰めると「データアイコンテスト」だけ知っていればほぼ事足りるようだ。

fig09

さて、外堀は埋まったのでようやく中身の話だ。いろいろテストするためにまず新規のシーンで「6」キーを押してパーティクルビューを出して、コンテナから「標準フロー」をメインウインドウにドロップしたのが下の画像だ。

fig10

このフローの「回転」と「シェイプ」の間に「データアイコンテスト」をドロップして挿入した。

fig11

そして「表示」オペレータの「タイプ」を「ジオメトリ」にしてシェイプがビューポートに表示されるようにした。

fig13

次に挿入したデータアイコンテストを選択してロールアウトを表示させ、「自動更新」をONにしてから「データフロー編集」ボタンを押してデータビューを表示させた。

fig12

これで準備完了だ。

さて、データオペレータ(またはテスト)はフローのイベントの中でパーティクルを受け取って何らかの処理をしてイベントに戻すような仕組だ。だから処理を記述するデータビューには当然パーティクルを受け取ったり戻したりの橋渡しをするサブオペレータが存在する。それが「入力スタンダード」と「出力スタンダード」だ。データビューでコンテナからメインウインドウにドロップすると、入力スタンダードは出力コネクタが、出力スタンダードは入力コネクタが付いたボックスとして現れる。

fig14

fig15これらのコネクタから入出力されるデータを加工するのがデータフローの役目で、パーティクルからどの情報を入力して、どの情報を出力するかは各オペレータの左のようなロールアウトで選択出来るようになっている。

例えばここで「入力スタンダード」サブオペレータのロールアウトで「位置」を選び、その横のプルダウンメニューから「Xコンポーネント」を選べば、パーティクルのX座標値が出力されるようになる。

fig16

同様に「出力スタンダード」はパーティクルへ戻すパラメータが設定できるので、これを「スケール:平均」にして、パーティクルのスケールをこのオペレータから書き換えるようにしてみる。

fig17

あとはこの2つをこのように接続してやれば、パーティクルのX座標でパーティクルのスケールが決まるオペレータが出来上がる。

fig18

でもそのままシーンを再生してみると、スケールが大きくなりすぎちゃって、大変なことに・・・。

fig19

まあ元になっているシェイプの大きさを変えれば済む話ではあるけど、ここはデータビューの方で処理してみたい。

そこで先のデータビューに戻って「関数」サブオペレータと「スカラー」サブオペレータをドロップして追加する。

fig20そして「関数」サブオペレータのロールアウトを左のように設定する。
2つの実数を入力して掛け合わせた結果を実数で出力する関数になった。

そして先に接続したリンクの線を右クリックして切断し、このように繋ぎなおした。これで「スカラー」サブオペレータから入力される値と「入力スタンダード」から入力される値がかけあわされて、その値がパーティクルのスケールになるわけだ。

fig21

ここでスカラーの値を「0.02」にして、

fig22

改めてシーンを再生してみると、このようにパーティクルシェイプのサイズがX座標にあわせて変っているのが確認できた。そしてパーティクルエミッタを動かしてみると、パーティクルのX座標が変るのでそれにあわせてサイズも変化するのが確認できた。

fig23

それではまた来週。

maxまとめページ



take_z_ultima at 12:15|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2013年05月30日

modo701が来た! その14 modo701 SP1

今回はパーティクルについて調べてみたい。601のパーティクルはメッシュレイヤの頂点とかサーフェスジェネレータで生成する頂点として出てくる程度でパーティクルとしての基礎部分を組み込んではいたけど、表向きあまり能動的な感じがしなかった。701では機能統合と実装が進んで、パーティクルシステムとして形になってきた感じだ。

fig01パーティクルに関するツール群は「セットアップ」レイアウトにまとめられていて、左のようなレイアウトになっている。
パーティクルを発生させたり消滅させたり、挙動を制御したりといった機能を実現させるためのツールが並んでいてかなり充実した感じだ。

とりあえず使ってみようと言うことで、新規のシーンで「ラディアルエミッター」のボタンを押してみた。するとシーンにこのようなオブジェクトが現れ、

fig03

アイテムリストを見ると下のように「Radial Emitter」アイテムが追加され、さらに「Particle Simulation」アイテムというアイテムが自動的に追加されている。この「Particle Simulation」アイテムがパーティクルシステムの肝とも言うべきものでrecoilのソルバーと同じ方式だ。

fig04

さて、シーンに追加した「Radial Emitter」は一点からパーティクルを四方八方に放射するパーティクルの発生装置だ。この動作をまず確認してみたい。そのためにはセットアップレイアウトの右下にあるパーティクル用の再生ボタンを使う必要がある。下の画像の黄色い線を引いたところのボタンがそれだ。

fig05

このボタンの一番左がパーティクルのみ(実際はダイナミクス系などのアニメーションも含まれる)を無限に再生し続けるボタンで、真ん中がシーンの再生と一緒に再生するボタン、一番右がパーティクルの挙動を記録(キャッシュ)するボタンだ。

一番左の「再生」ボタンを押すとこんな感じでRadial Emitterからパーティクルが発生した。

fig07

この時タイムラインを見てもカレントタイムは動いていないのが確認できる。このまま放置しておくとアニメーションはループせずにずーっと再生され続ける事になる。再び同じボタン(ボタンのアイコンは変化している)を押すと再生が止まる。

ここでRadialEmitterの位置Xが0フレームから60フレームの間に2.5m動くように0フレームのところで位置Xにキーを打って、

fig07 

カレントタイムを60フレームに移動してからXの値に2.5と入力してこのような移動アニメーションをつけてみた。

fig08

ここでもう一度一番左のパーティクルの再生ボタンを押してみると、

fig10

カレントタイムが60のところで再生を始めたのでRadialEmitterは2.5mの位置に静止したままパーティクルを発生し始めた。もちろん再生を始めてもカレントタイムは動かず60のままだ。

fig09

このように一番左の再生ボタンはカレントタイムが移動しないのでシーンアニメーションがあっても再生されず、単にパーティクルアニメーションのみが再生されるようになっている。

今度は真ん中の再生ボタンを押してみた。

fig11

すると今度はカレントタイムが0に戻り、そこからシーンのフレーム範囲である120フレームまでこのように再生され、パーティクルアニメーションも一緒に再生され、120フレームまで来ると再び0フレームに戻ってループ再生された。

fig13

ここでシーンアニメーションの再生に使う「再生」ボタンの方を押してみると、

fig14

パーティクルアニメーションなしの再生になってしまった。

fig08

このようにパーティクルのアニメーションとシーンアニメーションは別々に管理されている状態になっている。だからこのままではせっかくパーティクルアニメーションをセットしてもレンダリングにも反映されない。これを解消するのが第三のボタンの役目で、このボタンを押すとパーティクルの挙動が記録される。記録されたアニメーションはシーンアニメーションの再生時に自動的に再生される。また記録されたアニメーションはシーンの保存時に同時に保存される。

fig12

さて、ボタンを押すと下のようなダイアログボックスが表示される。

fig15

ここでパーティクルの挙動を記録する範囲を設定するわけだね。

開始時間:パーティクルの挙動を記録し始めるシーンのカレントフレーム

終了時間:パーティクルの挙動を記録し終わるシーンのカレントフレーム

プリロール:記録を開始するまでにパーティクルアニメーションが進む経過フレーム数。 

例えば上記のシーンで開始時間:0、終了時間:120、プリロール:0にすれば0フレーム目からパーティクルアニメーションが記録され、シーンを再生すると下のようになる。

fig13

この再生にはシーンの再生ボタンを使う。

fig14

またタイムラインでカレントフレームを移動させると、その時刻の時のパーティクルの位置が再現でき、アニメーションを自由に戻したり送ったり出来る。

fig16 

もし間違ってパーティクル再生用のボタンを押しちゃうと記録は破棄されちゃうから要注意だ。

fig10fig11

再びキャッシュボタンを押して、

fig12

今度は開始時間:60、終了時間:120、プリロール:0にしてみた。

fig17

その結果、パーティクルが発生するのはRadialEmitterが停止する60フレーム目で、0フレームを開始時間にした時とはパーティクルの発生の仕方が違ってきた。

今度は開始時間:60、終了時間:120、プリロール:60にしてみた。これがその再生結果。

fig18

0〜59フレームまではパーティクルの挙動が記録されていないので何も出ないけど、60フレームからはいきなりパーティクルが今まで発生してアニメーションしていたように現れた。これは0フレーム目からパーティクルアニメーションを開始したアニメーションの60フレーム目以降のみを切り取って記録したものと同じだ。

プリロールはある程度パーティクルが発生した状態でアニメーションを開始したいなんて時に使うパラメータで、入力したフレームだけパーティクルアニメーションが進んだ状態からアニメーションが始まるわけだね。そして開始時間はそのパーティクルアニメーションをシーンのどのフレームから開始させて記録するかを指定するものなわけだ。

先にちょっと触れたけど、このパーティクルとシーンの再生と記録の仕組みはパーティクルだけじゃなくてダイナミクスにも適用される。recoilの時にはキャッシュは自動的に記録されてファイルには残らないものだったけど、701になって手動でキャッシュすることでユーザーがキチンとキャッシュのタイミングをコントロール出来るようになった。601時代にはキャッシュが更新されないで困ったなんて事があったけど、手動化されることでそういう事は無くなるね。

それではまた次回。

modo701ブログ目次



take_z_ultima at 12:18|この記事のURLComments(0)TrackBack(0)modo | CG

2013年05月29日

2014の新機能を調べてみた その2 3dsmax 2014

前回はデータオペレータを使った「高度なデータ操作」機能について大まかな使い方を単純なレイでちょっとやってみた。このトピックは他のパーティクルオペレータとも絡んで来るので先にもうちょっとこの機能について掘り下げて調べてみたい。

パーティクルビューにデータオペレータをドロップしてデータオペレータのロールアウトの「データフロー編集」ボタンを押すと、

fig01

このようなデータビューが表示され、ここでデータオペレータのデータ処理部分を組み立てる事が出来るって話は前回やった。

fig02

今回はまずこのデータビューの基本操作から。

前回もやったように下のコンテナから上のメインウィンドウまでサブオペレータをドラッグ&ドロップする事でデータオペレータにサブオペレータを追加することが出来る。ドロップしたサブオペレータは右の縁をドラッグすることで幅を変えたり、右下の矢印をクリックすることで最小化したり復元したり出来る。またSHIFTを押しながらドラッグするとダイアログが出て、コピーとインスタンスが生成できる。サブオペレータどうしはノードをドラッグすることで接続できて、その際にパラメータの変換が必要な時は自動的に変換オペレータが挿入されたりする。サブオペレータは他のサブオペレータの上にドラッグする事で一つにまとめる事が出来て、まとまったものは外にドラッグすると分離する。また複数のサブオペレータを選択してグループ化する事も出来る。
下のGIFアニメは実際にこれらの操作をやってみたものだ。

fig03

グループはロックすることで内部を変更出来ないようにする事も出来る。

fig11

また、他のサブオペレータをアタッチして加えたり、デタッチして取り除いたりも出来る。

fig12

サブオペレータは下の画像のようにBOXにアイコンとラベルが入っていて、上と下に接続コネクタが並んだ形になっている。

fig04

サブオペレータはその機能を端的に説明するための名前が自動的に設定され、その名前がボックスにラベルとして表示される。これを「ダイナミック名」と言って、設定が変ると自動的に名前も変更されるようになっている。この機能はサブオペレータを右クリックして出てくるメニューから無効に出来るし、サブオペレータの名前を入力すると自動的にOFFになる。

サブオペレータにはそのオペレータの性質にあわせたデータ入力、フィルター入力、データ出力がある。

データ入力は1文字のアルファベットが書かれた円で表わされ、データの種類によって色分けされている。以下がマニュアルに載っている一覧。

fig05

これらはロールアウトで入力パラメータのデータタイプを変更すれば切り替わるし、データ入力の切り替えボタンをONにしてやればサブオペレータに現れたりする。

fig06

これらのコネクタへは同じデータタイプを持つ出力コネクタがらドラッグしてやれば接続する事が出来て、接続されたリンクの線を右クリックすれば切断する事も出来る。

fig07

フィルターは条件によってサブオペレータを適用するパーティクルを制限するのに使う。例えば下の画像は、「入力スタンダード」サブオペレータから発生順のパーティクルIDを出力させて、「条件」サブオペレータでそのIDが10より大きくて30より小さい時にブール出力がTRUEになるように組み、それを定数ベクトル[0,0,1]を速度ベクトルとして出力する「出力スタンダード」サブオペレータのフィルターに入力している。

fig08

そして標準フローにこのように組み込んでいる。

fig09

この状態でシミュレーションすると、このように11〜29までのIDを持つパーティクルだけ速度ベクトルを変える事ができた。

fig10

それではまた次回。

maxまとめページ



take_z_ultima at 12:34|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2013年05月28日

modo701が来た! その13 modo701 SP1

今回もシェーダー関連の新機能から。

オクルージョンマテリアルに「頂点キャッシュ」のオプションと「キャッシュフィルターサイズ」パラメータが追加された。これはアンビエントオクルージョンの算出を頂点にのみ行って頂点間を補間する仕組みのようで、ピクセルごとに行うのに比べて計算量を減らす事が出来る。そしてその際にどのくらいの範囲で隣接する頂点どうしを補間するかを決めるのが「キャッシュフィルターサイズ」だ。

例えば下の画像はモザイクモードで球体を作ってベベルで窪ませたもので、「Occlusion」シェーダーを適用してある。

fig01

このレンダリングで「オクルージョンレイ」パラメータを1000にしてみたところ、レンダリング時間は10秒だった。

これを「頂点キャッシュ」をONにして「キャッシュフィルターサイズ」を20mmにしてレンダリングしたのが下の画像で、レンダリング時間は0.7秒になった。

fig02

確かに計算時間は物凄く短くなったけど、生成された画像は窪んでる部分の影が外側にまでにじみ出てしまってかなり精度は悪い。

fig06 

 そこでポリゴン再分割をして頂点の数を増やしてみた。

fig03

その結果がこれ。だいぶアンビエントオクルージョンの計算精度があがった感じだ。レンダリング時間は3.3秒だった。これでも頂点キャッシュを使わない場合の10秒よりもだいぶ速い。

fig04

以上の結果はオクルージョンレイの数を多くして1点あたりの計算量を増やしたための大きな差になったけど、デフォルトのオクルージョンレイ:24ではレンダリング時間は0.9秒と0.8秒で殆ど差は出ない。

また、下のように面と面が接近している部分が各頂点から離れている場合は頂点キャッシュでは頂点の所でしか計算しないから、アンビエントオクルージョンの陰影は出てこない。

fig05

下のGIFアニメは効果を比較してみたものだ。頂点キャッシュをONにすると重なった部分の陰影が直接光の影だけになってしまうのがわかる。

fig07

次にキャッシュフィルターサイズの影響を調べてみた。下のGIFアニメは「キャッシュフィルターサイズ」を0mmから100mmまで増加させてみたもの。各フレームでかなりチラつきは出ているけど、値を大きくするに従ってオクルージョンの陰影が広がってぼやけて行くのがわかる。

fig08

ただ、上の例でオクルージョンレイの数を2700にしてあるんだけど、これでも各フレームで計算結果に大きな差が出てチラついてしまっている。あまりやる事は無いと思うけど、キャッシュフィルターサイズのアニメーションはやめた方がよさそうだ。

ちなみにキャッシュフィルターサイズを一定にした場合はこれほどまでにチラつく事は無いけど、オクルージョンレイの数が少なければやはりチラつきは発生する。

下のGIFアニメはオクルージョンレイをデフォルトの24にしたものだ。特に何のパラメータもアニメーションさせていないけど、サンプリングの方向がランダムなので各フレームで計算結果が異なり、このようなチラつきが生じる。サンプリングするレイが増えれば、それだけ精度が上がってブレは少なくなる。また、1つの頂点の計算結果を周りの広い面積に適用しているので、変化が非常に目立ってしまっている。

fig09

同じ条件で頂点キャッシュをOFFにしてやってみたのが下のGIFアニメだ。計算は各ピクセルごとなので変化があったとしてもそのあらわれる範囲はごく微小で、さらに補間もされるのでフレームごとのチラつきは殆どわからない。

fig10

そういう意味では頂点キャッシュを使ってもキャッシュフィルターサイズを大きくすることで変化をぼかしてやればある程度はチラつきを抑えることも出来るようだ。

まあアニメーションでのチラつきについてはマテリアルをベイクしちゃうのが手っ取り早いかもね。

それではまた次回。

modo701ブログ目次



take_z_ultima at 11:30|この記事のURLComments(0)TrackBack(0)modo | CG

2013年05月27日

2014の新機能を調べてみた 3dsmax 2014

前回2013の拡張機能を調べていたらパーティクルフローの中で「データオペレータ」の記述が出てきた。ところが自分の2013では「データプリセット」オペレータはあるけど、なぜか「データオペレータ」は見当たらない。そこで今回からは2013の拡張機能としてパーティクルフローを調べるのではなくて、2014の新機能としてパーティクルフローまわりの機能を調べて見ることにしたわけだ。2014に切り替わる時にMassFXパーティクルのオペレータも名前が変わったみたいなので読み替えてね。下に比較を載せてみた。左が2014で右が2013だ。データオペレータについては2013拡張機能でも実装されている事になっているので他の抜けている部分ももしかしたら同じ理由で見当たらないだけかもしれないけど、単純に比較してみると拡張機能の時よりもオペレータが増えている感じだ。

fig01

で、前回mPシェイプ(MassFXシェイプ)のところで不明だった「データオペレータ」についてさっそく調べてみることにした。

で、ちょっとわかった事は、どうやら「データオペレータ」はパーティクルフローにユーザーカスタマイズしたオリジナルのオペレータを追加するため機能のようで、データオペレータを使うとパーティクルフローよりもよりきめ細かいオペレーティングが可能になるようだ。

例えば、下のシーンはmParticleフローの発生グリッドの幅を縮めてシェイプが平面状に並ぶようにして、mPWorldヘルパーで「重力の適用」をOFFにし、プッシュフォースを加えてmPフォースでmPシェイプに均等に力をかけているところだ。

fig02 

前回やったように、このシェイプの質量を「数値別」で設定するとシェイプの大きさに関係なく全てのパーティクルで質量が同じになり、「密度別」にすればシェイプの大きさによって質量が変って、均等の力で押された時の加速度が個々に変ってくるっていう実験をした。

このシーンのフローに「データオペレータ」を下のように追加して、

fig03

オペレータを選択すると、パーティクルビューのロールアウトに下のような「データオペレータ」ロールアウトが出て、一番上の「データフロー編集」ボタンをクリックすると、

fig04

このようなデータオペレータビューが表示される。そしてここでこのデータオペレータの動作をフローの形で定義するわけだ。

fig05

今回はmPシェイプの質量をランダムに変化させる事をやってみたい。そのためにはオペレータからmPシェイプへ質量の値を出力しなくちゃならないので、まずmParticle出力をコンテナからデータビューのメインウィンドウにドロップして追加する。

fig07

そしてこのオペレータを選択すると、ロールアウトにこのオペレータのパラメータが表示されるので、「入力タイプ」として「質量」を選択する。

fig06

これでこのデータオペレータはmParticleに対して質量を出力するわけだ。

次に質量の値を決めるための「ランダム」オペレータをドロップする。

fig08

そして「ランダム」オペレータの下から出ているノードを出力オペレータの赤い○の部分にドラッグして接続する。これで「ランダム」オペレータが出力する乱数が質量として出力されてmパーティクルに伝わるようになる。

fig09

次に「ランダム」オペレータのロールアウトで「平均:5.0」「シグマ:5.0」にパラメータを設定した。

fig10

そしてパーティクルビューの方に戻って「データオペレータ」のロールアウトで「自動更新」をONにして、

fig11

mPシェイプの「質量」を「質量チャネルから」に切り替えた。

fig12

これでデータオペレータからの値が質量としてmPシェイプで利用されるようになった。

下がそのシミュレーション結果。シェイプの大きさは同じだけどそれぞれのパーティクルの質量が異なるので加速のされ方が個々のシェイプで変っているのがわかる。

fig13

さらにこれを新規のオペレータとして登録する事が出来る。

まずオペレータで調整したい項目をパラメータインターフェースとして外に出す作業から。

「データオペレータ」のロールアウトで「パラメータをエクスポーズ」ボタンを押すと下のようなダイアログが出てくる。ここでパラメータとして表示したいものを左のリストから選び、ラベルを入力して「追加」ボタンを押すと下の画像のように右のリストにパラメータが表示される。これを「平均」と「シグマ」に対して行うと、

fig14

このようにデータオペレータのロールアウトの下にもパラメータが表示される。

fig15

ここで「プリセットを保存」ボタンを押して、名前を付けて登録すると、次回の3dsMaxの起動の時に読み込まれて、オペレータのコンテナに表示されるようになる。

fig16

下の画像は再起動してパーティクルビューを出した時のコンテナの様子。「ランダム質量」というオペレータが追加されているのがわかる。

fig18

さらにこのオペレータを使ってみたところ。ロールアウトとしてエクスポーズしたパラメータが表示されているのがわかる。

fig19

これがどこに保存されているかは「ParticleFlowToolsBox3.ini」ファイルに書かれていて、自分の環境ではユーザーフォルダー内の「AppData/Local/Autodesk/3dsMax/2014 - 64bit/JPN/ja-JP/plugcfg/Particle Flow Data Presets/」に「ランダム質量.pfp」「ランダム質量.pfp.xml」というファイルになっていた。これを削除すればオペレータは消えるのかな(未確認)?

それではまた次回。

maxまとめページ



take_z_ultima at 12:05|この記事のURLComments(0)TrackBack(0)3ds Max | CG
Archives