lunarborの備忘録

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

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

使用ソフト

  • Lightwave2020
  • 3D-COAT2022
  • Blender3.3

サブディビジョンサーフェス(以下SDS)モデリングはハイポリメッシュを使ったモノよりは形状をコントロールしやすくデータ量も節約できるのですが、細かいディテールまで作り込むとその部分はポリゴン数が増えてハイポリメッシュに近づいてしまい、SDSモデルの利点が失われてしまいます。そのような場合に"SDSモデル"から"Lowポリモデル"にノーマルマップをベイクすればモデリングしたディテールを活かしつつデータ量を節約する事ができます。

今回から3回に渡ってその方法を3つのソフト(3D-COAT/Lightwave3D/Blender)で同じ作例を使い紹介します。同じ作例を3つのソフトで行うことで互いのソフトで不明な部分の補完と、より深いCG技術の知見が得られるのでは無いかと言う趣旨です。

 

作例ではこのように、タイヤのドレットの形状をLowポリモデルにベイクします。

 

■SDSモデルとローポリモデルを用意する

Lightwave等、ポリゴンモデラーでディテールを作り込んだSDSモデルと形状をベイクするLowポリモデルを用意します。

SDSモデル 52824ポリゴン

lowポリモデル  2160ポリゴン

lowポリモデルは事前にUV展開をしておきます。

SDSモデルは事前にSDSの状態で"ポリゴン化"(Freeze)したモノも用意しておきます。lwo(lwo2)でエクスポートします。

■3D-COATでノーマルベイクする

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

lowポリモデルを読み込む

UV展開済みのlowポリモデルlwo(lwo2)を"ピクセルペイント用のモデル"としてインポートします。インポート設定では以下のようにします。

"初期の細分化(ポリゴン数)""細分化しない"

"UVマッピングタイプ" を"UVを保持"

"UVセットをスムージング""スムージング無し"

"バウンドボックスをセンタリングしない"にチェックを入れないと、インポートしたモデルはセンタリングされます。

"自動スムージンググループ"にチェックを入れて"最大角度""89.5"にします。これにより"90°"以上の折り目にはスムースが掛からなくなります。*1

"UVセットの名前"は必要があれば変更してください。

"テクスチャの幅""テクスチャの高さ"をそれぞれ設定します。(今回は2048x2048にしました。)

またLowポリモデルにもSDSをかける想定の場合は以下のように"初期の細分化""UVセットをスムージング"を設定して、"自動スムージンググループ"offでインポートします。

この設定についてはこちらの記事のが詳しいので参考にしてください。

lunarbor.hatenablog.com

シーンスケールを変更する

"ボクセル(sculpt)"ルームに移動してシーンスケールを変更します。

※モデルは移動させてないのでボクセルルームは空です。

設定場所はの"ジオメトリー(Geometry)"メニューの"シーンスケールを編集(Edit Scene Scale)""SceneScale"です。ペイントルームにモデルを読み込んだ状態でこの設定を開くと、3D-COATがモデルに対して自動で設定した数値が入力されています。この数値を"1000"に変えます。

この設定の詳細については別記事を書きましたのでそちらを参照してください。

ポリゴン化(Freeze)したSDSモデルを読み込む

"ボクセル(sculpt)"ルームで"ファイル"メニューの"インポート"から"ボクセル化用メッシュをインポート"を選び"ポリゴン化"(Freeze)したSDSモデルをインポートします。

インポート時のツールオプションでは"ボクセル化せず追加"にチェックを入れます。

インポートできました。

今回のモデルはボクセルに変換するとディテールが失われるので"サーフェイスモード"のままノーマルベイクを行います。(※サーフェイスモードのまま"ジオメトリ"メニューにある"解像度を上げる"でオブジェクトの解像度を上げてやるとボクセルに変換した時の粗さが軽減されるようです。やるときはワイヤーフレーム表示にしないと変化が分かりづらいです。)

SDSモデルのまま読み込む方法

SDSモデルを事前に"ポリゴン化"(Freeze)せずともインポート時の設定で"細分化"をクリックすればメッシュを細分化できます。キャットマルクラークの細分化レベル1なら1クリック。レベル2なら2クリックという風に押すたびに細分化レベルが上がります(今回の場合2回)。細分化レベルを同じにすれば事前に"ポリゴン化"(Freeze)したものとポリゴン数は同じになりますが、ワイヤーフレーム表示にすると三角分割の向きが違うようです。ワイヤーフレーム非表示の時の見た目には違いが見受けられませんでした。

※細分化レベルの詳細はこちらの記事を参照してください。

lunarbor.hatenablog.com

スカルプトメッシュをノーマルマップにベイクする

※"リトポ"ルームに移った直後オブジェクトの表示がおかしい場合*2

"リトポ"ルームに移ります。次の工程のスキャン範囲の指定で邪魔になるので一時的に①"レイヤー"パネルでペイントメッシュ(Lowポリメッシュ)を非表示にしておきます。"チェッカースタイル""シンプルチェッカー"にすると視認性が良いです。"ベイク"メニューから"ペイントメッシュにボクセルをベイクする"を選びます。(続く)

するとベイク用メニューが出るので"オブジェクト内側のスキャン深度""オブジェクト外側のスキャン深度"を設定します。"スナップ方法"は大抵の場合は"法線に沿って近い位置へスナップ"を選べば問題ないようです。

