Houdini 20.0 ジオメトリ

プリミティブのパラメトリック空間(暗黙的なUV)

On this page

概要

HoudiniとMantraでは、すべてのプリミティブが暗黙的なパラメトリック空間(別名、プリミティブUV)を持っています。 これは、サーフェス上の位置を参照したり、ポイントまたは頂点のアトリビュートの他の補間値を参照する際に使用します。

パラメトリック空間の座標は、RayまたはScatterのノード、または、intersectintersect_allxyzdistuvintersectuvdistのVEX関数を使って出力することができます。 パラメトリック空間の座標はプリミティブ内の補間に使用することができ、例えば、Attribute InterpolateノードまたはprimuvVEX関数を使って時間軸に沿ってパラメトリック空間の座標を変形させることができます。

Houdiniにはたくさんのプリミティブタイプがあり、それぞれのタイプが特殊なパラメトリック空間を持っています:

三角形と四角形

HoudiniでのTriangle(三角形)のパラメトリック空間は、原点にあるvtx0が(0,0)、1U軸ユニット上にあるvtx1が(1,0)、1V軸ユニット上にあるvtx2が(0,1)です。 このU座標とV座標は、どちらも三角形の“ 重心座標 ”と等価です。 いわば、それらの重心座標系はvtx1とvtx2に関連付いています。vtx0に関連付いている重心座標は1-u-vです。 これらの重心座標は、3点の頂点に対して3つの線形補間ウェイトを与えます。つまり、P(u,v) = P0*(1-u-v) + P1*u + P2*vと表現することができます。 UV単位正方形の半分は専有されませんが、何かしらの原因で、指定した座標が範囲外にあった場合に、片側半分の領域とは反対側の半分の領域に対称的に頂点が位置してしまうことがあります。

HoudiniでのQuads(四角形)は バイリニアパッチ で表現されていて、4点の頂点がどれも同じ平面上にない場合(つまり非平面)でも、滑らか且つ一貫性を保って制御することができますが、三角形のような平坦なサーフェスではなく二次サーフェスでその四角形が表現されます。 Quad(四角形)のパラメトリック空間でも原点にあるvtx0が(0,0)ですが、1 V 軸ユニット上にあるvtx1が(0,1)、1 U 軸ユニット上にあるvtx3が(1,0)、vtx2が(1,1)です。 バイリニア補間は、丸め誤差の範囲内でP(u,v) = P0*(1-u)*(1-v) + P1*(1-u)*v + P2*u*v + P3*u*(1-v)を使って処理されます。

Non-Convex Quads(非凸型四角形:1つの内角が180度よりも大きい頂点を持つ四角形)でも通常ではバイリニアパッチとして処理されますが、この場合だと自己交差が発生してしまいます。 Non-Convex Quadsは厄介な事を起こすことがあるために、それを三角形化しておく必要があります。これはDivideノードを使って Convex Polygons を有効にすることで可能です。 必要に応じて例えば四角形を維持したいのであれば、 Maximum Edges を4に設定します。 Bowtie Quads(蝶ネクタイ型四角形) は、上手く分割するのがさらに難しく、そのバイリニア補間に納得できないのであれば、Triangulate 2Dのオプションと組み合わせてそれを修正することも可能です。

Mantraシェーダでは、四角形の暗黙的なU座標とV座標がHoudiniのそれらの座標と逆になっています。 この違いによって問題が頻繁に発生するということはありませんが、シェーダ内で暗黙的なUV座標を直接使って作業する場合には混同してしまうかもしれません。 MantraでのTriangle(三角形)では、その三角形の暗黙的なUV座標は、vtx0が重複した四角形(バイリニアパッチ)のUV座標と同じです。 このようになっているので、三角形に対するアトリビュートの補間は、バイリニアによる補間だろうと、重心を中心とした補間であろうと、Houdiniによる補間と同じ結果になります。

