lunarborの備忘録

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

Lightwaveでモデリングした形状に3D-COATで作った高解像度メッシュをノーマルマップとしてベイクしたいという話(後編)

使用ソフト

  • Lightwave2020
  • 3D-COAT2022

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

lunarbor.hatenablog.com

前編では3D-COATのスカルプト機能を使い画像から高解像度メッシュを生成する方法を解説しました。後編ではそのメッシュを使ってノーマルベイクを行い、ペイントしてテクスチャをLightwave3Dに読み込み、完成させるまでを解説します。

 

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

"リトポルーム"に移ります。

"ベイク"メニューから"ペイントルームのメッシュにポクセルをベイクする"を選びます。

すると設定パネルが開きオブジェクトの周りには半透明で拡大されたもうひとつのオブジェクトが表れます。これはスキャン範囲を表したモノです。設定パネルの"オブジェクト外側のスキャン深度"の数値を動かすとスキャン範囲の大きさが変わるので、オブジェクトが全て綺麗いに収まるギリギリの大きさになるように設定します。

ベイクする文字の凹凸が綺麗に収まるように設定の数値を調節します。

"OK"を押すとベイク処理が行われます。終了すると自動でペイントルームに移るのでベイクが問題ないか確認します。

ルームを移った直後はペイントメッシュに重なってスカルプトメッシュも表示されているので"ポクセルツリー"を開いてスカルプトメッシュを非表示にします。

問題ないようです。"テクスチャエディタ"(右上)を"法線"表示にするとノーマルマップに文字の凹凸がベイクされているのが確認できます。

■文字をペイントする

次はペイント作業です。ナンバープレートの文字には色が塗られているためそれを再現したカラーマップテクスチャを作成します。文字の色はLightwaveで設定するのでここではマスクとして使用できるように赤(255,0,0)で塗ります。

※ペイントのオプションで"光沢度""深度"を無効にしておきます。

方法①Cavity mapで塗る

ノーマルマップの凸の部分だけに塗る方法ですが、手軽なのはペイントのオプションの"凸面で増加"もしくは"凹面で減少"を使う方法です。

(今回この方法は採用していません。まだ設定の仕方の詰めが甘いのかうまくいかなかったためです。しかし機能としては大変有用だと思うので紹介しています。不要な方は"方法②ステンシルマスクで塗る"まで読み飛ばしてください)

この機能を使うには下準備が必要です。"編集"メニューから"曲率を計算"を選びます。設定はデフォルトのままでOKです。

すると、計算処理後に"レイヤー""CavityMap"というレイヤーが追加されます。(デフォルトで非表示です。)

これで下準備が完了です。ペイントのオプションから"凸面で増加"を選んで塗ると文字の凸の部分だけに色がつくと思います。

塗る前にレイヤーを2枚追加してひとつは"塗りつぶし"ツールでモデル全体を白で塗りつぶし、もうひとつで文字を塗っています。エッジの部分を"凸面で増加"を使って塗り中の方は通常ペイントで塗っています。

ペイントの具合は"凸面で増加"の横にある3つのパラメーター"Cavity""Additional modulator""Contrast"で調節できます。"スマートマテリアルプレビュー"を使えばペイントしなくてもで結果が見られるので、見ながらパラメーターを調節できます。

しかし今回はこの方法だと、上手く塗れませんでした。曲線部分でペイントのエッジが荒く、場所によっては塗ってほしくない場所までペイントがはみ出てしまっています。

方法②ステンシルマスクで塗る

そこでシンプルに"ステンシルマスク"を使う方法を紹介します。簡単に言うと画像を元にマスクを作って塗るというやり方です。

まずはビューカメラをペイントしたい面(今回はナンバープレートの文字がある面)に対して垂直になるようにに調整するため、ビューの右上にあるカメラのアイコンから"面の法線に沿って見る[NUN*]"を使います。このコマンドはカーソルの位置を基準にするのでカメラに対して直交させたい面(今回は文字がある面の中心)にカーソルを持っていき、テンキーの"*"を押します。するとビューのモデルはペイントしたい面が綺麗にカメラに向いた状態になります。

さらにビューのオプションを"平行投影"にしてパースによる歪みを完全に無くします。

上手く調整できたら、ビュー右上のカメラのアイコンから、"カメラを保存"を選んで任意の場所に拡張子".camera"ファイルを保存します。これでこの後の作業で誤ってビューを動かしても"カメラを読み込む"からこのファイルを読み込めば保存したときと同じ状態のビューカメラに戻れます。

次にステンシルマスク用の画像を登録します。ソフトのUIの右上にチェッカーのアイコンがあるのでカーソルを重ねるとステンシルマスクで使える形状が選べます。"+"のアイコンを選択してポクセルルームのロゴツールで使った画像を読み込みます。

新たに先程選んだ画像のアイコンが追加されるので選びます。すると指定した画像がビューに重ねて表示されるので"プレビューの設定"を使ってうまくナンバープレートの文字に重なるように配置します。

ステンシルマスクが白いのでわかりやすい色の付いたレイヤーを用意すると微調整がしやすくなります。

上手く配置されたら"プレビューの設定"にある錠のアイコンを押して錠がロックした絵にします。これをしておかないと、ビューのズームを使ったときにステンシルマスクが追従しないので、いちいち合わせ直さないといけなくなります。

"プレビューの設定"の説明

アイコンにカーソルを乗せれば説明は出るので簡単に作業の流れに沿って良く使うところだけ説明します。

