📌

MayaのNormalmapの設定について色々と調べてみた

2024/09/18に公開

MayaのNormalmapの設定について色々と調べてみた

こんにちは、かっこいいユーザーネームが思いつきません。
Tajimaです。

先日のことですが、作成したモデルにNormalマップをアサインする際に少々困った問題に直面しました。問題自体は容易に解決できましたが、いまいち理屈がわかりませんでした。いい機会だと考え、そこでNormalmapについて、色々と調べてみました。その調査結果を今回記事にいたします。
私自身まだまだ勉強不足で恐縮ですがよろしくお願いいたします。

【問題概要】

欲しい見た目 間違った見た目

上右画像のように影が濃く出てしまったり、Normalマップ自体はZbrushのスカルプトを用いて作成したのですが、zbrush上での見た目と大きく乖離がありました。右画像では葉脈の真ん中部分が凹んで見えてしまっています。

解決方法

早速ですがどのように解決したのかを解説します。

  1. メッシュにアサインされているマテリアル(M_leaf)のBump Mappingの欄の右端にあるマークをクリックします。
  2. Colore Spaceの欄を"sRGB"から"Raw"に変更してから右上にあるマークの下をクリックします。
  3. 最後にUse As欄を"Bump"から"Tangent Space Normals"に変更します。

そもそもNormalマップとは

現在ゲーム3DCG制作においてキャラクター、背景ともにNormalマップは非常によく使用されます。
そんなNormalマップですが、一体どんな事を可能にしてくれるものなのでしょうか?
簡単に言うと平面のオブジェクトにあたかも凹凸があるようにみせることを可能にしてくれます。
Normalマップを使用せずに凹凸を表現しようと思うと頂点数を増やすしかありません。例えば、人間の毛穴一つを表現するのにポリゴンを割いていたらとんでもなく膨大な頂点数になってしまいます。
とてもゲームのアセットとして成立するものではありません。

Normalマップ適用前 Normalマップ適用後

このように全くの平面から一ポリゴンも増やさずにこれだけのディティールを増やすことが出来ます。
注意点としては『凹凸があるように見せている』だけですのでシルエットに変化はありません。
シルエットに凹凸を出したい場合はポリゴンを割いてあげる必要があるということです。
葉脈の凸凹は表現できていません

どういう仕組みなのか

Normalマップの"Normal"とは訳すと"法線"のことです。
法線は面や頂点一つ一つが持っているベクトル情報なのですが、光の計算に頻繁に使用されます。
名前の通りNormalマップではその"法線"を2D画像でもって操作することで、光の反射、影の出方を操作します。ハードエッジ           スムーズエッジ
上画像の六角柱は二つとも大きさ、形が全く一緒なのですが、見え方が異なっています。ハードエッジとスムーズエッジの違いなのですが、これも法線の違いによってもたらされています。

ハードエッジの法線方向 スムーズエッジの法線方向

上の画像は角柱を上から見た時のハードエッジとスムーズエッジによる法線の違いです。画像左上の方角にカメラ(視点)があると想定してください。ベクトルがカメラ方向を向いていればいるほど明るく、その逆であれば暗くなります。ハードエッジの場合はそれぞれの面が全て同じ方向を向いています。各面、光の反射方向がはっきり異なります。違う面になった瞬間に異なる方向に光を反射します。スムーズエッジの場合は法線が左から右にかけて段々と逆方向を向いていくような変化をしています。面の移り変わりに左右されずに光の反射方向がグラデーション変化します。よって上記画像のような見え方の違いが生まれるという訳です。

Normalマップ適用時の法線方向
Normalマップの仕組みもハードエッジ、スムーズエッジと同様です。Normalマップでは法線方向をRGBの数値を用いて操作しています。赤であればX方向、緑であればY方向、青であればZ方向に色の数値分、法線の向きを変えます。『テクスチャのRGB値を取得する→法線の向きを変える』という処理をピクセル回数分行っています。そうすることで疑似的に光の反射、影の出方をコントロールし、凹凸があるように見せています。以上が大まかなNormalマップの仕組みです。

tangent space normal(接空間法線)について

tangent space normal(接空間法線)の軸

