Matterportの巨大MatterPakデータを軽くする

# はじめに
この記事は[KDDIテクノロジー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kddi-tech)の17日目です。

[Matterport](https://matterport.com/)とは空間の3Dモデルを収録してデジタルコンテンツを制作し、Webで簡単に公開できるプラットフォームです。
弊社[KDDIテクノロジー](https://kddi-tech.com/)では自社でMatterport Pro3カメラを導入しており、コンテンツ制作などに活用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/1144eda8-965f-bbd2-01a0-656d659d51b6.png)
Matterportの魅力的な機能のひとつに、[MatterPak](https://support.matterport.com/s/article/Download-the-MatterPak-Bundle?language=ja)というデータ書き出しオプションがあります。この機能はユーザーがアップロードしたデータをもとに生成した点群・3Dモデル・平面図などが入手できる有償サービスで、とくにマテリアル付きのOBJファイルはUnityやUnrealEngineなどでも活用がしやすく重宝します。
しかし、大規模な収録をした際のMatterPakのOBJファイルはマテリアルが1000枚を超えてしまうこともあり、そういったファイルをUnityなどにそのままインポートしようとすると失敗する場合が多々あります。また、なんとかインポートを乗り切っても表示負荷が高く、PC上のコンテンツでは大丈夫でもスマホ上の表示は難しい、といった場合があります。
この記事では、比較的簡単な手順でこのMatterPakのマテリアルを統合して負荷を軽くし、ゲームエンジン上などでの取り扱いを改善させる手法をご紹介します。
# 用意するもの
## MatterPak
今回は権利上問題がなさそうな公式のサンプルとしてMatterport Pro3で収録したCannery Park 2を使っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/f2f15158-4b16-2d64-8360-2ba0bc04e3ff.png)
ダウンロードは[こちら](https://support.matterport.com/s/article/Download-the-MatterPak-Bundle?language=ja)からできます。
https://support.matterport.com/s/article/Download-the-MatterPak-Bundle?language=ja
Pro3のサンプルは2つありますが、下の方のCanneryPark_matterpak_nrGu9t4t52U.zipです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/31ad1e6f-c49f-6a51-6900-ba64f8740cb3.png)
## 画像縮小ツール
一括縮小機能があれば様々なソフトが使えますが、今回は吉田製作所の[縮小革命](https://netank.net/down)を用います。
https://netank.net/down
## Blender
今回は3DCGツールとして[Blender](https://www.blender.org/)を用います。バージョンは3.6.5を対象としています。
https://www.blender.org/
## Material Combiner
マテリアルの統合のためにBlenderのAddonである[Material Combiner](https://github.com/Grim-es/material-combiner-addon)を導入します。
https://github.com/Grim-es/material-combiner-addon
日本語での導入資料はこちらのページなどが参考になります。
[tomo_shi_vi様 blenderでマテリアルやテクスチャを統合する](https://tomo-shi-vi.hateblo.jp/entry/20191102/1572687724)
# 画像を縮小する
MatterPakのファイルを展開すると大量の画像ファイルがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/5c888807-6225-7a5d-f30a-957225f383ab.png)
今回は640×640のサイズで縮小しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/f66ff236-9432-45a9-9b23-b91563058628.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/c5a8f5a9-11fc-b826-88f4-3460f6846dba.png)
縮小処理が終わったら、元からあったjpgファイルをバックアップし、縮小したファイルと入れ替えます。
# Blenderで読み込む
BlenderでMatterPakのOBJファイルを読み込みましょう。
メニューのFile⇒Import⇒Wavefront(.obj)でインポート可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/7814b3c3-fb7a-4221-93f7-28a86fce8e24.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/fb50b89a-e21d-3b60-8cc1-a66564a8873f.png)
# マテリアルを統合する
無事インポートを確認したら、画面の端の「<」をクリックしてメニューを出し、MatCombinerのタブを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/60ff7789-e3f7-4c2b-0798-5032222788b4.png)
インストールが無事終了していれば以下のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/1021a7b8-5771-f800-e112-c9e7581c5be3.png)
最初に、Main MenuのMaterials to CombineにあるGenerate Material Listボタンをクリックし、使われているマテリアルの一覧をリスト化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/94cb3378-9043-da2c-d7ce-6b3f00093bba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/e92642e1-0171-0b71-3d86-55caad93e933.png)
次に、PropertiesのAtlas SizeをCustomに変更し、Max witdhとMax heightを変更します。4096×4096や8192×8192など、利用シーンに合わせて変更しましょう。
終わったらSave Atlas to..をクリックして保存します。
今回はOBJファイルと同じディレクトリを指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/c14a620e-b228-c295-0989-7cfe71cd439b.png)
すると、あれだけあったマテリアルが一つに統合されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/a1f6c96a-4516-76af-6c6f-1a244dde0dce.png)
今回のマテリアルの結合を反映させたOBJファイルを保存したい場合は、メニューのFile⇒Export⇒Wavefront(.obj)でエクスポート可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/4b43f3a1-b644-4045-fa51-4a8456e2756e.png)
# 動作確認
読み込みはだいぶスムーズになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961786/7f1999f8-b4ef-e546-7224-26f0b24516e5.png)
# 注意点
今回は749枚のマテリアル画像があり、640×640で縮小して8Kのマテリアルを生成しましたが、もっと枚数が増えてくるとMaterial Combinerの制限により中間生成する結合マテリアルの許容サイズをオーバーしてしまうため、エラーが出るようになります。この場合は縮小時に480×480などのさらに小さいサイズを指定する必要があります。
# 最後に
KDDIテクノロジーでは、メタバースやデジタルツインなどの文脈で様々なコンテンツの開発に関わっており、収録機材も自社で運用しています。ご興味のある方は[公式Webページ](https://kddi-tech.com/contact/)よりお問い合わせください。