上図の三角形と四角形はどれも法線がスクリーン奥手に向いているので、裏面を表示しています。 この法線方向は、“時計回り”が表面です(右ねじの法則と逆の方向)。 他の多くの3Dジオメトリプログラムは、“反時計回り”の法線を使っているので、他のソフトウェアパッケージからポリゴンをインポートした時にその周回順を逆にするには、Reverseノードを使用します。

5辺以上のポリゴン(Nゴン)

5辺以上のポリゴンのことを、他の三角形や四角形と区別するために“Nゴン”と呼ぶことが多いです。

最低でも1つの暗黙的なUVW座標をNon-Convex N-Gon(凹Nゴン)内の各ポイントに呼応させるために、Houdiniは、それらすべての頂点の平均値を中心とした三角形の“扇”を使ってUVWの空間を暗黙的に表現します。 各エッジはuに対して1/nだけ寄与します。このnは頂点の数です。エッジ上のvが0で、中心に向かって線形的に1に近づきます。 境界のパラメータ化は、ポリゴンカーブのパラメータ化と同等なので、頂点が余分にあった場合は、それが頂点0に循環することになります。

しかし、“ 星型ポリゴン ”を例にすると、中心がそのwikipediaで言うカーネール内に入っていないようなポリゴンも存在していて、 そのようなポリゴンの外側にあるポイントのパラメトリック座標が単位正方形の範囲内にあったりすることも、内側にあるポイントが複数のパラメトリック座標を持つことも有り得ます(他に有り得るのは、そのポリゴンが非平面の場合には複数のポイントポジションが同じパラメトリック座標を持つことがあります)。 とはいえ、一つの暗黙的なUVW座標が常に単一位置を表現します。 プリミティブUVW座標を出力するノードまたはVEX関数によってUVW座標が生成されている場合であれば、これは通常では問題を引き起こしませんが、UVW座標を別々に生成または補間しようとした時に混乱を招きかねないです。 つまり、多くの辺を持ったポリゴンでは、座標を決定したり、その座標からポリゴンを補間するのは、辺の数に比例して時間がかかるので、何百もしくは何千もの辺を持ったポリゴンは尚更遅くなります。

Mantraは、例えばDivideジオメトリノードで Maximum Edges を4に設定することと同様の方法を使って、常に5辺以上のポリゴンを三角形と四角形に分割します。 これによって、Houdiniで使用される座標系の問題をいくつか回避することができますが、その代償として、同じパラメトリック座標を持つポイントポジションが複数生成されてしまって不安定になります。 それらの頂点の位置を少しでも変更すれば、そのポリゴンの分割のされ方が変わってしまうので、Nゴンを持った変形ジオメトリをレンダリングする時は、Nゴンがないように且つフレームが変わってもトポロジーが変わらないように必ずジオメトリを変形させる前にRest(静止)ジオメトリを分割してください。 これによって、Nゴン分割による変化で生じるレンダリングのカクツキが回避されます。

上図のNゴンは法線がスクリーン奥手に向いているので、裏面を表示しています。 この法線方向は、“時計回り”が表面(右ねじの法則と逆の方向)なので、まさに三角形と四角形と同じです。 他の多くの3Dジオメトリプログラムは、“反時計回り”の法線を使っているので、他のソフトウェアパッケージからポリゴンをインポートした時にその周回順を逆にするには、Reverseノードを使用します。

Houdiniのポリゴンは、“ブリッジ”と呼ばれるエッジを追加することもできます。 これは、“穴”を構築できるようにポリゴン内部で共有させたエッジのことです。 ブリッジを作成するには、ポリゴンの複数の頂点が同じポイントを2個以上参照している必要があります。 一部の他のソフトウェアパッケージでは、このようなブリッジを許可していないので、他のソフトウェアにエクスポートする際には、ブリッジが追加されたポリゴンを分割する必要があります。 明示的に穴ポリゴンを別ポリゴンとして扱うソフトウェアからそのポリゴンをインポートする際には、Holeノードを適用して正しくブリッジを作成して穴を開ける必要があります。

