[3DCoat] フォトグラメトリからの形状とテクスチャを整理

  • by

iPhone/iPadで動作するフォトグラメトリアプリ「Trnio 3D Scanner」( https://apps.apple.com/jp/app/trnio-3d-scanner/id683053382 )でたまに野外でいろいろ撮って遊んでいます。

Trnio 3D Scannerで3Dスキャン

以下は、Trnioでフォトグラメトリした3Dモデルです。
iPhone8上のTrnioアプリで表示しています。


Trnioからはobj形式でエクスポートできます。
3DCoatにインポートします。

3DCoatで編集

3DCoatでインポートしてリトポを再度行うことが目的になります。
いくつか3Dモデルをインポートする手段がありますが、手順によっては正しくリトポまでたどりつけません。
ここでは3DCoat 2022.16を使用しました。

Paintルーム : Paintルームに対してインポート

メインメニューの「File」-「Import」-「Model for Per Pixel Paint」でobjファイルを指定します。
「Import Object for Pixel Painting」ウィンドウが表示されるため、そのままOKボタンを押します。

なお、このときのテクスチャの列挙と解像度はTrnioで出力したobjで参照しているマテリアルから取得されます。
この場合は3つのテクスチャが使用されてます。

Paintルームに以下のように表示されました。

ジオメトリとテクスチャが渡されています。
姿勢が回転した状態ですがそのまま進めます。

現状はPaintルームだけに形状があり、このままでは作業できないためSculptルームに送ります。

Paintルーム : PaintルームからSculptルームに送る

Paintルームで
メインメニューの「Bake」-「Take subdivided paint mesh into the sculpt room」を選択。
以下、そのままOKボタンを押して進めます。

再分割された状態でSculptルームに送られます。
この処理は時間がかかります。

Sculptルームに形状が送られているのを確認できました。

SculptTreeウィンドウに「default」というのが追加されています。
これが対象の3Dモデルです。

その上の「Volume8」というのはカラなので削除しておきます。

Sculptルーム : Sculptルームで回転させて姿勢を揃える

SculptTreeウィンドウで「default」を選択した状態で、左のメニューから「Transform」を選択します。
ビューでGizmoをつかんで姿勢を揃えます。

Sculptルーム : シェーディングしない表示にする

現状はライティングされていてわかりにくいため、シェーディングしない表示(Unlitな状態)にします。
メインメニューの「View」-「Flat Shade」を選択します。

フォトグラメトリの形状はライティングしないUnlitな状態が映えますね。

Sculptルーム : 現在のテクスチャとUVを見る

この段階では、「Sculptとして形状を持ち、デフォルトのテクスチャが割り当てられた状態」です。
Paintルームに移動して「Texture Editor」ウィンドウを見た場合、現在の割り当てされているテクスチャを確認できます。
ここでは3つのマテリアルが1つの形状に割り当てられている状態です。

UVではバラバラの状態です。
Trnioからobjで読み込んだ直後はこの状態であるため、これを整理したいところです。

再び、Sculptルームに戻ります。

Sculptルーム : リトポ(AUTOPO)の実行

SculptルームのSculpt Treeウィンドウで対象の形状を選択し、右クリックでポップアップメニューを出します。
「AUTOPO」-「AUTOPO」を選択して自動リトポします。

確認のウィンドウが出たら「OK」ボタンまたは「Next」ボタンを押して続けていきます。
この処理は時間がかかります。

この処理で、Retpoルームに移動します。
以下のようにメッシュが表示されました。
「Poly Groups」ウィンドウの「default」が自動リトポされたメッシュになります。

面数4222(8422三角形)となり、かなりリダクションできました。
ちなみにオリジナルのobjファイルは170598三角形でした。1/20くらいに最適化できてます。

「Poly Group1」は不要なので削除しておきます。

Retpoルーム : Paint用オブジェクトを削除

ところで上記は、オリジナルの(傾いた)形状が見えています。
これはPaint用のオブジェクトになるため現在は不要なので削除します。
「Paint Objects」ウィンドウの「default」の左の「X」を押して削除します。

以下のようになりました。

Retpoルーム : UVを再割り当て

Seamを追加

現状はUVがない状態なため、UVを与えます。
Seamを入れてからUV展開することになります。
ここではめんどくさいので、左端のメニューで「Auto Seams」を選択し自動でSeamを与えました。

もっと綺麗に行く場合は「Make Seams」で手動でエッジを選択してSeamを追加するほうがよさそうです。

Unwrap

左端のメニューで「Unwrap」を選択してUV展開します。

UVは以下のようになりました。

この段階ではMeshとUVが割り当てられただけで、まだこの新しいMeshにはテクスチャが割り当てられていません。

Paintルーム : 不要なレイヤを削除

Paintルームに移行します。
Layersウィンドウで「texture2」「texture1」「texture0」は不要なため削除します。

それぞれを選択して、Layerウィンドウ下のゴミ箱アイコンを選択して削除していきます。

Retpoルーム : UVを元にテクスチャベイク

Retpoルームに戻り、新しいMeshとUVを元にテクスチャをベイクしていきます。
以下の手順でないと正しくベイクできないようでした。

Retpoルームで
メインメニューの「Bake」 - 「Bake scrupt mesh onto paint room mesh」を選択。
表示されるウィンドウでは「OK」ボタンを押してデフォルトで進めていきます。
しばらく待つとPaintルームに切り替わります。
まだこの段階ではテクスチャはベイクされてません。

Retpoルームに切り替えます。
メインメニューの「Bake」 - 「Update Paint mesh with retpo mesh」を選択。
次に表示されるウィンドウで「Save」ボタンを押します。

次に表示されるウィンドウで「Texture Width」「Texture Height」でベイクする際のテクスチャ解像度を選択します。
ここでは4096を選択しました。
また、生成されるMeshのスムージング角度を指定したい場合は「Auto Smoothing Groups」をOnにして、Angleを指定します。
指定しない場合はすべてがスムージングされます。

OKボタンを押して進めます。

まだこの段階ではテクスチャはベイクされてません。
メインメニューの「Bake」 - 「Bake scrupt mesh onto paint room mesh」を再び選択。
表示されるウィンドウでは「OK」ボタンを押してデフォルトで進めていきます。
この処理は時間がかかります。

この処理が終わるとPaintルームに切り替わります。

Paintルーム : テクスチャを確認

Paintルームで、ようやくテクスチャベイクが行われました。

Colorで1枚のテクスチャ、Normalsに切り替えるとNormalマップも生成されています。

これで、3DCoat上のリトポ+ベイクは完了です。

Paintルーム : fbx形式でエクスポート

Blenderに結果を持って行きます。
メインメニューの「Files」-「Export Object & Textures」を選択し、fbx形式でエクスポートします。

「Output mesh」で出力先を指定します。ここでfbxとしておきました。
プリセットは「Blender Cycles」。
テクスチャは「diffuse」と「Normalmap」以外は不要なため削除、Exportボタンを押します。

これで、fbxファイルと4096x4096ピクセルのDiffuse/Normalマップテクスチャが出力されました。

Blenderにインポート

以降はBlenderの作業です。
メインメニューの「File」-「Import」-「fbx」を選択。
3DCoatでのPoly Groupsウィンドウで表示されていた形状名「default」で読み込まれました。
読み込み直後は小さいため、Object Propertiesを選択しScaleを(1.0, 1.0, 1.0)に変更しました。

マテリアルを調整

以下のように表示されてます。

現状Metallic/Roughnessやテクスチャが渡っていないため、マテリアルを変更します。
その前に表示をEeveeに切り替えます。
ビューの右上で一番右端を選択。

形状に割り当てられているマテリアルを選択。
MetallicとSpecularが1.0になっているため、0.0に変更。
Roughnessを大きめの値にしました。

BaseColorで「Image Texture」を割り当て、3DCoatで出力したDiffuseテクスチャを指定します。

Normalで「NormalMap」を割り当て、NormalMapとしてのColorで「Image Texture」を割り当てて、3DCoatで出力したNormalMapテクスチャを指定します。
「Color Space」は「Raw」としました。

以下のように表示されました。

光源の調整

World Propertiesで「Color」を上げました(環境光の役割)。

デフォルトのPoint Lightを無効にし、Sun Lightを追加して調整しました。

今回はここまでです。
Trnioのフォトグラメトリで撮った3Dモデルを3DCoatで整理すると、他のDCCツールでも十分活用できそうですね。