サンプル ¶
5本の複雑な樫の木のモデルがファイル内にポリゴンスープとして保存されていて、それらを使って1万本の木で構成された森を作成すると仮定します。 単に樫の木のモデルを1万回コピーすれば、メモリが大量に必要になります。このような場合では、軽量のスプライトで木のほとんどを代用すればよいので、モデルをコピーすることは論外です。
モデルをポイント上にインスタンス化すれば、シーン内に、5本の木のモデルを追加で読み込むことなく配置することができます。ビュー操作すると、その木のモデルのみが一度に読み込まれます。しかし、ポイント毎にその木を配置して、トランスフォームするのは、視覚的にはあまり良くない場合があります。
パックプリミティブは、ジオメトリネットワーク内に、それぞれ5ファイルのどれかを参照した1万個のプリミティブを持つことが可能です。各プリミティブの位置とトランスフォームをフルモデルまたはポイントクラウドとして、いくつかの木を選択して調整することができ、必要に応じて5つのファイルまで読み込むことができます。このモデルをFileノードのオプションを使えば、パックジオメトリとして読み込むことができます。
その他の方法として、プロシージャルに木に対して枝と幹のモデルを100個生成して、各モデルに3つのポリゴンスープを使います。Copyノードの Pack Geometry Before Copying オプションを使って、コピー前にそれらのモデルのDetailをそれぞれパック化し、プロシージャルに50個の木のモデルを生成します。それぞれが40個の枝と幹を持つので、パックプリミティブを使えば、その枝と幹に含まれている100個のDetailを参照することができます。パックプリミティブをコピーすると、オリジナルと同じジオメトリデータを参照するので、100個の枝と幹のモデルのみと、それらのモデルを参照するパックプリミティブのセットのみがあります。これらの50個の木のモデルもパック化して、コピーによって森を作成することができます。その結果は、以下の通りとなります:
-
森に対して1個のDetail。これには、1万個のパックプリミティブを含み、参照のみします。
-
50個の固有Detail。各固有の木のモデルのどれか。各Detailには、41個のパックプリミティブを含み、参照のみします。
-
100個の固有Detail。各固有の枝または幹のモデルのどれか。各モデルには3つのポリゴンスープを含み、それに対応するポイントと頂点を持ちます。
-
-
森のDetailは、2MBちょっとの容量を取り、50本の木のDetailは、合計で1MB弱の容量を取ります。各枝または幹のモデルは、約70KB程度なので、100個の枝と幹のDetailは、合計で約7MBとなります。よって、全体の森は合計で10MBの容量を取ります。
パッキングの最初の段階でUnpackingしていたら、枝と幹のモデルを参照した41万個のパックプリミティブを含む森になり、これは約89MBの容量になり、つまり合計96MBの容量になっていたことになります。パッキングの2番目の段階でUnpackingしていたら、123個のポリゴンスープを持つ50本の木のモデルを持つことになり、これは約144MBの容量になり、つまり合計146MBの容量になっていたことになります。両方の段階でUnpackingすれば、森のDetailは、123万個のポリゴンスープを持つことになり、容量が 28.7 GB の容量になっていたことになります。
(これは、Houdiniが自動的にUnpackingしてジオメトリを編集できるようにしているのではなく、Houdiniは、強制的に編集したいパックジオメトリを手動でUnpackさせているのが原因です。つまり、編集ノードを配置して、コンピュータのメモリをすべて使い切った場合は、やってはならないことです。)
例えば、森の中の木のどれかの枝が小道にはみ出しているとすると、その木をUnpackして、そのパックジオメトリを41個の枝と幹のパックプリミティブに置換して、問題になっている枝のパックプリミティブを移動、回転、スケールし、その木に対して41個のパックプリミティブを再Packすることができます。木に対して51個の固有Detailがあります。
Mantraは、パックプリミティブをインスタンスとして扱いますが、インスタンスのネスト化はまだサポートしていないので、このサンプルでは、内部的に41万個のインスタンスを作成し、これはメモリを多く使いますが、実行可能なレベルです。 つまり、パックプリミティブのネスト化で重要なのは、元のジオメトリのサイズとインスタンスの数との妥協点を見つけることです。
例えば、単一ポリゴンをパッキングして、それを参照する100万個のパックプリミティブを作成すると、100万個のポリゴンを持つ1個のDetailよりも著しくメモリ使用量を多く消費しますが、1000個のポリゴンをパッキングして、それを1000回参照した方が結果が良いです。ジオメトリサイズとインスタンスの数のバランスに注意すれば、9GB未満のメモリでも、頂点法線を持つ1兆個以上の立方体のレンダリングが可能です。
枝をソリッドオブジェクトとしてFEMシミュレーションで壊す必要があるなら、その木をUnpackすれば、シミュレーションをセットアップすることができます。RBDシミュレーションでは、ジオメトリをUnpackする必要はあまりありません。パックフラグメントプリミティブを使えば、Detail内のグループを参照することができます。つまり、プリミティブがUnpackされていない限り、グループとパッキングと一緒にCopyノードを使って、グループの内容を持つ新しいDetailを作成する必要はありません。