ブリッジを作成して穴を開ける方法がいくつかあります。 特に、複数の穴を開けたい場合、上図のように穴から別の穴にブリッジすることができます。 注意しなければならない事は、ブリッジはポリゴンのエッジ、他のブリッジのエッジ、穴のエッジを横切ることができないということです。

ポリゴンカーブ

Houdiniのポリゴンカーブは、パラメトリックu座標を持っていて、そのu値は0番目の頂点からn-1番目の頂点まで0から始まり1で終わります。 エッジ毎にu値が1/(n-1)だけ増えます。nはカーブ内の頂点の数です。v値とw値はどちらも0です。

しかし、Mantraシェーダでは、v値はカーブに沿って0から始まり1で終わります。まさにHoudiniのu値と同様で、エッジ毎にv値が1/(n-1)だけ増えます。 Mantraではカーブにwidthがあり、カーブの幅に沿ってu値が0から始まり1で終わります。

縮退ポリゴン(Degenerate Polygons)

Houdiniでは頂点が足りなくてもポリゴンを構築することができ、それを縮退ポリゴンと呼び、自動的に削除されません。 頂点数が0個,1個または2個の閉じたポリゴンは縮退ポリゴンで、頂点数が0個または1個の開いたポリゴン(ポリゴンカーブ)は縮退ポリゴンです。 そのようなプリミティブに対して何かしらの計算をするのはほとんど意味がありませんが、クラッシュ、無限ループに陥らないようにする事が重要で、ノードまたはアセットの入力に縮退ポリゴンを指定した時にメモリ使用量が恐ろしいことになる場合があります。

頂点数が0個のポリゴンのパラメトリック空間は、未定義になります。 頂点数が1個のポリゴンのパラメトリック空間は、その頂点だけですべての空間が満たされていたり、または、その逆の意味になり、すべてのパラメトリック座標がその頂点にマップされます。 頂点数が1個の閉じたポリゴンは、場合によっては、エッジの数と頂点の数が同じになるように維持するために、その頂点からその頂点自身を繋げた1個のエッジとして扱われることがあり、場合によっては、エッジなしとして扱われることがあります。 頂点数が2個の閉じたポリゴンは、場合によっては、2個の頂点を持ったポリゴンカーブとして扱われることがあり、場合によっては、同じエッジを2個持ったポリゴンカーブとして扱われることがあります。

ポリゴンスープ

ポリゴンスープは、単一プリミティブで複数フェースを表現します。 各フェースは、それと等価の閉ポリゴンプリミティブと同じ暗黙的なuv座標を持っています。

w座標は、ポリゴンスープで参照されているフェースを示す目的で使用されています。 ポリゴンスープ内のフェース番号が16,777,216(つまり2^24)以下であれば、このw座標の値は、そのフェース番号を浮動小数点値で表現されています。 その値を越えたフェース(最大19億フェースまで)に関しては、wの値は、固有な値、プラスの値、無限大ではない値(Non-Infinite)、非数ではない値(Non-NaN)、浮動小数点で表現できる値(Non-Denormal)である保証があります。 そのため、1を乗算しても0を加算してもその値が維持されます。 このw座標は、pack_inttosafefloat VEX関数を使ってフェース番号から生成することができます。 反対に、unpack_intfromsafefloat VEX関数を使ってw座標からフェース番号を取得することができます。 HDKでは、それらのVEX関数に相当するのがUT_SafeFloat.hのUTpackIntToSafeFloatとUTunpackIntFromSafeFloatです。

四面体(Tetrahedra)

