On this page |
概要 ¶
Copy to Pointsノードは、あるジオメトリを他のジオメトリの ポイント にコピーします。
これは、雪(雪の結晶を落下するポイントにコピー)、森(地面にポイントをばらまいて、そこに木をコピー)、街(グリッドポイントにビルをコピー)などのようなたくさんの効果を作るのにとても役に立ちます。
コピーは、インスタンスと機能が似ていますが、コピーは編集ができる実際のジオメトリを作成し、バリエーションを持たせることができ、固有のアトリビュートを使ってコピーを作成することができます。
How to ¶
-
Modify タブの Copy to Pointsツールをクリックします。
-
コピーしたいソースジオメトリを選択して、Enterを押します。
-
そのソースをインスタンス化させるポイントのターゲットジオメトリを選択して、Enterを押します。
コピーをトランスフォームさせる方法 ¶
ジオメトリのコピー先のポイントに何か特別なアトリビュートがあれば、Houdiniは、自動的にそれらのアトリビュートをコピージオメトリに適用します。
例えば、pscale
(均一)またはscale
(非均一)によって各コピーのスケールを設定したり、up
によって各コピーの向きを変更することができます。
詳細は、コピーとインスタンスのPointアトリビュートを参照してください。
コピーのジオメトリにバリエーションを加える方法 ¶
Note
以前のバージョンのHoudiniでは、このワークフローが コピースタンプ と呼ばれる処理によって行なわれていました。 新しいバージョンのHoudiniでは、このワークフローをより効率的でセットアップがしやすく、そして理解しやすいFor-Eachループをジオメトリネットワーク内に持たせることができます。
ジオメトリをポイントにコピーする時にそれらのコピーにバリエーションを加える基本的なワークフローは、コピー先のポイント上にアトリビュートを設定してから、For-Eachループを使って、1個ずつポイント上にジオメトリをコピーして、そのループ内でジオメトリを修正することです。
コピーにバリエーションを加える例は、チュートリアルを参照してください。
(あなたがやりたい事が各コピーを移動、回転、スケールさせることであれば、正しくアトリビュートを使用することで、For-Eachループを必要とすることなくHoudiniが自動的にそれをすることができることを覚えておいてください。)
Pointアトリビュートのセットアップ ¶
-
バリエーションを加えるのに必要な情報を格納させるターゲットポイント上にアトリビュートを作成します。
-
Attribute Createノードでアトリビュートを作成することができます。もしくは、VEXスニペットの方が快適なのであればAttribute Wrangleでアトリビュートを作成することができます。
-
例えば、各ポイント上に3つの異なるジオメトリをランダムに切り替えたいとします。この場合、ターゲットポイント上に
piecenum
Pointアトリビュートを作成して、その値に0
、1
、2
のランダム値を設定すれば良いです。Attribute Createでこれを行なうには、アトリビュートの Name を
piecenum
に、 Class を“Point”に、 Type を“Integer”に、1番目の Value フィールドをrand($PT) * 3
に設定します。Attribute Wrangleでは、以下のスニペットを使用します:
i@piecenum = int(rand(@ptnum) * 3);
-
各ポイントに固有の番号を持たせます(ジオメトリを修正すると、ポイント番号が変わる可能性があるからです)。コピーした時にポイント番号を使用できるようにそのポイント番号をアトリビュートにコピーするには、Enumerateノードを使用します。
(ポイント番号をアトリビュートにコピーする時は、その慣習として、そのアトリビュート名を
id
にします。) -
ポイント上に0から(ポイント数 - 1)の範囲の乱数を生成したい場合の簡単なテクニックは、Sortノードの“Random”モードを使ってポイント番号をごちゃ混ぜにしてからEnumerateを使って、そのごちゃ混ぜになったポイント番号をアトリビュートにコピーすることです。
Tip
Geometry Spreadsheetを使用することで、ノード内のすべてのポイントのアトリビュート値を確認することができます。 ネットワークエディタ内でジオメトリノードを右クリックして、 Spreadsheet を選択します。
For-Eachループでのコピー ¶
1個ずつポイント上にソースジオメトリをコピーできるようにFor-Eachループを作成し、そのループの中に、コピー先のポイント上のアトリビュートに基づいてジオメトリを修正させたいノードを使用します。
-
ジオメトリネットワーク内にFor-Eachループブロックを作成します。
-
アトリビュートが付いたターゲットポイントをFor-Each Beginノードに接続します。
For-Eachループは、ターゲットポイント毎に一回ずつ処理します。
-
foreach_end
ノードのデフォルトの設定は、ポイントへのコピーとは異なる特定のワークフロー(例えば、粉砕の破片に対してループ)向けになっているので、いくつかのパラメータを変更する必要があります。-
ブロックがポイントに対してループするように Piece Elements を“Points”に設定します。
-
ブロックがアトリビュートによるピースのグループ化をせずに個々のポイントすべてに対してループするように、 Piece Attribute を無効にします。
-
-
このループの中で、Copy to Pointsノードを作成して、For-Each BeginノードをそのCopy to Pointsノードの 2番目の (“Target points to copy to”)入力に接続します。
-
バリエーションのあるジオメトリが生成できるようにノードを作成して、それをCopy to Pointsノードの 1番目の (“Primitives to copy”)入力に接続します。
バリエーションのあるジオメトリを生成する際の秘訣は、それらのノードにpointエクスプレッション関数を使用して、現行ポイントからアトリビュートを読み込み、それらのアトリビュートを使ってジオメトリの生成方法を変更することです。
point
エクスプレッション関数は、以下の引数を受け取ります:
point(path_to_geometry_node, point_number, attribute_name, index)
-
path_to_geometry_nodeはFor-Each Beginノードのパスです。コピー先となるポイントは、ループする度にこのパスに格納されていきます。
-
point_numberは 常に0 です。その理由は、ループする度に1個のポイントしか操作しないからです。
-
attribute_nameは読み込みたいPointアトリビュートの名前です。
-
アトリビュートタイプがintegerまたはfloatであれば、indexを
0
のままにすることができます。アトリビュートタイプがコンポーネント(例えば、カラーならR, G, B、ベクトルなら3つの軸)であれば、index
を0
,1
,2
などのように変更してpoint
関数を個々にコールして、各コンポーネントを別々に読み込む必要があります。
例えば、ポイントのpiecenum
アトリビュートの内容に基づいて、その候補となるピースのどれかを各ポイント上にコピーしたい場合、Switchノードを作成して、以下のようなエクスプレッションを使って異なる入力を切り替えることができます:
point("../foreach_begin2", 0, "piecenum", 0)
…それから、そのSwitchノードをCopy to Pointsノードの1番目の入力に接続します。
For-Eachノードのコンパイル ¶
For-Eachループは、コピーの数が多くなるほど遅くなってしまいます。コピーを高速化するには、そのループをコンパイルブロックで囲んでみてください。
便利なノード ¶
ポイントをランダムに、且つ、サーフェスに均等にばらまきます。これは、サーフェス上にポイントを作成して、ソースジオメトリをそのポイント上にコピーするのに役に立ちます。例えば、“起伏のある丘”のようなジオメトリ上にポイントをばらまき、そのポイントに木を配置することができます。
色々な基準に基づいてポイントを削除できます。例えば、N番目毎のポイント、最後のN個のポイントなど。ポイントの削除をアニメーションさせることで、コピーが増えたり、減ったりすることができます。
Pointアトリビュートを作成または修正します。
VEXスニペットによって、Pointアトリビュートを作成または修正することができます。
See also |