HOME

Maneki Pipeline

ゲーム開発のためのプロシージャル

UV Layout ノード

ノードの用途

環境

Houdini21.0.596

概要

Houdini Document | UV Layout
https://www.sidefx.com/docs/houdini/nodes/sop/uvlayout.html

HoudiniのUV Layoutノードは、UVアイランドをUV空間に効率的に**パッキング**(配置)するためのSOPノード。
…なのだが対象アトリビュートを変更すればどんな平面空間でも値に応じたパッキングを行うことができる。

3D空間での領域詰込みに使える

主要な用途

UVレイアウト

UVアイランドの形状を解析し、指定されたUV空間内に隙間なく詰め込む。
レイアウト時に

  • 3D表面積に応じたサイズ調整
  • 最大で回転する角度の大きさ

なども決められる

覚えておくべきパラメータ

触ればすぐ判る物以外の、知っておくと良さそうなパラメータ

Scale Island to Match Their Surface Area

UVを、該当領域が割り当てられている大きさとジオメトリの大きさが一致するようにリサイズしてくれる
後述の「Packing/Scale」もサイズを変更する設定だが、先にこちらのサイズ調整が反映される

Scale Island to Match設定前
Scale Island to Match有効で表面積に合わせてスケーリングしてくれる

Axis Alignment

変形の前に事前に長辺がUV平面に水平になるようにUV島を回転させる。
「Scale Island to Match Their Surface Area」同様、パッキングの事前処理として実行される。
回転させたくないのであればRotationだけではなく、こちらもNoneにする必要がある

Axis Alignmentで最も長いエッジをUV平面に並行にできる

Packing/Scale

パッキングする際のスケール設定。
MaximumはサイズがフィットするようにUVアイランドがリサイズされ、Fixedはリサイズを行わず、FixedScaleパラメータで全体のサイズを調整できる。

領域に合わせたスケールの有無を設定できる
Fixedで領域に収まらなかったアイランドがあった場合グループ化もしてくれる

IslandtoPack/UV Attribute

パッキングで参照するアトリビュートを変更することができる。
これを設定することでUVレイアウトノードをUVパッキング以外の用途で利用できる。

パッキングの参照アトリビュート設定できる

Targets/Pack Into

パッキングする領域を指定できる。
デフォルトでは指定された矩形で、UDIMに変更したり第2入力のジオメトリが持つアトリビュートの島を参照させるようにすることができる。

第2入力のPrim面をアイランドとしてパッキング領域に指定できる

Advanced/Iterations、Advanced/ RandomSeed

Iterationsは詰め込み精度をより高めるための試行回数だが、Iterationsが2以上の際、詰込みの配置をランダム化するためのSeedを設定できるようになる。
後述の、UV以外の詰込みを行うような場合は詰込みのランダム化に利用できる。

Iterationsが2以上の場合はパッキングをSeedによってランダム化できる

Overrides/ Variable Scaling/ Islands Scale Attribute

アトリビュートを指定することでそのUVアイランドに対してのスケール係数として利用することができる。
後述の、AmbientOcculusionによるUVスケーリングのような利用ができる。
なおドキュメントには「マイナスが無視される」と書いているが0も無視されるので注意。

アトリビュートをUVアイランドリサイズの係数にできる

テクニック

AmbientOcculusionによるUVスケーリング

UVレイアウトノードはUVアイランドの比率をアトリビュートで指定できる。
以下はmaskbyfeatureで作成したAOに合わせてUVスケールを変更する例。

  1. maskbyfeatureでAOからmaskアトリビュートを作成
mask by featureでAOを計算
  1. remapで値の調整とiscaleアトリビュートにリネーム

    この時、UVレイアウトのIsland Scale Attributeは0で無視されてしまうので下限を正の値にしている

係数として使うためにアトリビュートのremapとrename
  1. attribpromoteでiscale(元mask)をprimアトリビュートに変更
  1. split uv seamでUVごとにprimを分離し、For Each Connected Piece でUVごとにループ処理
    uvそれぞれでiscaleをprim→detail→primと変換してUVごとにiscaleの平均を取得
UVアイランドごとのiscale(mask)値の平均を割り当て
  1. uv layoutのvariable scalingでアトリビュートに合わせてUVサイズをスケールできる。アトリビュートに合わせたスケールとパッキングを同時に行うと領域全体にスケーリングされないので1つ目でアトリビュートに合わせたスケーリング、2つ目でパッキングしている
二つのUVレイアウトでAOが暗い場所ほどアイランドが小さくなるようにリサイズしパッキング

Pアトリビュートによるジオメトリのパッキング

公式ドキュメントにも記載されているテクニックで、UVAttributeを平面空間でのパッキングに利用する

1. Island to Pack/ UV Attribute と Targets/UV Attributeの設定をPに設定

2. Targets/ Pack IntoをSecound Inputに設定すると

3. Advanced/ Iterationsを2以上にすると Advanced/ Random Seedで配置をランダム化できる

ワールド座標上で指定領域へのパッキングに利用できる

領域への詰込みは色々な用途があるので、UVレイアウトでできることを知っておくと便利かと思います。

fish_ball

プロシージャル魚類