Houdiniの四面体(tets)は、場合によっては“ソリッド”として扱います。 例えば、xyzdist VEX関数またはRayノードの Minimum Distance オプションを使用する時がそうです。 それらの機能は、ポイントクラウドのポイントのパラメトリック座標が四面体メッシュ内にあるかどうかを判断するのに役立ちます。 とはいえ、非共有フェースや四面体メッシュの表面だけを扱う時もあります。 その場合には、intersect関数またはRayノードの Project Rays オプションを使用します。 四面体メッシュの境界、四面体の出入りは、それらのケースでは、おそらく目的通りの結果が得られます。

どちらの状況でも、パラメトリックuvw座標は同じ様にレポートされます。 三角形と同様に、原点にあるvtx0が(0,0,0)、1 U 軸ユニット上にあるvtx1が(1,0,0)、1 V 軸ユニット上にあるvtx2が(0,1,0)、1 W 軸ユニット上にあるvtx3が(0,0,1)です。 またまた三角形と同様に、u, v, wは、vtx, vtx2, vtx3に関連付いている 重心座標 と等価です。 vtx0に関連付いている重心座標は1-u-v-wです。 これらの重心座標は、4点の頂点に対して4つの線形補間ウェイトを与えます。つまり、P(u,v,w) = P0*(1-u-v-w) + P1*u + P2*v + P3*wと表現することができます。 UVW単位立方体の5/6は専有されませんが、何かしらの原因で、指定した座標が範囲外にあった場合に、その座標が、有効な領域内に対称的に頂点が位置してしまうことがあります。

上図の三角形のフェースはどれも法線がスクリーン奥手に向いているので、裏面を表示しています。 この法線方向は、ポリゴンプリミティブと同様に“時計回り”が表面(右ねじの法則と逆の方向)です。 さらに四面体メッシュは、それらの法線方向を反転させた場合にはマイナスの符号付きボリュームとして考慮されます。 四面体のフェースの法線が内側を向いている場合(反対側にある頂点と向かい合っている場合)、そのボリュームは反転を意味し、外側を向いている場合、そのボリュームは反転していないことを意味します。 各頂点に呼応した暗黙的なuvw座標をポイントポジションに割り当てた場合、その四面体が反転することに注意してください。

どの四面体も4個の頂点を持っているものと想定されています。 HDKを使って異なる数の頂点で四面体を構築してしまった場合、コードがクラッシュもしくは不可解な結果が生成されてしまいます。 addprimaddvertexのVEX関数は、異なる数の頂点で四面体を構築することを許可していません。

ボリューム

ボリュームは1個の頂点しか持たないので、Pとボクセルの値だけが補間されます。 Houdiniの単一ボリュームプリミティブは、ボクセル毎に32ビット浮動小数点値しか表現しません。 “Cd.x”, “Cd.y”, “Cd.z”のような名前でnamePrimitive文字列アトリビュートを使用することで、複数のボリュームプリミティブを実質的なベクトルボリュームに論理的にグループ化することができます。 パラメトリック方向の片側に1ボクセルしかないようなボリュームのことを“2Dボリューム”と呼びます。この2DボリュームはHoudiniの色々な箇所で平坦な画像として扱うことができます。 ボリュームプリミティブには、2Dまたは3Dの“フォグボリューム”、3Dの“符号付き距離フィールド”(SDFs)、2Dの“Heigh Fields”があります。

位置を計算したいのであれば、まず最初に(0,0,0)から(1,1,1)の範囲のボリュームのパラメトリック座標を(-1,-1,-1)から(1,1,1)の範囲に変換してから、何かしらのテーパー(フラスタムボリューム用)、3×3ローカルトランスフォーム(回転)、平行移動を適用してPを求めます。 位置からパラメトリック座標を計算したいのであれば、その逆の処理(逆の順番)を行ないます。 2D Height Fieldボリュームに関しては、2個以上のボクセルがある軸のパラメトリック座標で評価されたボリュームの値を、その軸方向を向いた中心平面からディスプレイスメントが適用されます。

