lunarborの備忘録

CGソフトの使い方を記録しておけば自分とどこかの誰かに役立つだろう

サブディビジョンサーフェスを使った高解像度モデルをローポリモデルにノーマルベイクする話 その2(Lightwave3D編)

使用ソフト

  • Lightwave2020
  • 3D-COAT2022
  • Blender3.3

この章ではLigtwave3D 2020でノーマルベイクを行う方法を解説します。

この記事はこちらの続きです

lunarbor.hatenablog.com

■Lightwave3Dでノーマルベイクする

モデルの読み込みと下準備

"レイアウト"SDSモデルとUV展開済みのLowポリモデルを読み込みます。

SDSモデルは事前にモデラーでSDSをONにして保存しておきます。(今回は"キャットマルクラーク"を使用)。"オブジェクトプロパティ"パネルを開いて"プリミティブ"タブの"ジオメトリ"タブにデフォルトで追加されている"サブディビジョン"をダブルクリックしてオプションを開きます。"表示サブパッチレベル""レンダーサブパッチ"の数値を共にモデラー"一般オプション"で設定している数値と合わせます。今回は"キャットマルクラーク"を使用しており値は"2"にします。

"色・質感編集"パネルを開いてLowポリモデルSDSモデル共に"マテリアル"の下部にある"スムージング"のチェックを入れます。"スムースしきい値""89.5°"にします。*1 この数値以下の角度にスムースがかかります。

これで事前の準備は完了です。次に「ビューに表示されるのはLowポリモデルだがレンダリングするのはSDSモデル」という状態にします。

具体的には"シーン編集"パネルを開いてLowポリモデル"アクティブ"チェックを外す。(レンダリング対象から外れます。)SDSモデル"表示状態""隠す"にします。

ベイク用のカメラを設定する

カメラを選択して"カメラプロパティ"パネルを開き、カメラの種類を"サーフェイスベイキングカメラ"に変更します。

"幅""高さ"に同じ値を入れて出力するテクスチャのサイズを設定します。(今回は"2048")"メッシュ"でベイクされるオブジェクトを指定します。(今回はローポリモデル)"UVマップ"は設定してあるUVマップの名前を指定します。ビューの設定で"選択カメラ""VPR""Camera_Tangent_space_XYZ"を選びます。するとビューにノーマルマップがプレビューされるようになります。"サーフェイスからのオフセット"の数値を変更するとスキャンされる深度が変わるのでプレビューされたノーマルマップを見ながら調整します。モデルに"スムージング"をかけている時は"スムースノーマル"を選びます。

"UVボーダー"に数値を入れるとUVの境界を超えて"のりしろ"がレンダリングされます。UVの境界ちょうどでテクスチャが描画されているとモデルにUV投影したときにUVの継ぎ目が出ることがありますが、それを防ぐための設定です。

レンダリング設定

ノーマルマップをレンダリングできるようにするために"レンダープロパティ"パネルを開いて"バッファ"タブで"Camera_Tangent_space_XYZ"にチェックを入れます。

"F9"を押してレンダリングします。レンダリングが終了すると"ファイナルレンダー"の結果が表示されているので"イメージビュワー"の右上にある"バッファ"の項目から"Camera_Tangent_space_XYZ"を選ぶとノーマルマップが確認できます。

問題がなければ"イメージビュワー""ファイル"メニューから"RGBAを保存"を選んで出力フォーマット(tgaなど)を選択して任意の場所にノーマルマップテクスチャを保存して完了です。

Lowポリモデルにノーマルマップを適用する

"画像編集"パネルを開いて保存したノーマルマップテクスチャを読み込みます。"RGBカラースペース"は必ず"Linear"にします。

⑦"シーン編集パネル"SDSモデルを非アクティブ、Lowポリモデルをアクティブにします。⑧"色・質感編集"パネルから"ノードエディター"を開き"NormalMap"ノードを追加してノーマルマップテクスチャを読み込み適用します。"Normal"出力を"Surface"ノードの"Normal"入力につなぎます。⑨"パース"ビューを"VPR"にして出力結果を確認します。問題なければ完成です。

レンダリング結果

"サーフェイスからのオフセット"の代わりにケージオブジェクトを使う

3D-COATの"スキャン深度をプレビュー"Blender"ケージオブジェクト"のようにスキャン範囲をビジュアルで表示するための専用の機能はLightwave3Dありません。しかし「ベイクされるオブジェクト(今回はLowポリモデル)」を複製してモデラーで膨張・収縮変形させたものを使えば同様の事が可能です。

モデラーでのケージオブジェクトの作り方

