未来を創る、テックコミュニティー

代表技術通信~Unityで点群表示、Oculus Questで表示①

草場代表
2020/09/17

こんばんは。代表の草場です。

今後しばらくは技術的な記事を書こうと思います。書き方がなっていない、と高橋さんに怒られそうですが、つらつらと書きます。

LiDARでいくつかの場所を撮影して点群を集めてきました。本当は最近はやりのUnreal Engineで表示したいのですが、よくわからないため、いったんはUnityを使います。諸々初めてなので、こちらの「静岡県の点群データをUnityで表示してOculus Questで見る」をほとんどそのまま実行させていただきました。
手順が詳しく記載されています。私の場合、初めてUnityガッツリ触るのでわからず、さらに細かく記載します。

本当はキャプチャ写真も載せたいのですが、画像が大量になるので、一部のみ。動画にまとめます(いつか)。

環境と使用ソフト

OS:Windows10 Pro
Unity:2019.4.10f1
点群データ処理:MeshLabCloudCompare

①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つなぐ設定が必要ですが、それはまた明日。以下のように見えました。カメラの位置設定大事。


 

 

この記事を書いた人
草場代表
エディター