📹

3DスキャンしてモデルをUnityに取り込む方法

2021/05/01に公開

3DスキャンしたモデルをUnityに取り込みたい

Unityを使うと、StoreにあるAssetだけでなく、オリジナルの3Dモデルも扱いたくなってきますね。そんなとき使いたいのが3Dスキャンです。身の回りのものをスキャンしてUnityの世界に送り込めたら素敵ですね。

この記事では、そのための手法を紹介したいと思います。自分が試した方法は以下です(他にもおすすめの方法あれば教えてください)。

  1. LiDAR付きのiPhone/iPadで3D Scanner Appを使ってobjファイルを書き出す
  2. Realsenseで保存したplyファイルをobjファイルに変換する
  3. 複数方向から撮影した画像からplyファイルに変換する

1だと、簡単で時間がかからないですが、お金がかかります。3は、手間と時間はかかりますが、お金はあまりかかりません。クオリティに関しては、正式な比較はできていませんが、この記事の方法だと 3 >> 1 > 2 といったところです。クオリティに関しては、手間と工夫により大きく変わると思いますので、各自で工夫してみてください。

OSはMacで実施しましたが、他のOSでも同じ要領でできると思います。

LiDAR付きのiPhone/iPadで3D Scanner Appを使う

LiDAR付きのiPhoneかiPadを買います。現状は、iPhone 12Pro, iPhone 12Pro Max, iPad Proになると思います(各自確認ください)。

3D Scanner Appをインストールして起動してスキャンします(以下スキャン画面)。

余分な背景は、アプリ内で編集することもできます。今回はこのままエクスポートします。obj形式を選択します。

圧縮されたファイルの中に textured_output.obj textured_output.mtl textured_output.jpgというファイルが入っています。これはそれぞれ、3Dオブジェクトの形状情報と材質情報とテクスチャの情報となり、3つで1つのセットとなります。

objファイルは、UnityでドラッグアンドドロップでAssetsに取り込みます。

Sceneに配置することでスキャンした3DオブジェクトをUnity上で扱えます。

3Dスキャンアプリは、他のものでも、同じ要領でできると思います。スキャンアプリのまとめは以下ツイートが参考になりそうです(まだ他のアプリは試せていません)。

https://twitter.com/iwamah1/status/1463846807616692224

https://twitter.com/iwamah1/status/1389194658782220295

Realsenseで保存したplyファイルに変換する

3DカメラのRealsenseを使って3次元情報を取得する方法です。各プラットフォームへのRealsenseのインストールは以下記事参照ください。

https://zenn.dev/karaage0703/articles/a267aa24a80c44

インストール完了したら、Realsenseを繋いだ状態でrealsense-viewerを起動します。

右上のExportアイコンをクリックしてplyファイルを保存します。

この後、Unityで取り込めるようにMesLabというソフトを使って、plyファイルをobjファイルに変換します。MeshLabはマルチプラットフォーム対応の3次元情報を扱えるソフトです。以下からダウンロード、インストールしてください。

https://www.meshlab.net/

MacだとHomebrew、Linuxだとaptでインストールすることもできます(省略)。

MeshLabでの変換の流れは、大きく以下となります。

  1. 点群の前処理
  2. テクスチャの書き出し
  3. objファイルにエクスポート

それぞれ説明していきます。

点群の前処理

MeshLabでplyファイルを開きます。

不要な点群があれば、上のメニューのSelect Vertexesで選択して、Deleteアイコンをクリックを繰り返して削除します。

続いて、点群のサイズを削減します。 Filter > Sampling > Point Cloud Simplificationを選択します。Number of Samplesは、1000〜10000程度に設定しました。大きいほどきれいなモデルとなります。

テクスチャの書き出し

以下の操作を実施します。このあたりは、詳細は理解していません。詳しく知りたい人は、MeshLabのマニュアルなどを参照ください。

Filters > Remeshing, Simplification and Reconstruction> Surface Reconstruction: Ball Pivotingを選択します。設定はデフォルトでOKです。

Filters > Texture > Parametrization: Trivial Per triangleを選択します。
設定はデフォルトでエラーとなった場合は、Inter-Triangle border valueを1にして試してみましょう。それでも駄目なら、点群の前処理でNumber of Sampleの数を減らしてください。