ボリュームプリミティブのボクセルデータは、セルの中心で扱われます。 ボクセルの中心間のデータは、 三重線形補間 されます。 0と1のパラメトリック値は、パラメトリック軸方向にそれぞれ最初のボクセルの前面、最後のボクセルの背面の位置に呼応します。 それらの座標はボクセルの中心間ではなく境界上にあるので、“constant”, “repeat”, “streak”, “sdf”といった境界タイプで使用する境界外の値として扱われます(境界タイプはvolumebordertype Primitive Intrinsicアトリビュートで確認することができます)。 (そのvolumebordervalue Primitive Intrinsicアトリビュートの)“constant”は、値を一定で使用することを意味し、“repeat”は座標が常にボクセルの中心間になるようにボクセルグリッドを循環すること意味し、“streak”は、座標がボクセルの中心間で一番近い境界にスナップさせた場合に評価される値を使用することを意味します。 “sdf”は、一番近い境界ボクセルデータまでの距離を使用することを意味します。これは別の見方をすれば、そのボリュームをそのボクセルデータのプラスとマイナスの境目にできた陰関数サーフェス(Implicit Surface)と見なすことができます。 そのボクセルデータは陰関数サーフェスまでの符号付き距離として使うことができます。

ボリュームプリミティブのボクセルデータは、16の倍数でない解像度の軸では、16×16×16のタイルに格納されます。 すべてのボクセルの定数値のみを含んだタイルは、フルグリッドのデータではなく単一値で表現することができます。 これによって、Sparse(疎)ボリュームデータを効率良く表現することができます。

VDBs

VDBは、非常に疎らなボリュームデータ向けに最適化されたオープン規格のボリューム表現で、一般的には“Narrow Band(狭帯域)”のボトムレベルのボクセルデータのみを持っていて、任意のレベルで一定にすることができる4レベルのツリーのタイルを使用します。 トップレベルを任意の解像度にすることができますが、他のレベルはボトムレベルのボクセルまでタイル毎に固定2の累乗で解像度が下がります。 ほとんどの他のプリミティブタイプとは違って、VDBのパラメトリック空間は(0,0,0)から(1,1,1)の範囲に制限 されていません 。 VDBのパラメトリック空間は、ボトムレベルのボクセルインデックス空間と同一で、そのボクセルインデックスは、トップレベルのグリッドのシフトに依存してマイナス値になることがあります。 これによって、既存データのパラメトリック座標を変更することなく、新しいボクセルデータを(丸め誤差を考慮した範囲内で)任意の場所に追加することができます。 VDBグリッドのトランスフォーム(フラスタムトランスフォームを含む)は、ボクセルインデックス空間を物理空間に直接トランスフォームされます。

VDBを使って“符号付き距離フィールド”(SDFs)を表現することが非常に多いです。また、このSDFのことを“レベルセット”とも呼びます。 しかし、Narrow Band(狭帯域)でしか陰関数サーフェスまでの正しい符号付き距離を持たないことが多いのに対して、 そのNarrow Band外の定数タイルデータ値は符号だけが正しくて、実際の距離は正しくありません。 いくつかのVDBは代わりに“フォグボリューム”を表現します。このボリュームの値は密度などの他の値を表現します。 専有されたタイルの範囲外のVDBの値は“背景値”です。

ボリュームプリミティブと同様に、VDBは1個の頂点しか持たないので、Pとボクセルの値だけが補間されます。 ボリュームプリミティブと違って、VDBのボクセルのデータには、32ビット/64ビット浮動小数点値、32ビット整数値、ブール値、3個の32ビット/64ビットの浮動小数点値のベクトル、3個の32ビット整数値のベクトルを指定することができます。 HDKを使えば、VDBグリッドをプリミティブの一部ではなく直接作成して、他のデータタイプを指定することができます。

See also

ジオメトリ

学ぼう

モデリング

地形

粉砕

  • 破壊

    色々なタイプの材質を破壊する方法。

次のステップ

導師レベル