ボリューム:煙、炎、液体
ボリュームは表面ではなくボクセルの箱です。煙の柱、炎、爆発、水など。PixorはBlender、EmberGen、Houdiniの.vdbファイルを読み、シミュレーションツールがないときのために独自のものもいくつか持っています。
ボリュームにはジオメトリがありません。プロセッサー上で、ピクセルごとにレイを通して描かれ、その結果はモデルと同じ画像に入ります。そのため炎は手の前に、キャラクターは煙の中に立ち、帯、線、クリーンアップはほかのものとまったく同じように扱います。
追加する
シーンステップで、アウトライナーの+メニューのボリュームの下:
| ぽんと噴く | 丸い煙の塊 |
| 炎 | 下は熱く狭く、上は冷たく広く |
| 雲 | 幅広で、底は平ら、上はでこぼこ |
| 霧 | 薄く、低く、均一 |
| .vdbファイルから… | Blender、EmberGen、Houdiniのシミュレーション |
ボリュームはシーングラフのボリュームノードで、アウトライナーのその行は同じノードです。その後のRowはボリュームの列で、それぞれコピーの位置に置かれます。どこにも接続されていないものはシーンにありません。設定もノード上にあります(ボリュームの名前でpxr project scene game.pixor --set flame.voxels=48)。
コマンドラインでは:--volume flame:0.5,0.8,0.5:0,0.55,0。数値はサイズ、続いて位置で、単位はメートルです。.vdbへのパスも同じ位置に指定できます:--volume smoke.vdb:1.2。
ボーンに運ばれるボリュームは、すべてのクリップでボーンの行く場所へついて行き(手に持ったたいまつの炎)、炎と同じように直立したままです。位置はボーンから測ります。コマンドラインでは末尾に@BONE:--volume flame:0.25:0,0.05,0@hand.r。
エフェクトのエミッターに運ばれるボリュームは、そのエフェクトの一部になります:エフェクト自身の行に、エフェクトの最初のフレームから、エミッターがどこにあっても(ボーン上でも、クリップのキーが動かす場所でも)描かれ、ほかの行には描かれません。爆発の煙、呪文の炎などです。位置はエミッターから測ります。コマンドラインでは、プロジェクトのN番目のエフェクトに@effect:N:--effect explosion --volume puff:1.5@effect:1。
描き方
これらはボリュームのインスペクターの描き方の下にあります。
- 太さは、ピクセルが描かれるまでに必要なボリュームの量です。高いほど引き締まった硬い形に、低いほど淡くたなびく形になります。
- 柔らかい縁は、ほつれる縁の幅です。縁はボリューム自体に固定された規則的なパターンでディザにより消えていき、ブレンドはされません。そのため、どのピクセルもパレットのままで、ボリュームが回ってもパターンが這い回りません。
- セルフシャドウは、光がボリュームを通り抜けなければならない所で、ボリュームがどれだけ暗くなるかです。
- 色はボリューム自身の色で、ランプはそこから作られます。熱い色は燃えている部分の色です。色と同じにすると何も燃えないことになり、煙にはそれが適しています。グローの対象は、光に関係なく熱い色になるには、どれだけ熱くなければならないかを指定します。
- ボクセルは、ボリュームを最も長い辺に沿ってどれだけ細かく刻むかです。スプライトの1ピクセルには1〜2ボクセルが適当です。それ以上はちらつくだけです。フレームごとに違うボクセルがピクセルを取るからです。256³のシミュレーションは読み込み時にこの値まで刻み直されるので、32 pxの煙の柱が静止して見えます。
- サンプル数は、ボクセルごとにレイ上の何点を見るかです。スプライトのサイズなら2で十分で、増やすと滑らかになりますが遅くなります。
ボリュームにはきらめきが付きません:雲にはきらめきがなく、ボリュームのシェーディング元である密度は、許せばきらめくほどでこぼこしているからです。
シーケンス:動かす
1つの.vdbは1つの静止ボリュームです。シミュレーションは1フレームごとにファイルを書き出します(fire_0001.vdb、fire_0002.vdbなど)。Pixorに最初のファイルを指定すれば、残りも順に再生されます。
ボリュームのシーケンス欄で:
| フレーム | 開いたファイルから数えて、再生するファイルの数 |
| 毎 | Nファイルに1つを使う:シミュレーションは通常、スプライトに必要なより多いフレーム数で書き出されるため |
| ループを閉じる範囲 | 終わりからこのフレーム数を始まりへクロスフェードし、スプライトが途切れずに繰り返し再生されるようにします。それらのファイルはフェードになり、再生されません:5つのファイルにフェード1なら4フレームです |
コマンドラインでは、シーケンスはサイズと位置の後に続きます:--volume fire_0001.vdb:1.5::24,2,4 — 24個のファイルを1つおきに使い、最後の4つは最初へとフェードして戻ります。
シーケンスは、シートにすでにある動きと一緒に再生されます。歩行サイクルの横に炎を置けば、炎のフレームは歩行のフレームになります。ほかに動くものがなければ、シーケンスが動きそのものになり、volumeという独自のアクションを持ちます。
すべてのフレームは、シーケンス全体が占めるボックスから求めた同じ変換で配置されるので、大きくなる煙がフレームごとに縮んで見えることはありません。つまり、サイズは最初のフレームではなく、シーケンス全体のサイズです。
シーケンスが丸ごとメモリに載ることはありません。各ファイルはその箱を求めるために1回読まれ、シートやプレビューがそのフレームに達したときにもう一度読まれ、直近の3つが保持されます。長いシミュレーションは読み込みに時間がかかるだけで、メモリは食いません。
Pixorが読み込めるもの
通常のツリー構造でfloatまたはベクトルのグリッドを持つ.vdbファイル。値はそのまま、zip圧縮、またはBlosc-LZ4で格納されたもの(Blosc 1.14以降が書き出すように、バイトごとのストリームに分割されていてもいなくても)、全ボクセルでもアクティブなものだけでも読めます。これはBlender、EmberGen、Houdini、OpenVDB自身のツールが書き出す形式です。density、smoke、fog、dという名前のグリッドをピクセル化し、次に熱い部分としてtemperature、flame、heat、fire、さらにちらつき防止パスが使う動きとしてvelocityを読みます。液体の表面(レベルセット)は、硬い縁を持ち中まで詰まった厚みとして読まれます。
Pixorが読めないものは、間違った結果を出す代わりに、名前を挙げてそう伝えます。別の圧縮方式、別の種類のツリー、せん断を含むトランスフォームなど。pxr inspect fire.vdbはファイルのグリッド、そのサイズ、ボクセルサイズを表示します。
まだないもの
- 液体はボリュームとして読み込まれ、泡も反射もなしに描かれます。両方を持つ水面は、ワールドの水ノードです(ワールド)。