lunarborの備忘録

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

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

使用ソフト

  • Lightwave2020
  • 3D-COAT2022
  • Blender3.3

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

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

lunarbor.hatenablog.com

Blenderでノーマルベイクする

モデルを読み込む

まずはSDSモデルを読み込み"モデファイアープロパティ""モディファイアー追加"から"サブデビィジョンサーフェス"を選んで適用します。

"サブデビィジョンサーフェス"モディファイアーのオプションでは"カトマルクラーク""ビューポート""レンダー"を共に同じにします。今回はモデリングをした時の分割数に合わして"2"にします。

※この設定に付いてはこちらの記事で詳しく説明しているので必要であれば参照して下さい。

lunarbor.hatenablog.com

"オブジェクト"メニューからシェーディングを"自動スムーズを使用"にします。右側のの"オブジェクトデータプロパティ"タブを開いて"ノーマル"にある"自動スムーズ"の値を"89.5°"にします。*1 この数値以下の角度にスムースがかかります。(※設定した後にフラットシェードやスムーズシェードに変更すると値がリセットされます。再び"自動スムーズを使用"にするときは"自動スムーズ"の値も再設定する必要があります。)マテリアルの"ベースカラー"にはわかりやすい色を指定しておきます。(今回は赤色)

(SDSモデルは非表示にして)次にUV展開済のLowポリモデルも読み込みます。同じように"オブジェクト"メニューでシェーディングを"自動スムーズを使用"にして、"オブジェクトデータプロパティ""ノーマル"にある"自動スムーズ"の値を"89.5°"にします。マテリアルの"ベースカラー"にはわかりやすい色を指定しておきます。(今回は青色)

ベイク用テクスチャを用意する

ノーマルベイクを行う前にベイク結果を出力する先のテクスチャを用意しておく必要があります。"Shading"タブに移って、右上の"アウトライナー"でベイクをされるオブジェクト(今回はLowポリモデル)を選択した状態で、"シェーダーエディター""追加"メニューから"テクスチャ""画像テクスチャ"を選択して"画像テクスチャ"ノードを追加します。"画像テクスチャ"ノードの"新規"を選択して"新規画像"のオプションで"名前"に任意の名前(今回は"normal_bake")を入力。"幅""高"さにテクスチャの大きさ(今回は"2048")を指定します。"アルファ"のチェックは外して"OK"を押します。"画像テクスチャ"ノードに"色空間"という項目が追加されるので"非カラー"に変更します。これでテクスチャの用意は完了です。ベイクを行うときは"Cycles"にする必要があるので"レンダープロパティ"パネルで"レンダーエンジン""Eevee"から"Cycles"に変更しておきます。

ノーマルベイクを行う

"UV Edithing"タブに移ります。"レンダーエンジン""Cycles"の場合、"レンダープロパティ"パネルに"ベイク"という項目があるのでそこで設定を行います。

"ベイクタイプ""ノーマル"を選びます。"影響"のオプションにある"スペース"はデフォルトの"タンジェント"のままにします。その下の"シズル"はノーマルマップの色(Red,Green,Blue)がそれぞれどの座標(X,Y,Z)に対応するかの設定です。(こちらもデフォルトで問題ないですが、もし"3ds MAX"や"UnrealEngine"と連携する場合は変更する必要があるかもしれません*2。)

"選択物→アクティブ"にチェックを入れて折りたたまれている設定を展開します。"アウトライナ"ベイクするオブジェクト(今回はSDSモデル)を選択(黄色でハイライトされます。アクティブの意味です)。そのままCtrlキーを押しながらベイクされるオブジェクト(今回はLowポリモデル)を選択します。すると今まで黄色だったSDSモデル名が青色(選択の意味です)に変わります。代わりにLowポリモデル名が黄色でハイライト(アクティブ)されます。

もう一度を確認してください。"選択物"(青色でハイライトしたオブジェクト)を"アクティブ"(黄色でハイライトしたオブジェクト)にベイクするという意味です。