表示されるマスクをタイル状に並べるかの選択です。今回のようにデカールのようなモノなら最初にOFFにします。模様のようなモノを使う時はONにすると良いでしょう。

マスク表示のON/OFF 表示非表示を切り替えて位置を確認します。

マスクの不透明度。マスクの表示を薄くして大体の位置を合わせたら表示を濃くして細かく位置を調整すると良いでしょう。

左から"回転""移動""スケール" これを使ってマスクを調整します。

リセット。位置合わせに失敗したらこれでリセットしてやり直します。

ロック。うまく位置が合わせられたら忘れずにロックしておきます。

ストレッチ。マスクを縦横別の拡大率で変形できます。スケールとアイコンが似てるのでよく間違って使ってしまってアンドゥができないのでリセットする羽目になります。

うまくマスク全体を綺麗に合わせられるようなら"塗りつぶし(Fill)"ツールを使って1度にペイントを終わらせる事ができます。

"塗りつぶし(Fill)"ツールの注意点

"塗りつぶし(Fill)"ツールを使うときは"ブラシの効果"のオプション"で"長方形""輪郭線""自由輪郭線"など対象を囲んで塗るタイプのものを使います。その際"裏面を無視"にチェックを入れておきます。このチェックを入れておかないとのようにペイントが裏側まで貫通してしまいます。また"ツールオプション""レイヤー""サーフェイス""オブジェクト"を使えばその項目全体を塗りつぶす事ができるのですが、"裏面を無視"のON/OFFに関係なくペイントは裏側に貫通してしまいます。

ステンシルマスクには対象に合わせる方法に数値入力がなく、微妙なマウス操作のみで行わないと行けないため一度で文字全てにマスクを綺麗に合わせることが難しい事があります。そういう場合は一文字ずつマスクの位置調整とペイントを行う方法をとります。この辺がステンシルマスクを使う利点と欠点です。

すべての文字が塗れたら"X"のアイコンを選択してステンシルマスクを終了します。

テクスチャをエクスポートする

"ファイル"メニューの"モデルのエクスポート(obj,lwo)"からテクスチャのみをエクスポートします。設定はこんな感じ。

"ジオメトリのエクスポート"のチェックを外して"テクスチャのエクスポート"にチェックを入れれば、テクスチャのみエクスポートできます。

今回ルックはLightwaveで構築するので3D-COATでペイントしたカラーはマスクとして使用します。そのため必要なテクスチャはカラーとノーマルのみです。

Lightwave向けにエクスポートするテクスチャのプリセット設定についてはこちらの記事を参照してください。

lunarbor.hatenablog.com

Lightwaveでテクスチャを適用する

LightwaveにはUV展開とメッシュの修正が完了したSDSモデルが読み込まれている想定から解説を始めます。

ノーマルマップテクスチャを編集する

今回3D-COATでノーマルマップにベイクした凹凸のうち必要なのは文字の部分だけなので、Lightwaveにテクスチャを読み込む前に画像編集ソフトで不要な部分を削除しておきます。具体的には、文字の部分だけ選択して他の部分は凹凸がない部分の色を拾って塗りつぶします。

ノードを組む

Lightwaveのレイアウトで"画像編集"パネルを開いてテクスチャを読み込みます。

ノーマルマップの"RGBカラースペース"は必ず"Linear"に変更してください。

"色・質感編集"パネルから"ノード編集"を開いてモデルにテクスチャを適用します。ノードはこんな感じです。

①"image"ノードでカラーマップテクスチャを読み込みUVマップで投影します。②"Luma"(輝度)と"Gradient"ノードの"Input"を繋いで③"Gradient"ノードの設定でグラディエンドバーにキーを追加して④"色""白(255,255,255)"にします。キーの位置を動かして文字の色が白、その他が黒になるように調整します。

⑥"Gradient"ノードの"Color""Mixer"ノードの"Opacity"(不透明度)につなぎます。これで黒の値は"0"白の値は"1"として扱われ、アルファチャンネルを付けて文字以外を透過させた状態と同じになります。⑦"Mixer"ノードの設定で"前景色"(文字の部分)と"背景色"(文字以外の部分)の色を指定して⑧"Color""Princibaled BSDF"ノードの"Color"に繋いで設定完了です。

ノーマルマップテクスチャは"NormalMap"ノードで読み込んで"Princibaled BSDF"ノードか"サーフェイスノード"(今回はNumber Plate)の"Normal"につなぎます。

レンダリング結果。(わかりやすい色を指定してあります。)

■完成

色を目的に合ったモノに差し替えて完成です。

"Prinscipled BSDF"カラー以外の値はこんな感じです。だいたい"粗さ"と"メタリック"で調整する感じです。

■まとめ

今回は前後編で画像から高解像度メッシュを生成してノーマルマップにベイクする方法を解説しました。Lightwaveでもディスプレイスメントマップを使えば画像からメッシュを生成することはできますが、盛り上げた側面に傾斜をつけるような処理をするには画像の該当箇所をグラデーションにする加工が必要になり結構な手間です。その点、3D-COATはツールの設定で処理の指定が可能なので、トライ・アンド・エラーもやりやすく目的の形状により早くたどり着けるので、使う意義は大きいと思います。

あと、3D-COATのベイク機能は大変優秀ですね。

今回の作例では平面にメッシュを生成しましたが、同じようなことを曲面で行う方法も調べる必要があると考えています。モデリングで必要になる形状は曲面であることのほうが多いと思うので…。ただ、今のところ何のアテもない状態なので、また分かったときには記事にしようと思います。