Labs Normal Rotate / Normal Levels / Normal Invert / Normalize Normalノードについて


こちらの記事では、「Labs Normal Rotate」「Labs Normal Levels」「Labs Normal Invert」「Labs Normalize Normal」ノードの概要および各ノードのパラメーターについてご紹介します。
SideFXLabsツールのノードは、SideFX社のホームページで紹介されています。併せてご覧ください

SideFXLabsツールのインストール手順

SideFX Labsツールセットのインストール手順については、以下の記事をご参照ください。

Houdiniの内部システムからの直接インストール

Githubからの手動インストール

Labs Normal Rotateとは

ノーマルマップの内部ベクトルの計算を補正しながら回転させます。
従来のXformは、ノーマルマップを回転させる適切な方法ではありません。ノーマルマップは色ではなく方向を示すため、赤/緑/青のチャネルは常に接線、従法線、および法線軸を適切に表す必要があります。

各パラメーターについて

①Angle

画像の回転(角度)を-180から180までの範囲で設定します。



Labs Normal Levelsとは

ノーマルマップのブラックポイント、ホワイトポイント、ミッドレンジを元に、ノーマルマップのコントラストの増加や削減およびバランスを保持することができます。
このノードは、Levels COPのラッパーであり、値を-1から1の空間に移動させ、その後値を0から1の空間に戻すことも可能です。
また、Labs Normal Normalizeノードを使用して値を正規化することもできます。Labs Normal Normalizeノードの詳細は、記事の下部に記載しています。併せてご参照下さい。
※Levels COPは、画像のバランスをシャドウ、ハイライト、中間調で調整します。

各パラメーターについて

①Input Levels

ブラック、ホワイトポイントを調整してコントラストを上げます。

②Gamma

ミッドレンジ(中間)のバランスを調整します。

③Output Levels

コントラストを下げるために画像をリマップします。



Labs Normal Invertとは

画像上の各チャネルを反転します。
Invert COPに似ていますが、このノードには特定のチャネルのみを反転できるスイッチが付いています。ノーマルマップの緑チャンネルを反転させる場合に便利です。
※Invert COPは、写真のピクセル反転を画像に適用します。

各パラメーターについて

①Invert X

ノーマルマップの赤チャンネルまたはXコンポーネントを反転します。

②Invert Y

ノーマルマップの緑チャンネルまたはYコンポーネントを反転します。これは、Labs Normal Invertノードの最も一般的なオペレーションです。

③Invert Z

ノーマルマップの青チャンネルまたはZコンポーネントを反転します。



Labs Normalize Normalとは

ノーマルマップを単位ベクトルに正規化します。
ノーマルマップはピクセル単位でノーマルのベクトルをRGBで表しています。
マップをメッシュ上に適切に適用するために、ベクトルは長さが1の単位ベクトルでなければなりません。
ノーマルマップに対して、ノーマルの追加やブレンド、Level補正などの操作を実行した場合、
ノーマルベクトルが単位ベクトルでなくなる可能性があります。
HoudiniのCOPノード内のRGBデータは1より大きい数値やマイナスの数値も持つことができますが、RGB8bit画像として保存するときにそれらの数値はクリッピングされてしまいます。
そのため、画像を保存する前にLabs Normalize Normalノードを使用して、ノーマルマップを単位ベクトルにノーマライズ(正規化)する必要があります。

※Labs Normalize Normalノードには、パラメーターが実装されていないため、ここからは4つのLabs Normalノードの機能についてご紹介します。



Labs Normalノードの機能

こちらでは、前回の記事(Labs Normal Color / Normal Combine / Normal From Grayscaleノードについて)で使用したシーンを基にLabs Normalノードについてご紹介します。
バージョンはHoudini18.0.460を使用しています。最初に、Houdiniを起動してSideFX Labsツールが正常に読み込まれていることを確認します。

コンポジットネットワークに移動して、ビューポートをComposite Viewに変更します。
ネットワーク上には、Labs Normal Color、Font、Labs Normal Grayscale、Labs Normal Combineノードを配置しています。
それぞれ解像度は、1024×1024に変更して、Labs Normal Combineノードの第一入力にLabs Normal Color、第二入力にLabs Normal Grayscaleノードを接続します。
詳細については、前回の記事をご参照ください。

●Labs Normal Rotateノード
Labs Normal Combineノードの下にLabs Normal Rotateノードを接続します。このノードには、[Angle]パラメーターのみ存在します。

下画像は、Angleパラメーターを[0°、90°、-90°、180°]に変更した結果です。それぞれ角度に応じてノーマルマップが回転していることが確認できます。

●Labs Normal Levelsノード
次に、Labs Normal Levelsノードを接続します。このノードは、ブラック、ホワイトポイント等を基にコントラストやカラーバランスの調整を行うことが出来ます。

下画像は、Gammaパラメーターを調整した結果です。数値を大きくするとガンマが強くなります。

●Labs Normal Invertノード
次に、Labs Normal Invertノードを接続します。このノードは、ノーマルマップのRGBまたはXYZコンポーネントを反転させます。

下の動画は、InvertXYZを有効/無効に切り替えた結果です。

●Labs Normalize Normalノード
最後に、Labs Normalize Normalノードを接続します。このノードには、パラメーターは実装されていません。Labs Normalize Normal ノードを接続することで、3つのチャンネル(RGB) を単位ベクトルに正規化して、RGBの範囲が有効なノーマルマップを作成します。

下画像は、ここまでのノードツリーをまとめた結果です。

ご紹介したNormalノードについては動画としてまとめています。併せてご覧下さい。

■補足1:Normalマップとは
ノーマルマップとは、簡単に言うと3D空間のノーマルベクトルXYZをRGBの画像にピクセル単位で落としこんだものです。
その際、XYZ=-1~1の範囲にあるものをRGB=0~255(8bit 画像の場合) の範囲に変換します。

※上図ではわかりやすく(-1,0,1)(1,0,1) と表現していますが、 実際は単位ベクトル( -0.7071 , 0 , 0.7071 )( 0.7071 , 0 , 0.7071) になります。


■補足2:単位ベクトルとは
単位ベクトルとは長さが1のベクトルのことです。
簡単な図で示すと、下図の通り半径1の円の中心から円に向かうベクトルになります。
これをRGB8bit に変換すると右のように中心が127半径127の円になります。

※わかりやすくするため、こちらの図ではZは考慮していません。

ノーマルベクトルが単位ベクトルになっていない場合、ノーマルマップに不具合が生じます。

例えば、ノーマルのベクトルの長さが1 以上のままでノーマルマップに変換すると、1 より大きい数値はRGB変換時に256以上の数値がクリップされて255になってしまうので、傾きが変わってしまいます。

ある長さのベクトルを単位ベクトルに変換することを、ノーマライズ(正規化)と呼びます。
ベクトルをノーマライズして単位ベクトル化することで、傾きを保持しつつ長さが1のベクトルを求めることができます。
結果、RGBの範囲を0~255 に収めることができます。

「Labs Normal Rotate」「Labs Normal Levels」「Labs Normal Invert」「Labs Normalize Normal」ノードについては以上です。

これらのノードを使用することで、ノーマルマップの回転やレベル/コントラストの調整、各チャンネルに応じたノーマルマップの反転やノーマルマップの正規化など、Labsツールを使用することで容易に作業を行うことが出来ます。