代表技術通信~Unityで点群表示、Oculus Questで表示①
こんばんは。代表の草場です。
今後しばらくは技術的な記事を書こうと思います。書き方がなっていない、と高橋さんに怒られそうですが、つらつらと書きます。
LiDARでいくつかの場所を撮影して点群を集めてきました。本当は最近はやりのUnreal Engineで表示したいのですが、よくわからないため、いったんはUnityを使います。諸々初めてなので、こちらの「静岡県の点群データをUnityで表示してOculus Questで見る」をほとんどそのまま実行させていただきました。
手順が詳しく記載されています。私の場合、初めてUnityガッツリ触るのでわからず、さらに細かく記載します。
本当はキャプチャ写真も載せたいのですが、画像が大量になるので、一部のみ。動画にまとめます(いつか)。
環境と使用ソフト
OS:Windows10 Pro
Unity:2019.4.10f1
点群データ処理:MeshLab、CloudCompare
①apkファイル作成のための準備
最初にOculus Questで実行可能なapkファイルを作成するための設定を行います(参考 APKとは何か、なんのために使うか)。事前準備として、記事「UnityからAndroidの.apkファイルを作成する」に沿って、「Android Build Support」「Android SDK & NDK Tools」「OpenJDK」モジュールをUnityに追加します。追加後、新しいプロジェクトを立ち上げます。その後、以下の手順に沿って設定します。
1.File>Build Settingsで、PlatformにあるAndroidをクリックする。その後、switch platformをクリック。
2.Edit>Project Settings>XR Plug-in Managementで、[Install XR Plugin Management]をクリック。インストールが終わったら、Initialize XR on StartupとPlug-in ProvidersのOculusにチェック。
3.Edit>Project Settings>Player>Other Settings>Identification>Minimum API Levelを「marshmallow」に設定します。Package Nameを適当に設定しますが、com.Companyname(任意).Projectname(任意)の形にしないとエラーが出ます。
4.AssetStoreで「Oculus Integration」を検索し、Importします。青色のImportを押してしばらくすると新たな画面が出てくるので、とImportクリック。まあまあ時間がかかります。
Import後、おそらく再起動しろ、とメッセージでます。再起動。
5.Assetsフォルダ内のOculus>VR>Prefabsの「OVRPlayerContoroller」をHierarchyにドラッグ&ドロップし、もとからあったMain Cameraを削除します。
これでapkファイル作成の準備完了です。
②点群データのoff形式への変換
今回の点群データはply形式ですが、Unityでは読めないこの形式は読み込めないので、off形式に変換します。
はじめにCloudCompareを使用してtxtデータに変換します。今回使用するのはDMM.make Akibaさん。元々のデータが1億点あるので明らかに重そう。なので、再サンプリングで0.01に設定して点を減らしました。600万点まで減りました。そして保存の際にtxt形式を選びます。オプション画面出ますが、基本そのままでsave。
txtファイルをMeshLabで開きます。開く際のオプションでは以下の二つをこのように変更します。
Point format:X Y Z R G B
Separator:,
読み込めたら「Export Mesh As」で「.off」形式を選び、出力します。ここでは「akiba.off」とします。
③Unityで読み込む
記事によるとここでズルをしているらしいです。Unityの経験がない私は、何がズルかわかりませんので、そのままやります。
Point Cloud Free Viewerを使用して点群のPrefabを作ります。
1.点群Prefab作成用のUnityのプロジェクトを新しく作成します。
2.AssetStoreで「Point Cloud Free Viewer」を検索してImportします。まずは全部Importします。
3.インポートされたアセット内のPointCloudフォルダに、先ほど作成したakiba.offファイルを入れます。
4.AssetsフォルダのPointCloudの中にある「Example」というSceneを選択します。
5.Hierarchy内のPointCloudManagerを選択します。ここでInspectorのDataPathを書き換えます。PointCloudフォルダ内にakiba.offがあるはずなので、「/PointCloud/akiba」とします。
6.Scaleの値を書き換えます。ここでは「1」とします。
7.「Play」を押すとAssets>Resource>PointCloudMeshes内にakibaのPrefabが作られます。
④Occulus Questで表示
ここからはもとのUnity DMMProjectに戻ります。
1.Point Cloud Free ViewerをImportします。ただし、ここではMaterialsとShadersにだけチェックを入れます。
2.先ほどのUnityプロジェクトの、ResourceフォルダにあるPointCloudMeshesを、こちらのプロジェクトのResourceフォルダにコピペしてきます。
3.Unity画面に戻り、PointCloudMeshes内のakibaのPrefabをHierarchyにドラッグ&ドロップします。このとき角度がおかしければInspectorで角度を編集します。(今回X軸が90度回転していたためRotateのXを「-90」としました)
4.最後にapkファイルを作成します。
File>Build SettingからBuild and Run クリック。保存名聞かれるので適当に設定します。
ここで上記の「ただし、ここではMaterialsとShadersにだけチェックを入れます。」が効いてきます。すべてimportしたら、エラーが出ました。
あとはPCとOculus Questつなぐ設定が必要ですが、それはまた明日。以下のように見えました。カメラの位置設定大事。
EVENTS