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

  • by

[3DCoat] フォトグラメトリからの形状とテクスチャを整理」では、Trnioでフォトグラメトリした3Dモデルをobj形式でエクスポートし、3DCoatでテクスチャの整理を行いました。

上位版のTrinoPlusはさらにメッシュ数が増えてより精度が上がりましたが、
3DCoatに持って行くこの方法ではリトポ後のテクスチャの再マッピングがうまくいきませんでした。
これの解決策を見つけましたので、改めてまとめていきます。

メッシュの整理のためにBlenderも使っています。
今回はBlender 3.5.1、3DCoat 2023.16を使用しました。

Blender : TrinoPlusからのフォトグラメトリの3Dモデルを確認

TrnioPlusでフォトグラメトリした3DモデルをBlenderに読み込みました。
Blenderに読み込む際はどのような形式でもいいですが、objが安定していてよいと思います。

Blenderでの階層(Outliner)は以下のようになっています。

BlenderでViewport Overlaysの"Statistics"をOnにして、頂点数や三角形数を確認します。

この場合は861259三角形となっています。

暗いのは今は無視してください。
Unlitにしたい場合は「[Blender] Unlitの表現」もご参照ください。
ただ、Blenderで最適化したobjを新しくエクスポートすることになりますので、今はマテリアルをいじらないほうがよいと思います。

Blenderで確認する大事な点として、もし、複数のMeshに分かれている場合は
1つのMeshに複数のメッシュ(Submesh)が割り当てられている」という構造になるように編集しておいてください。

Blender : テクスチャを確認

このドーナツの形状の場合は、8Kと2Kの2枚のテクスチャが使われていました。

最終的には4Kの1枚のテクスチャにまとめます。

Blender : 重複頂点を結合

メッシュを最適化していきます。
まずは重複頂点がある場合に結合します。
Meshを選択し、"Edit Mode"に移行。
頂点選択を有効にして、すべての頂点を選択します。

メインメニューの[Mesh]-[Clean Up]-[Merge by Distance]を選択しました。
左下の"Merge by Distance"選択すると、近接の結合を行う距離を変更できます。

これを0.0002(m)に変更してEnterキーを押して適用しました。
861259から861173三角形と少し削減できました。
Object Modeで見て、不正になっていないか確認します。

テクスチャが変になっている場合は、UNDOで戻して"Merge by Distance"の距離を再度調整するようにしてください。

Blender : 面積0や長さ0のエッジを削除

面積0や長さ0のエッジを削除ます。
"Edit Mode"に移行し、すべての頂点を選択。
メインメニューの[Mesh]-[Clean Up]-[Degenerate Dissolve]を選択しました。
左下の"Degenerate Dissolve"より"Merge Distance"を0.0002(m)に変更してEnterキーを押して適用しました。

861173から859837三角形に削減できました。

Blender : objファイルをエクスポート

Meshのクリーンアップができましたので、objファイルにエクスポートします。
Meshの"model"を階層(Outliner)で選択。
メインメニューの[File]-[Export]-[Wavefront (obj)]を選択します。

エクスポート時は選択した形状のみをエクスポートします。
"Limt To"の"Selected Only"をOnにしてobjファイルをエクスポートしました。

以上でBlenderでの作業は完了です。

3DCoat : objファイルをインポート

3DCoatにobjファイルをインポートします。
メインメニューの[Model]-[Model for Per Pixel Painting]を選択。
objファイルを読み込みます。
表示されるウィンドウでテクスチャがオリジナルのテクスチャのサイズになっていることを確認し、OKボタンを押します。
この場合は、8Kと2Kのテクスチャを確認できました。

Paintingルームで、テクスチャが切り替えることができるのを確認します。

この場合は、2枚のテクスチャを1つのMeshで使っています。

3DCoat : Unlitにする

メインメニューの[View]-[Flat Shade]を選択するとUnlitになり、本来のテクスチャ色のまま表示されます。
Viewportでぐるっと回してみて、問題ないことを確認しておきます。

3DCoat : Sculptルームに形状を送る

メインメニューの[Bake]-[Take subdivided painting mesh into the sculpt room]を選択。
これは、PaintルームからSculptルームに形状を送ります。
そのまま「OK」を押して進めます。

この処理は少し時間がかかります。