File > Save Project As... でプロジェクトを保存します。設定はデフォルトでOKです。プロジェクト名は、ここではtestとします。

Filters>Texture>Transfer Vertex color to texture を選択します。Texture fileは、自分の環境では最初から絶対パスが入力されていましたが、相対パスで入力しないとエラーになりました。ファイル名だけを入力したらOKです。

これで、テクスチャのファイル test_tex.pngが生成されます。

objファイルのエクスポート

File > Export Mesh As... でObjファイルにエクスポートします。

Texture Nameを選ぶ画面では、先程生成したテクスチャのファイル名を入力します。これで、test.obj test.mtl test_tex.pngという3種の神器が揃います。

objファイルが揃ったら、「LiDAR付きのiPhone/iPadで3D Scanner Appを使う」のときと同様、Unityにドラッグアンドドロップするだけです。

複数方向から撮影した画像からplyファイルに変換 + plyファイルををobjファイルに変換する

3Dカメラを使わず、複数の写真から3Dモデルを生成するPhotogrammetry(フォトグラメトリ)という技術を使った方法です。

以下記事を大変参考にさせていただきました。というかほぼそのままです。なお、ここからは、Apple Silicon Macでは現段階ではエラーが出て実行できなかったため、Intel Mac/Windows PC(WSL2)で実施しています。

https://qiita.com/kotauchisunsun/items/93c037de40335bd398ab

最初にDockerをインストールする必要があります。Dockerに関する説明とインストール方法は以下記事参照ください。

https://karaage.hatenadiary.jp/entry/2019/05/17/073000

続いて、事前準備します。以下コマンド実行してフォルダを作成します。

$ mkdir photogrammetry && cd photogrammetry
$ mkdir image && mkdir scene

上記のimageフォルダの中に、複数方向から撮影したファイルを格納します。とりあえず試したい場合は、以下からデータをダウンロードしましょう。

https://www.agisoft.com/downloads/sample-data/

動画から画像を切り出したい場合は、ffmpegを使って切り出しましょう。以下コマンドでインストールできます。

$ sudo apt update
$ sudo apt -y install ffmpeg

1秒ごとに静止画を切り出したい場合は、以下コマンドで切り出せます。

$ ffmpeg -i sample.mov -r 1 image/%06d.jpg

これで準備ができたらphotogrammetryフォルダで、以下コマンドを実行します。

$ sudo docker run --rm -it --privileged -v `pwd`/image:/image -v `pwd`/scene:/scene kotauchisunsun/alpine-mve ./run.sh 

しらばらく(10分以上)時間が立つとsceneフォルダにsurface-L2-clean.plyという画像から合成されたplyファイルが生成されます。

以下はMeshLabで開いたplyファイルです(余分な点群を除去しています)

かなりきれいな点群が生成されています。

plyファイルからobjファイルへの変換、及びUnityへの取り込みに関しては、「LiDAR付きのiPhone/iPadで3D Scanner Appを使う」「Realsenseで保存したplyファイルをobjファイルに変換する」と同様なので、省略します。

まとめ

3DスキャンしたモデルをUnityに取り込む方法をまとめました。簡単にできるだろと思ったら、意外に大変でした。特にMeshLabの使い方は、ネット情報通りだとなかなかうまくいかなくて、結局自己流の方法になりました。詳しい人、是非アドバイスください。

この取り込んだ3Dモデルが実際に使い物になるかは、全く試していません。今後、取り込んだ3Dモデルを使って、色々遊んでみたいなーと思っています。

参考リンク

https://note.com/iwamah1/n/n5df9a5daaae4

https://note.com/iwamah1/n/n3db06f7c3897

http://www.pointcloud.jp/blog_n22/

https://www.intelrealsense.com/3d-scanning-an-environment/

https://qiita.com/kotauchisunsun/items/93c037de40335bd398ab

https://www.youtube.com/watch?v=gS73GIysLZs

https://www.youtube.com/watch?v=ny7mpyy58V4

変更履歴

  • 2022/07/18 フォトグラメトリに関してWSL2とffmpedによる動画切り出しに関して追記

Discussion