以下の説明はオプションにある"使い方"を選択すると表示されるオンライン上のPDFドキュメントをGoogle翻訳で日本語に翻訳したものの抜粋です。(画像1枚にまとめるために少し編集してあります。)文中の図に"A""B""C""D"の形状が示されています。そのうち"D"に対応するのが"オブジェクト内側のスキャン深度"で、"A""B"に対応するのが"オブジェクト外側のスキャン深度"です。そして"C"のような形状を上手くスキャンするために"スキャン深度ツール"を使用するとあります。

引用元:Happy baking guide.

https://3dcoat.com/files/Happy_baking_guide2.pdf

 

外側のスキャン深度を調整するときは"外側のスキャン深度をプレビュー"を選択してから"オブジェクト外側のスキャン深度"の値を調整します。

内側のスキャン深度を調整するときは"内側のスキャン深度をプレビュー"を選択して、から"オブジェクト内側のスキャン深度"の値を調整します。内側のスキャン深度を表すオブジェクトはスキャン対象のオブジェクトの内部にあるため見えないのですが、"トグルのゴースト化"を選択するとオブジェクトが半透明になって視認できるようになります。

それでは設定していきます。大抵の場合は"ペイントメッシュにボクセルをベイクする"のオプションが表示された時点で3D-COATが最適なスキャン範囲を設定してくれていますが、設定方法を理解するためにあえて"オブジェクト内側のスキャン深度"の値を"20""オブジェクト外側のスキャン深度"の値を"0"にして始めます。

"オブジェクト外側のスキャン深度"の値"0"にすると「チェッカー模様がついたオブジェクト(ペイントルームにあるLowポリモデルをリトポメッシュに変換したモノ)」と、「ボクセルルームからインポートされたスカルプトメッシュオブジェクト(元SDSモデル)」が重なった状態で表示され、SDSモデルLowポリモデルよりはみ出ている部分が明確になります。このはみ出ている部分はベイクのスキャン範囲から外れることになるので、チェッカー模様のオブジェクトを膨張・収縮させてスカルプトメッシュオブジェクトをきれいに包み込むようにします。これは"オブジェクト外側のスキャン深度"の値の変化をビジュアルで視認できるようにしたものです。

※↓わかりやすくするためにスカルプトメッシュの色を赤に変えてあります

"オブジェクト内側のスキャン深度"の値を"20"にしたのは"0"にすると外側のプレビューと重なって区別が付きづらいためです。こちらはスカルプトメッシュオブジェクトの内側にチェッカー模様のオブジェクトが完全に収まるように調整します。今回の場合はタイヤトレッドの凹凸の凹の底の部分からはみ出ないようにします。はみ出てるかどうかを確認するときは"トグルのゴースト化"offにするとわかりやすくなります。

設定が完了したら"OK"を押すとベイク処理が行われます。処理が終了すると自動でペイントルームに移ります。

スキャン深度変更ツールの使い方

今回の作例では"スキャン深度変更ツール"を使う必要が無いため、このツールの使いかたについて考察記事を別に書きました。興味がある方は御覧ください。しかし明確な使い所についてはまだ理解しきれていません。

lunarbor.hatenablog.com

ペイントルームでベイク結果の確認

"ペイント"ルームに移った直後はスカルプトメッシュが表示されているので"ボクセルツリー"パネルで非表示にします。"レイヤー"パネルで"Layer0"が非表示になっているようなら表示します。"テクスチャエディッタ"パネルで"法線"表示にするとベイクしたノーマルマップが確認できます。

ベイク結果が問題なければ"ファイル"メニューの"モデルのエクスポート(obj,lwo)"からテクスチャのみをエクスポートします。

設定では、"ジオメトリのエクスポート"のチェックを外して"テクスチャのエクスポート"にチェックを入れれば、テクスチャのみエクスポートできます。今回必要なテクスチャは"タンジェント空間の法線マップ"のみです。

また"テクスチャ"メニューから"エクスポート"を選び"法線マップ(タンジェント空間、低解像度メッシュ)"を選択するとノーマルマップテクスチャのみ単品で出力することが出来ます。ただし選択できる画像フォーマットは"TGA""PNG""DDS"の3つのみです。

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

3D-COATからエクスポートしたノーマルマップテクスチャをLightwave3DやBlenderでLowポリモデルに適用して確認します。

今回はLightwave3Dを使用します。Lowポリモデル"NormalMap"ノードからノーマルマップテクスチャを適用してレンダリングを確認します。問題なければ完成です。

■まとめ

今回は作例用のモデルの用意から、3D-COATでのノーマルベイクの方法を紹介しました。スキャン深度の設定やスキャン方法などオプションが幾つも用意されていて、より複雑な形状のベイクにも対応できそうです。他のソフトでは難しかった高度なベイクも3D-COATなら可能かもしれません。

次回はLightwave3Dを使ったノーマルベイクの方法を紹介します。

lunarbor.hatenablog.com

■関連記事

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

*2:

"リトポ"ルームに移った直後に下の画像のようにペイントメッシュスカルプとメッシュのサイズが違う状態で表示されることがあります。これはシーンスケールを変更した影響です。ビューを拡大縮小したり動かしたりして待っているとペイントメッシュのスケールが再計算されてスカルプとメッシュと合うようになります。