manahiyoの気まぐれ

備忘録を兼ねたブログです。

電波可視化とQUEST3のROOM-MESHを組み合わせてみた

はじめに

前回のROOM-MESHと電波可視化のRadioFieldMRを組み合わせてみました。さらに3Dモデル(glTF形式)としてファイル出力して、BlenderVR表示もしてみました。個人的にはファイル出力により結果の確認や加工が測定後にPCで出来るようになったというところは応用が広がそうな気がしています。

なお3D系は初心者なもので、試行錯誤しながらやっているため、用語をはじめ説明や解釈が正しくないかもしれません。何かあればご指摘ください。

表示結果だけ先に示しておきます。

アプリ上で壁と床を表示したところ

Blenderで取り込んで表示したところ

ROOM-MESHを組み合わせてみる

Quest3かどうかを判別する

ROOM-MESHはすでに前回の記事で出来ています。

QUEST3で部屋をスキャンして表示してみた - manahiyoの気まぐれ

 

これをRadioFieldMRに入れてみました。ただ、この機能はQuest3だけなので、はじめにQuest3かどうかを確認して、ボタンのEnable制御をしました。

こちらのマニュアルでヘッドセットの種類による戻り値がわかります。

docs.unity3d.com

Plane-MESHとVOLUME-MESHの両方を使えるようにする

アプリでも2種類を使えるようにしておきたかったのですが、この切替処理に手がかかりました。単にオブジェクトをDisableしてもMESHが残ってしまうので、それを削除する必要があります。またSDKはV59からpackage化されているので、コードを直接変更することができません。

あまりいいやり方ではないかもしれませんが、実際にエディタで実行してみて、デバッグ時に作成されているオブジェクトを確認し、プログラムからはその名前を検索して削除するようにしました。こんなコードはChatGPTに頼めば一発で作成してくれます。

取り急ぎ下記のようなボタンでそれぞれを選択して表示できるようにしました。

左がPlane-MESHで右がVOLUME-MESHです。

信号強度表示のSphereも一緒にコピーする

前回のコードでは壁や床、そのほかのスキャンしたメッシュが表示できますが、可視化のためのSphereが表示されません。こちらも一緒にコピーするようにコードを追加しました。以前より可視化のためのSphereにはTAGを設定していますので、このTAGを使ってオブジェクトを検索してコピーすればよいだけです。

なおコピーの際にコピーしたものはTAGを削除する必要があります。そうしないと実行するたびにコピーが作成され、増殖状態になります。

追加前

追加後

こちらが実際にFMトランスミッタの電波強度を測定した結果です。壁と床だけのPlaneMeshです。オレンジの部分にFMトランスミッタが置いてあります。

3Dファイル出力したい

現在のアプリは、xyz座標とRSSIなどを数値データとして保存はできるものの、あとからどうやって3Dの測定結果を表示するかが問題です。そこで、ROOM-MESHと一緒に3D出力できないかとのアイデアから挑戦してみました。

いろいろ失敗

正直苦労しました。3D形式はいろいろありますし、そもそも3D系の知識がないので何をどうやったらよいのかさっぱりわかりません。

下記のような便利そうなものもいくつかあったのですが、UNITYのエディタから出力するもので、アプリの実行時には使えないようです。

docs.unity3d.com

github.com

ほかにもいろいろ試してみましたが、どれもエディタでの動作ばかりでした。

UniGLTFを試してみた

やっと実現出来そうなものが見つかったのが、下記です。

github.com

こちらにサンプルコードがあり、簡単に動作できました。

github.com

なお、GLTFについてはこちらを参考にしました。glTFはBlenderでインポートできるのがいいですね。

www.pentacreation.com

docs.blender.org

テストプログラムを作って、出力結果をBlenderで表示したら、下記のように、各オブジェクトを表示できました。素晴らしい。

喜んだのもつかの間…

実際にRadioFieldMRに組み込んでみたところ、オブジェクトは存在しているものの表示がされていないという問題がありました。Blenderで各オブジェクトを調べていったところ、どうもマテリアルがすべて同一になってしまいました。オープンソースなのでコードも追えるものの、何をやっているかさっぱりわかりません。

UniVRMでアップデートしてみる

あきらめかけていたのですが、後日再度Gitを見直したところ、UniVRMに統合していると書いてあるのに気が付きました。もしかしたら新しいバージョンなら改善されているかもしれないと思い、UniVRMで試してみました。

github.com

こちらにはサンプルコードが見当たらなかったのですが、先ほどの古いバージョンのコードをベースに修正したところ、動作しました。

動作させたところ、先ほどの問題は改善されていました。あきらめかけていたところだったので喜びもひとしおです。Blenderでimportしたところいい感じで表示できました。

Blenderで3D表示させてみた

Blenderでは以前にも記事にした通り、OculusLinkでVR上での表示機能が付いています。

下記blogの最後にやり方を示してます。

manahiyo.hatenablog.com

アドオンにチェックを入れればメニューのこちらからglTFファイルをインポートできます。

いつもVRセッションをスタートする場所を忘れてしまうので、スクリーンショットも残しておきます。

自分で言うのもなんですが、見ていて楽しいです。下記にスクリーンショットを示しますが、コントローラで自由に移動したり、拡大縮小ができます。このファイルを共有すれば結果の共有や分析などが便利になるのではと想像します。

まずは全体

部屋を拡大。右上にエアコンが見えます。

こちらが試しに測定した部屋。メッシュが見れるので、位置関係がわかりやすいです。

さらに拡大、VR内でほぼ実物サイズです。

こんな感じで、自由に動き回れますので、あとから測定結果をあらゆる方向から見て分析することができそうです。

FOG表示も挑戦してみたものの…

こちらは難しそうです。オブジェクトはありましたが、中身が空です。FOG表示はパーティクルで実装しているため動的でありMESHへの変換が必要みたいです。実現可能か方法を探しているところです。

最後に

glTFファイルに出力することで、様々なアプリで見たり、クラウドでの共有などができそうです。Blenderで編集ができるので、複数の測定を合成したり、2Dの断面図とか作れないかなぁなどと想像しています。また別の機会にやってみたいところです。

あと時々データが保存されていなかったりバグもあるので修正が必要そうです。