"押し出し"に任意の数値を入れます。今回は"10cm(0.1m)"としました。この項目にカーソルを持っていくとツールチップ*3で説明が出ます。「ベイク時、アクティブオブジェクトを指定の距離だけ膨らませます」とあります。数値を変えてもビュー上では何も変化がありませんがスキャン範囲を指定する項目のようです。"レイの最大距離"ツールチップの説明で「0で無制限」とあるので、デフォルトの"0"のままで良いと思います。(おそらくベイク対象にしたくないパーツが近くにある場合それにレイを当てないように制限をかけてスキャンから外すための設定だと思われます。)各設定が完了したら"ベイク"をクリックすると処理が始まり、ウィンドウ下部に処理中のインフォメーションが表示されます。何かしら手順が間違っていると赤文字でエラーを出してくれるので修正してもう一度"ベイク"を押してください。ベイクが成功すると"UVエディター"にノーマルマップが表示されます。

"ケージ"オプションの使い方

"ケージを押し出し"を使ってもスキャン範囲の調整は出来ますが、"ケージ"にチェックを入れて"ケージオブジェクト"を使うと3Dビューポートの見た目でスキャン範囲を設定できるのでトライアンドエラーの回数を減らすことが出来ます。

"ケージ"にチェックを入れると"ケージオブジェクト"が指定できるようになります。ケージオブジェクトは「ベイクされるオブジェクト(今回はLowポリモデル)」を複製して作ります。"アウトライナー"Lowポリモデルをコピー&ペーストして複製したオブジェクトに分かりやすい名前をつけます。今回は"tire_Low(lwo2)_cage"というふうに末尾に"_cage"を付けました。

A "アウトライナー"で「ベイクされるオブジェクト(今回はLowポリモデル)」を非表示にします。B "マテリアル"プロパティで"ゲージオブジェクト""ベースカラー"を分かりやすい色に変更します。今回は黄色にしました。C "アウトライナー"で「ベイクするモデル(今回はSDSモデル)」を表示します。すると画像のように3Dビューポートで2つのオブジェクトが重なります。"ゲージオブジェクト"からはみ出ている赤の部分(SDSモデルの一部)がデフォルトのスキャン範囲から外れる部分です。このはみ出る部分がきれいに黄色の中に収まるように"ゲージオブジェクト"を変形させます。D "編集モード"に変更します。E "ツールバー"にある"膨張/収縮"ツールを選択します。(続く)

ハンドルを動かし"ゲージオブジェクト"を変形して「ベイクするオブジェクト(今回はSDSオブジェクト)」が全て包み込まれる状態にします。SDSオブジェクトがはみ出ている部分がきれいに無くなったら"ゲージオブジェクト"は完成です。

D"オブジェクトモード"に変更して"ケージ"オプションの"ケージオブジェクト"に先程作成したオブジェクトを指定します。ベイクするときにこのオブジェクトは表示しておかなくても問題ないので、"アウトライナー"で非表示にしておきます。

(以降"ベイク"へ)

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

"Shading"タブに移ります。"アウトライナー"でSDSモデルを非表示にします。"レンダープロパティ"パネルで"レンダーエンジン""Cycles"から"Eevee"に戻します。("Cycles"のままでも構いません。)"シェーダーエディター"の"追加"メニューから"ベクトル""ノーマルマップ"を選択して"ノーマルマップ"ノードを追加します。"画像テクスチャ"ノードの"カラー出力""ノーマルマップ"ノードの"カラー入力"に繋ぎ"ノーマル出力""プリンシプルBSDF"ノードの"ノーマル入力"につなぎます。"3Dビューポート""レンダープレビュー"にしてLowポリモデルにノーマルマップの形状が表示されているのを確認します。問題なければ"UVエディター"の画像メニュー"保存"でノーマルマップテクスチャを任意の場所に保存してベイク作業は完了です。

レンダリング結果

■まとめ

今回はBlenderを使ってノーマルベイクを行う方法を解説しました。事前にテクスチャを用意する必要があるあたりが少し手間ですが、手順を一度覚えてしまえば次からはスムーズに作業が行えると思います。BlenderモデリングからUV展開、ベイク、レンダリングまでシームレスに多彩な機能を行き来できるので作業効率はとても良いです。それに加えてコンポジットノードを使ってポストプロセス処理を絡ませた画作りまで行えるので、これ一つあれば作品完成まで一通りできてしまいますね。

■総括

3回に渡り3つのソフトで同じ作例を紹介しました。同じ作例を行うことでそれぞれのソフトにあるオプションが何をやる為のものか理解の補完ができたと思います。これによりCG技術全般へと理解の範囲が広がるため、解説が少ないソフトでも習得の糸口を見つけることができるようになるので、時にはこのような事をやってみるのも良いかと思います。

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

*2:こちらの過去記事を参考にしてください。

lunarbor.hatenablog.com

*3: