Open3D 0.12.0 for Python (Windows) 入門～ 3. フリーの3Dメッシュデータの活用とサンプリングについて

ポイントクラウドを使用し実用的なアプリケーションを開発する場合、現実的に使えるかをいろいろテストする必要がでてきます。しかし、目的とするもののポイントクラウドデータを多く集めるのが難しい場合も多いと思います。その場合の１つの手段として、ライセンスフリーの3Dメッシュ素材を使用する方法が考えられます。ターゲットとしている対象物の性質（自然物か数学的構造物か、表面の材質が布のようなざらつきがあるかプラスチックのように滑らかなものか、実際に使用する環境が屋内か屋外か等）の違いによる影響を考慮する必要はありますが、それがある程度無視できる分野であれば、3Dメッシュからポイントクラウドを生成することで、様々なテストケースを用意することができると思いますので、今回は、その一例をご紹介します。

### 1. 3Dフリー素材の入手先

3Dのフリー素材を提供している代表的なものとしては、[Sketchfab](https://sketchfab.com/) などがあります。なお、個人や学術研究など非営利目的ではフリーであるものの、商用利用は不可といった制限は、それぞれ異なりますので個別ライセンスは確認の上使用するよう十分気を付けてください。

- Free3D: [https://free3d.com/](https://free3d.com/)
- TurboSquid: [https://www.turbosquid.com/](https://www.turbosquid.com/)
- 3DWarehouse: [https://3dwarehouse.sketchup.com/](https://3dwarehouse.sketchup.com/)

### 2. Blenderで必要なメッシュに加工する
さて、今回はとりあえず、[Blender](https://www.blender.org/) を使いたいと思います。Blender は、以前は、独特のインターフェースであったり、不安定であったためプロユースでは敬遠されていましたが、現在の最新バージョンは、商用レベルでも十分つかえるほどの安定性と、他の商用ソフトに近い操作性になるなど、大きく進化してきています。また、以前までは高級な商用ソフトでしかできなかったようなスカルプト機能（メッシュを粘土をいじるように形状変化させる機能）も搭載しています。また、対応OSも、Windows や Mac だけでなく Linux がサポートされているため、Linux上でポイントクラウドデータをディープラーニング処理している場合などでも非常に便利です。
![ezgif-7-9a1d6fbc3634.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/ebf9adb3-6884-33f9-1190-601a0bf7424e.gif)

### 3. Blenderから ply 形式でエクスポートする
Open3D や MeshLab などポイントクラウド処理用のツールは、基本的にポイントクラウドを処理することを目的としているため、3Dメッシュを読み込める対応フォーマットは多くありません。そこで、まず Blender で3Dメッシュデータをインポートし、必要に応じメッシュを加工(例えばメッシュの細分化しスカルプトで形状を少し変化させる等)したあと、ply 形式でエクスポートします。
<img width="600" alt="Blender 2021_02_09 20_40_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/275c308e-c652-31ab-d094-0c8ccebded92.png" />

- **出力時の座標系設定**
Blender は、OpenGLベースのため右手系です。 ply でエキスポートする際、下記画像のように、"選択物のみ"にチェックをつけるだけでなく、前方を -Z 上を Y と設定するようにすれば、左手系の Opne3D や MeshLab にインポートした際、以前と同じ向きで取り扱うことができます。 
<img width="300" alt="Blender 2021_02_09 20_54_52 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/1ff4a359-aef7-21fe-6789-33c20821b9c1.png" />

- **MeshLab でインポートした結果**
<img width="600" alt="MeshLab 2020.07 - [Project_2] 2021_02_09 20_56_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/898c4a8d-a4a2-3392-fba0-64f35fbd3333.png" />

### 4. MeshLab でポイントクラウド化

いよいよポイントクラウド化をしますが、ポイントクラウド化の方法には様々な手法があり、目的に応じて、どの手法を選択するのがベストかは異なりますので、いくつか特徴的な手法を紹介します。

- **Mesh Element Sampling** は、下の画像をみるとわかりますが、メッシュを構成する三角ポリゴンの頂点をサンプリング対象にしています。ポリゴンの頂点にもともと規則性があるような構造物で、その後の処理において点群が整列されている必要がある場合などには有効なサンプリング方法かもしれません。
![SharedScreenshot_element.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/f1d40c1b-fc27-da18-ef92-0ac3f3c2be38.jpeg)

- **Montecarlo Smapling** は、単純なランダムサンプリングです。画像のとおり、ランダムであるため、よく見るとところどころ点の密度にバラツキも存在します。それぞれの点どうしにあえて規則性ができないようなポイントクラウドを作りたい場合に使うと良いと思います。
![SharedScreenshot_montecarlo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/f2200527-8fff-84f9-4ee8-fd0f4a1609fb.jpeg)

- **Poisson-disk Sampling** は、モンテカルロに似ていますが、サンプリングした点同士の距離がある程度均等になるようにサンプリングされるため、モンテカルロと違いメッシュ形状による分布の偏りがわりと抑えられています。ポイント間の密度に粗い部分があると、その後、ポイントクラウドからメッシュを再構成したい場合、メッシュがうまく作れず穴が生じてしまうことがありますが、そうした穴の発生は極力抑えることができると思います。
![SharedScreenshot_poisson.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98998/ee983834-0286-332e-3366-aabbedb78d34.jpeg)

他にも、細かい特徴の違いがあり、MeshLab には多くのサンプリング手法があります。また、こうしたサンプリングは Open3D でももちろん可能ですし、独自のサンプリング・ロジックで処理することもできます。いずれにしても、最後は、１つ１つトライアンドエラーを繰り返しながら、目的にあったサンプリング手法を探る地道な作業をが必要になると思います。

今回は Open3D らしい説明は全くしませんでいたが、いきなり Open3D で、処理ロジックをコーディングするのではなく、MeshLab などの便利なツールも併用しながら処理ロジックを検討することも悪くないと思いご紹介しました。

次回は、再び Open3D にもどり、現場でよく使う便利な関数をご紹介していきたいと思います。