Mayaで法線を直接触って操作しようとした時、私たちは各頂点につき一つの軸の法線しかいじれません。
画像赤枠の法線は緑一本で"xyz"の情報を持っています。ですが"tangent space normal(接空間法線)"のチャンネルにすることでxyz成分を分けてそれぞれの軸にテクスチャの色の数値分情報を伝えることができます。それによってz方向に少し飛び出ていて、x方向にも少し飛び出ているという表現が可能になります。例えばテクスチャの色が(0.5,0,0.5)だったとします。"tangent space normal(接空間法線)"であればx方向に0.5飛び出しつつ、z方向にも0.5飛び出す表現になります。Normalテクスチャが青紫色なのは、光が内向きに反射することがないから、且つ面に対して飛び出す表現をする以上基本的にz軸の方向に飛び出すことになるためと考えられます。

tangent space normal(接空間法線)以外のチャンネルについて

Bump

Bumpは基本的にHightマップを適用する時に使用するチャンネルです。Hightは高低のみを表現するものですので一方向だけに飛び出て見えます。よって一般的にHightマップは白黒の二色で構成された画像データを用います。ですが実験的に白黒以外の色を使用したテクスチャを使用してみた所、他の色でも一様の結果を得られました。
今回は実験のために赤、青、緑の四角形を描いたテクスチャ(全て明度は最高)を使用しました。また赤の明度のみを変えた画像とそれを適用したプレーンの画像も用意しました。

彩度の違いで比較したもの
適用したテクスチャ 適用されたプレーン
明度の違いで比較したもの
明暗比較テクスチャ 明暗比較テクスチャ

このチャンネルでは、色の明度を高さ(出っ張り)の強弱として計算していると考えられます。ですので彩度は何でも見た目上に変化はないという結果が得られました。白黒を推奨される理由として考えられるのは彩度の情報が不要であるため、またHightマップを作成する側も明度の違いは白黒が一番わかりやすいと考えているからではないかと予想します。

Object Space Normals(オブジェクト空間法線)

"tangent space normal(接空間法線)"は描画されるピクセルで一つ一つの法線の向き(3軸分)をテクスチャを用いてコントロールしてあげるものでした。ですが"Object Space Normals(オブジェクト空間法線)"を使用すると一軸の制御になります。色数値が(0.5,0,0.5)であればx軸とz軸を足して二で割った中間方向を法線が向きます。『前に少し光が反射し、且つ右にも少し光が反射する』のと『前と右の中間である斜めに光が反射する』のは違います。そもそも"tangent space normal(接空間法線)"では面に対して垂直の軸がzであったのに対し"Object Space Normals(オブジェクト空間法線)"は軸がテクスチャを適用するメッシュ基準になるため根本的に違います。

適用したNormalテクスチャ
上から見た画像

横から見た画像

適用したNormalマップと下二つの画像を見比べてみてください。メッシュのローカル軸はワールド軸と一致しています。上から見た時に光が強く反射している部分はテクスチャでは緑成分が多く、横から見た時には赤の成分が多い部分が明るくなっているのが確認できると思います。つまりテクスチャの色が赤に近ければX軸方向に飛び出て見えます。緑に近ければY軸方向に飛び出て見えます。青に近ければZ軸に飛び出て見えます。
法線の色を出力した球体
上の画像は法線の色をそのまま出力した球体です。生成してから何もいじっくていないものです。"Object Space Normals(オブジェクト空間法線)"のテクスチャはこのような色をしています。"Object Space Normals(オブジェクト空間法線)"のテクスチャでは法線の色をより細かく指定してあげる必要があるため、紫色ではなくカラフルなのではないかと考えます。使用用途については動かないものに使用されている例があるようです。逆に動くオブジェクトには使用できません。なぜなら光の当たり方に変化はないのにルート骨を動かした瞬間に今まで明るかった所が、黒くなったりするからです。ですが、色々と面白い使い方をされているゲームの例が見られました。ですから頭ごなしに否定してしまうのも惜しいと考えています。時間を割いて研究してみるのも面白いかもしれません。

最後に

以上が、問題を通じてNormalマップについて色々と調べた結果です。私自身作ったモデルにNormalマップを使用することは多々あれど仕組みなどについてはさっぱりでした。ですので今回の調査で得られるものは多かったです。特に"Object Space Normals"で使用するNormalマップに関しては、私自身かなり興味を引くものでした。今回の問題を解決する際にカラースペースの設定についても触れましたがカラースペースの話をするとそれだけで一つの記事なりそうでした。そのため今回は割愛させていただきました。何か間違っている箇所が御座いましたらご指摘をお願いいたします。引き続きNormalマップについては研究を進めていきます!どうかよろしくお願いいたします!

COYOTE TAチーム

Discussion