🐜

Scaniverseでスキャンした広大な平面データを画質を保持したまま軽量化して扱いやすくする

に公開

この記事でやること

タイトルの通り、Scaniverseで撮影した「平面」形状の3Dスキャンデータを軽量化する方法について説明します。

基本的には下記記事を参考にしています。
https://creator.cluster.mu/2023/01/11/blender-3dweight/
https://styly.cc/ja/tips/blender-adjustment-scanmodel/

こちらの記事がとても親切で、様々なケースを網羅的に説明してくれています。
が、今回は「平面」形状のみが対象となるため、手順どおりにステップバイステップで取り組めば、だれでも目的を達成できるよう再編成しました。
また、今後自動化に移行しやすいよう、モデルごとに別々の対応をとる必要が発生しない処理に絞って構成しています。自分自身がBlender初心者なため手順をかなり細かく記載していますが、慣れてきたら3分くらいでできます。

手順

Decimateを用いた頂点の削除

修正する前のモデルを残しておくために、Shift + D + Enter でmeshを複製します。

Modifier Properties(画面右下のスパナのアイコン)-> Add Modifier, Decimateを選択。Decimateを使用すると、大まかな形状を保持したまま頂点データを自動で大量に削減してくれます。(全然余談ですが、Decimateの意味は「<人・動物などを>多数殺す、<作物・森などを>大量にだめにする」だそうです。)他のサイトでは人力で頂点削減を行う方法が紹介されていますが、今回のような平面オブジェクトはとくに、こうした自動化に頼りきってしまっても問題なさそうです。

Decimate内にあるRatioの項目は、もともとのデータにおける頂点数に対して、変更後の頂点数をどれくらいの割合にするか設定できるもの。平面のオブジェクトなので、経験的には0.05くらい(もとの頂点数から95%削減)まで極端に落としてしまっても問題ありません。

もともとのデータ
Decimate適用前
Decimate適用後
Decimate適用後

Decimate適用後、最後にApplyを選択して変更をモデルに反映します。

マージによる大まかな穴塞ぎ

この状態でメッシュの軽量化は十分に行えていますが、ところどころ穴が空いてしまっているのが気になります。全体にマージをかけて穴を塞いでいきます。

Object ModeからEdit Modeに変更した上で、Decimateを反映させたモデルの頂点を全選択(Command + A)し、その状態でMを押します。するとMergeメニューが開くので、一番下の「By Distance」を選択します。

画面の左下に、Merge時の設定を行う項目があるので、こちらを開いてMerge Distanceを設定します。こちらも経験則ですが、0.02m程度で大方穴を塞ぐことができるかと思います。

完全に塞げているわけではありませんが、このDistanceをあまり大きくしすぎてしまうとオブジェクトの形状を破壊してしまうことになるので、今回はこれくらいにしました。

ベイク

しかし、これまでの処理でメッシュの形状が大きく変化してしまっているため、ところどころテクスチャに歪みがでてしまっています。

なので、最初に複製しておいた軽量化前のモデルを使って、現在のモデルへとBakeします。
軽量化したモデルを選択した状態で、Material Propertiesタブを開き、+ボタンを押してマテリアルを追加。さらに、「New」を選択。

新規作成したマテリアルを選択して、Base Color のところにある丸をクリックし、表示された項目の中から「Image Texture」を選択します。

さらに、その下に表示された「New」ボタンを選択し、新規画像を作成します。(今回は画像名をBakedImageとしました)。ここに、もとのモデルのテクスチャを焼き付けます。
このとき、widthとheightは2048pxに設定、alphaのチェックは外しておきます。widthとheightについて、デフォルトでは1024pxとなっていますが、どうやらscaniverseで撮影された時のテクスチャ画像の大きさはそれよりも高解像度なようで、デフォルトのままだと画質が悪くなってしまいます。また、今回はテクスチャ画像に透過情報を含まないのでalphaのチェックは外しました。

ここまできたら、現在貼られているマテリアルはもう使用しないので、マテリアル一覧から「main」のマテリアルを選択し、-ボタンを押して削除します。

画面上部から「Shading」ウインドウを選択し、先ほど作成したノードを選択。

次に、Render Propertiesを開き、下記の設定を行います:

  • Render Engineを「Cycles」に変更
  • Deviceを「GPU Compute」に変更(GPU演算を使用できない環境もあるので、その場合はデフォルトのCPUを選択)
  • Bakeタブを開き、
    • Bake Typeを「Diffuse」に設定
    • Contributionsからdirect, indirectの項目のチェックを外し、colorのみチェックをつけた状態にする(通常ベイクはライティングの処理などをテクスチャとして焼き付けてしまって処理を軽量化するために行うもので、こうしたライティング設定を外すことはないのですが、今回はモチベーションが異なり、単に色情報を再マップしたいだけなのでライティング設定を外します。)
    • Selected to Activeにチェックを入れる
    • Extrusionを0.1mに設定

ここまできたら、軽量化したモデル、もとのモデルの順にモデルを両方とも選択し、Bakeを実行します。

Bakeがうまくいかず、ところどころ破断したテクスチャが現れてしまった場合は、先の「Extrusion」の項目の数値を上げて、再度実行してください。


Bake実行結果

書き出し

今回はunity向けに書き出したいので、下記noteを参考にしてfbx形式での書き出しを実行します。
https://note.com/info_/n/n1dd54ce4545b
書き出したい3Dオブジェクトを選択した状態で、file->export->fbx(.fbx)を選択し、下記の設定で書き出し。

おしまい

軽量化の流れは以上です。

Discussion