On this page |
概要 ¶
インスタンス化は、レンダリング時にオブジェクトを他のオブジェクトに置換します。これは、例えば、3D表示を軽くするプロキシジオメトリ(代用ジオメトリ)を使って重いジオメトリを置き換え、レンダリング時には詳細なジオメトリを使います。
ポイントインスタンス は、 レンダリング時 にオブジェクトのポイントを他のオブジェクトに置き換えます。これは、簡単にオブジェクトを大規模な数だけ効率的にコピーすることができます。例えば、草原のサーフェス上にポイントをばらまいて、レンダリング時にそのポイントを木に置き換えることができます。
インスタンス化はレンダリング時に行われるので、インスタンス化したジオメトリはメモリをそんなに使わないのでHoudiniでの作業中の表示は遅くなりません。一方で、ビューポートでインスタンス化したジオメトリが見れないので最終シーンをイメージしにくいです。
ポイントインスタンスは、パーティクルインスタンスの機能にかなり似ています。
Tip
Delayed Loadシェーダを使うと、シーンではなくディスクにジオメトリのインスタンスを保存します。
How to ¶
-
ネットワークエディタでは、オブジェクトレベルでインスタンスオブジェクトを作成します。このインスタンスオブジェクトは、標準のジオメトリコンテナオブジェクトにインスタンス関連の特別なレンダープロパティが追加されたものにすぎません。
-
オブジェクトのパラメータで、 Instance タブをクリックして、 Instance Object パラメータに、あなたがインスタンス化したいオブジェクトのパスを設定します(ネットワークからノードをそのパラメータ上にドラッグして設定することができます)。 Point Instancing をオンにすると、インスタンスオブジェクトが 置き換わる のではなく、インスタンスオブジェクトのポイントにインスタンスが配置されます。
-
インスタンスオブジェクトの中に入り、 テンプレートジオメトリ をモデリングします。上で設定したインスタンス化するオブジェクトがレンダリング時にこのジオメトリのポイント上にコピーされます。
(ネットワークとパラメータエディタの取り扱い方は、ネットワークエディタの使い方を参照してください。)
Tip
手動でオブジェクトに同じプロパティ(パラメータエディタで、ギアメニュー > Edit Rendering Properties から Instance フォルダを Existing Parameters リストにドラッグします)を追加すればインスタンスオブジェクトができます。とはいえ、通常はインスタンスオブジェクトから始める方が便利でしょう。
どのように機能するのか ¶
ポイントインスタンスを使うと オブジェクトレベル のノードのみインスタンス化できます。例えば、ジオメトリコンテナオブジェクト、ライト、カメラ、オブジェクトサブネット、オブジェクトレベルのデジタルアセットなど。
インスタンス毎にトランスフォームのようなオブジェクトレベルのパラメータを変更することができます。また、インスタンス毎に マテリアルパラメータを上書き することもできます。インスタンスは、インスタンス化するポイントから色々なアトリビュートを取得することができます。詳細は、コピーとインスタンスの多様化を参照してください。
インスタンス化すると、処理が速くて効率的です。なぜなら、レンダラーはオブジェクトのジオメトリのコピーを1個保持して、それをインスタンス毎に何回も出力するだけでいいからです。 例えば、ビルの階数を変更するのに内部のサーフェスネットワークを変更するパラメータ付きの超高層ビルオブジェクトアセットがあるとすると、階数を変更させてオブジェクトをインスタンス化することは できません 。なぜなら、レンダラーはインスタンス化にオブジェクトのジオメトリを 1個 コピーして保持するからです。 ジオメトリにバリエーションを持たせてインスタンス化するには、以下の方法のどれかを使います:
-
各ジオメトリのバリエーションをアーカイブに保存して、Delayed LoadシェーダとPointアトリビュート、または、どのバリエーションをポイントにインスタンス化するのか制御するエクスプレッションを使います。Delayed Loadシェーダによるインスタンス化を参照してください。
-
可能なら、アセットを変更します。つまり、そのバリエーションがジオメトリレベルではなく、オブジェクトレベルで機能するアセットにします(例えば、各パートがオブジェクトの超高層ビルアセット)。
ビューポートでのインスタンス化 ¶
ビューポートレンダラーは、ある程度までのインスタンス化をサポートしています。単純なインスタンスとポイントインスタンスは、インスタンスオブジェクトやInstancingパラメータ付きのジオメトリオブジェクトを使うことで、オブジェクトレベルでサポートされています。ビューポートは以下の事をサポートしています:
-
単純なインスタンス。ポイントインスタンスを使用せず、オブジェクトが他のオブジェクトのジオメトリを参照します。
-
ポイントインスタンス。オブジェクトのジオメトリがInstancingパラメータ付きのオブジェクトの各ポイントにインスタンス化されます。Pointアトリビュートを使ってトランスフォームを変化させることができます。
-
オブジェクトパスまたはinstancepoint()エクスプレッションの値で変化するトランスフォームによるポイントインスタンス。
-
Pointアトリビュートの
instancepath
で指定したオブジェクトパスによるポイントインスタンス。
上記の場合のバリエーションにも対応しています(instancepoint()
で駆動するパラメータやアトリビュートを使ってバリエーションを作成します)。
ビューポートのDisplay Optionsの Geometry タブの Point Instancing のパーセンテージを変更してパフォーマンスを上げると、インスタンスの数を減らすことができます。表示可能なインスタンスの数はグラフィックカードに依存します。 Point Instancing をオフにすれば、大元のインスタンス化で使用するポイントジオメトリを表示することもできます。
インスタンスオブジェクトを指定すれば、インスタンスオブジェクトそのものというよりはインスタンスジオメトリが表示されます。これは、 Point Instancing ディスプレイオプションを無効にするのと同じです。
Note
3D View Display Optionsダイアログの Geometry タブの Point Instancing を、いくつかのインスタンスが Stand In Geometry で置き換えられ始まる前にインスタンス化できるOpenGLプリミティブの最大の割合を設定します。これによって、グラフィックドライバを停止または再起動しなければならないほどの膨大な量のレンダリングでグラフィックカードがオーバーランしてしまうのを回避することができます。この値をゼロに設定すれば、常にStand-In(代用)ジオメトリを使用します。
現在のところ、material_overrideとshop_materialを使ったマテリアルのインスタンス化はビューポートでは対応していません。プロシージャルも対応していません。
Tip
古いチュートリアルでは、 ポイントインスタンス を模倣するために、Copy SOPをディスプレイフラグに、そのノードの入力をレンダーフラグにすることを提案しています。これは、インスタンス化がビューポートでネイティブに対応する前に、ビューポート内のインスタンスを表示する方法でした。この場合では、Copy SOPを使ってジオメトリを複製しています。今では、ビューポートに ポイントインスタンス の機能があるので、このステップをスキップすることができます。
Copy SOPのメソッドとビューポートの ポイントインスタンス の両方を使った場合、複製したジオメトリのポイントすべてにインスタンスオブジェクトが表示されます。これは、間違えているだけでなく、表示するインスタンスの数が膨大になり非常に遅くなります。
See also |