モデラーでLowポリモデルとSDSモデルを読み込みそれぞれ別レイヤーに配置して"Low""SDS"というふうに名前を付けておきます。それぞれ新規でサーフェイスを割り当てて区別が付きやすいように色を指定します。(今回はLowのサーフェイス名を"cage"、色は黄色。SDSのサーフェイス名を”hi"、色は赤色としました)

このオブジェクトをケージオブジェクトとして別名で保存しておきます。(今回は"tire_low_cage"としました。)

2つのレイヤーをアクティブにした状態にすると、オブジェクトが重なりLowポリモデルからSDSモデルがはみ出ている部分が明確になります(赤い部分)。ここがベイク時にスキャンから外れるば場所なので、黄色で赤色を綺麗に包み込むようにLowオブジェクトを膨張収縮変形させます。

2つのレイヤーをアクティブにした状態で"選択"メニューから"サーフェイス選択"ツールを呼び出してサーフェイス"cage"に割り当てているポリゴンを全て選択状態にします。(Lowオブジェクトを全選択の意味)

"変形"タブの"移動"メニューにある"ノーマル移動"ツール*2でlowオブジェクトを膨張変形させて赤色を全部包み込みます。できたらSDSオブジェクトは不要なので削除してオブジェクト("tire_low_cage")を上書き保存してケージオブジェクトの作成は完了です。

レイアウトでのベイク設定の仕方

レイアウトで先ほど作成したゲージオブジェクト("tire_low_cage")を読み込んで"色・質感編集"パネルで"スムージング"にチェックを入れて、しきい値"89.5°"にしておきます。"サーフェイスベイキングカメラ"の設定で"メッシュ"にケージオブジェクト("tire_low_cage")を選択します。今回は"サーフェイスからのオフセット"の代わりにケージオブジェクトを使うので値は"0"を入力します。他の手順はLowポリモデルにベイクするときと同じです。ベイクを行い、出力したノーマルマップテクスチャをLowポリモデルに適用します。Lowポリモデルとケージオブジェクトは頂点数とUVマップが同じなので、変形させたケージオブジェクトを使ってもベイク結果はLowポリモデルに適合します。

■余談1、オブジェクトのエッジラインもベイクできる

"サーフェイスべーィングカメラ"では"レンダーバッファ"で選択できる項目はベイクできるようです。その中でもエッジラインは使い所が多そうなので紹介します。ノーマルマップで出した凹凸にはオブジェクトのプロパティで設定するエッジラインを出すことはできません。そこでエッジラインをベイクしたカラーマップテクスチャを別に用意すればノーマルマップに置き換えた凹凸にもラインを乗せることが出来ます。

ベイクするオブジェクト(今回はSDSモデル)のオブジェクトプロパティを開き"プリミティブ"タブにある"輪郭"でエッジラインを出す項目にチェックを入れます。ベイクできるものとできないものがあります。確認しましたが"シルエットエッジ"以外はベイクできるようです。ノーマルマップと組み合わせて使うなら"鋭角の折り目"にチェックを入れると良いです。ラインの出方は"色、質感編集"パネルの"スムースしきい値"で調節できます。レンダーバッファで"Edges"にチェックを入れてノーマルマップの時と同じ手順でレンダリングすればエッジラインをベイクしたカラーマップテクスチャが生成出来ます。

※エッジラインの色を黒に設定しているとVPRの背景の色に溶け込んでビューポートで確認できません。一時的に白などに変更して確認してください。"イメージビュワー"でも同様ですが、こちらは右上のRGBAのアイコンからAを選んでアルファチャンネル表示にすると確認できます。

レンダリング結果。これにlowポリモデルの"シルエットエッジ"を組み合わせるとディティール全てにエッジラインが付きます。

■余談2、AOもベイクできる

"カスタムバッファ"で任意の名前の項目を追加して、ベイクするオブジェクトのマテリアルノードで"オクルージョン"ノードを追加すればアンビエントオクルージョンもベイク出来ます。AOの出し方はこちらの過去記事を参考にしてください。

lunarbor.hatenablog.com

■まとめ

今回はLightwave3Dでノーマルベイクする方法を紹介しました。Lightwaveではベイク機能がカメラとして実装されていることで、レンダリングに関するオプションが全て使えるというシンプルだけどかなり実用的な仕様になっています。ノーマルベイクに限らず用途の幅は広がりそうです。

次回はBlenderでノーマルベイクをする方法を紹介します。

■参考

サーフェイスベイキングカメラ 公式チュートリアル(英語)

docs.lightwave3d.com

ノーマルベイクの公式チュートリアル動画

www.youtube.com

*1:この数値は2つの隣接面が成す折り目の外角です。

*2:

モデラーで膨張・収縮変形させられるツールは"ノーマル移動""トランス(右ドラッグ)""スムース押し出し"です。このうち"スムース押し出し"は角に面取りをかけて頂点が増えてしまうので今回の用途には適していません。"ノーマル移動"は頂点の法線方向に移動させます。"トランス(右ドラッグ)"はポリゴンの法線方向に移動させます。曲面形状でこの2つは処理結果が多少異なります。ベイクの際、形状を検出するレイの方向に変形が沿う方が良いと思うので"ノーマル移動"を使うのが無難かなと思います。