3DスキャンしてモデルをUnityに取り込む方法
3DスキャンしたモデルをUnityに取り込みたい
Unityを使うと、StoreにあるAssetだけでなく、オリジナルの3Dモデルも扱いたくなってきますね。そんなとき使いたいのが3Dスキャンです。身の回りのものをスキャンしてUnityの世界に送り込めたら素敵ですね。
この記事では、そのための手法を紹介したいと思います。自分が試した方法は以下です(他にもおすすめの方法あれば教えてください)。
- LiDAR付きのiPhone/iPadで3D Scanner Appを使ってobjファイルを書き出す
- Realsenseで保存したplyファイルをobjファイルに変換する
- 複数方向から撮影した画像から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スキャンアプリは、他のものでも、同じ要領でできると思います。スキャンアプリのまとめは以下ツイートが参考になりそうです(まだ他のアプリは試せていません)。
Realsenseで保存したplyファイルに変換する
3DカメラのRealsenseを使って3次元情報を取得する方法です。各プラットフォームへのRealsenseのインストールは以下記事参照ください。
インストール完了したら、Realsenseを繋いだ状態でrealsense-viewerを起動します。
右上のExportアイコンをクリックしてplyファイルを保存します。
この後、Unityで取り込めるようにMesLabというソフトを使って、plyファイルをobjファイルに変換します。MeshLabはマルチプラットフォーム対応の3次元情報を扱えるソフトです。以下からダウンロード、インストールしてください。
MacだとHomebrew、Linuxだとaptでインストールすることもできます(省略)。
MeshLabでの変換の流れは、大きく以下となります。
- 点群の前処理
- テクスチャの書き出し
- 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)で実施しています。
最初にDockerをインストールする必要があります。Dockerに関する説明とインストール方法は以下記事参照ください。
続いて、事前準備します。以下コマンド実行してフォルダを作成します。
$ mkdir photogrammetry && cd photogrammetry
$ mkdir image && mkdir scene
上記のimageフォルダの中に、複数方向から撮影したファイルを格納します。とりあえず試したい場合は、以下からデータをダウンロードしましょう。
動画から画像を切り出したい場合は、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モデルを使って、色々遊んでみたいなーと思っています。
参考リンク
変更履歴
- 2022/07/18 フォトグラメトリに関してWSL2とffmpedによる動画切り出しに関して追記
Discussion