3DCoat : Sculptルームの形状(Surface)より、リトポ用のメッシュを作成(AUTOPO)

Sculptルームに、Paintルームと同じ形状が配置されました。
Sculpt Treeパネルでは"S"と表示されています。これはSurface(ポリゴンを持つ形状)です。

上画像では"model"が追加された形状。その上の"Volume7"は不要になったため削除。

Sculpt Treeパネルの対象形状(ここでは"model")を選択し、右クリックメニューの[AUTOPO]-[Instant meshes(auto)]を選択します。
これは、四角形ポリゴンで自動的にメッシュが生成されます。

AUTOPO-"AUTOPO"は場合によってうまくいかず、AUTOPO-"Instant meshes(auto)"だとうまくいきました。

途中のウィンドウで、だいたいの四角形の総数を指定できます。
ここで、10000を指定しました。

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

Retpoルームに切り替わりました。
Poly Groupsパネルに、生成されたMeshが表示されます。

選択されたMeshのポリゴン数が画面下のステータスバーで表示されているのを確認できます。
指定のとおり、だいたい10000面になっています。

3DCoat : UVの作成

この段階ではまだUVは割り当てられていません。
Retpoルームの左のメニューから「Mark Seams」を選択。
さらにメニューを下にスクロールして「AutoMap」を選択しました。

綺麗にUVを作成する場合は、シームを追加してからUnwrapしたほうがいいと思います。
ここは、説明の手間がかかるので飛ばしました。

これで、自動的にメッシュはシームが割り当てられて、UVも島(Island)ごとに分かれているのを確認できます。

3DCoat : Paintingルームで不要な要素を削除

Paintingルームに切り替えます。
Layersパネルを表示し、texture0、texture1は不要なので削除。

Layer 0、Layer 1だけが残っています。

Painting Objectsパネルで"model"のXを押して削除します。

これでベイクを行う準備が整いました。
現在で、Paintingルームのメッシュ(はじめにインポートした参照用)、SculptルームのSurface、Retpoルームのメッシュが存在します。

3DCoat : SculptのメッシュをPaintingルームのメッシュにベイク

Retpoルームに移動し、メインメニューの[Bake]-[Bake sculpt mesh onto painting room mesh]を選択します。
何回かウィンドウが表示されますが、そのまま[OK]を押して進めていきます。
これは少し時間がかかります。
Paintingルームに切り替わります。ここでは変化が見えません。

Retpoルームに切り替えます。
メインメニューの[Bake]-[Update Paint mesh with retpo mesh]を選択します。
途中で以下のウィンドウが表示されます。
一番下のTexture Width、Texture Heightで出力するテクスチャの幅と高さを指定。
ここでは4096としました。
また、生成されるMeshのスムージング角度を指定したい場合は「Auto Smoothing Groups」をOnにして、Angleを指定します。
指定しない場合はすべてがスムージングされます。

OKボタンを押して進めます。
この処理はすぐに終わります。

再度、メインメニューの[Bake]-[Bake sculpt mesh onto painting room mesh]を選択します。
何回かウィンドウが表示されますが、そのまま[OK]を押して進めていきます。
これは少し時間がかかります。
Paintingルームに切り替わります。

これで、ようやくPaintingルームにメッシュが渡り、テクスチャが再マッピングされました。
LayersパネルではNormal Mapを含む4レイヤになっています。

また、Texture Editorパネルには再マッピングされたテクスチャを確認できます。
"Normals"に切り替えると、Normal Mapも確認できました。

なお、PaintingルームではPaint用としてリトポしたメッシュと、Sculpt用のメッシュが重なって表示されています。

Sculpt Treeパネルの形状を非表示にすることで、最終的なメッシュにベイクされたテクスチャの状態を確認できます。
ほぼ変わりはないですが、最終的には以下のポリゴンリダクションが行われたことになります。

  • 三角形数 : 861259 → 19784 (43.53倍の最適化)
  • 2マテリアル、2テクスチャ(8K + 2K) → 1マテリアル、1テクスチャ(4K)

ずいぶん最適化できましたね。
後は、エクスポートするとこのメッシュのマテリアル、テクスチャで扱えることになります。
AR/VRでたくさんの形状を配置したい場合、このポリゴンリダクションは強力な武器になりそうですね。