memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Unity6でパススルーAPIを使って映像の一部を取得するまでの手順

以下のように共同研究者として学生を支援するため実現可能性(Quest3のパススルー映像をどうにかする)を探ってきました。

Metaアプリ開発は辛い - memorandums

とりあえずこれだとうまくいく(少なくとも僕の環境では)ことがわかったので手順を残しておきます。触らなくなったら一週間もしないうちに忘れるので。

マシンはMacbookPro M4(15.6)です。Unityは6000.0.52f1です。

Unityを起動してプロジェクト名を適当に入力します。プロジェクトテンプレートは3D(Built-In Render Pipline)を選択します。URPでもいけるのかもですが。。。わかりません。

UnityのBuild ProfilesでAndroidに切り替え、Texture CompressionをASTCにします。

Package Managerを開いて、Meta XR Core SDKをInstallします。EditorをRestartしろって言われるのでRestartを選択します。

Project Settingsを開いて、XR Plugin Managementを選択し、Install XR Plugin Managementボタンを押します。

OpenXRを選択します。すると以下のダイアログが表示されるのでYesを選択します。ちなみにWindowsではこの画面が出ないんですよ。。。なのでHMDを傾けてもセンサーの値が反映されなかったりしたんじゃないかと疑っています。Mac版ではこれが出ます。なぜだろう?ちなみにこの操作によってXR Plugin Managementの中のOpenXRの下のMeta XR feature groupのチェックが入ります。たぶんここが重要なんだろうな。。。内部的にどういう効果があるのかわかりませんが。

ここまで来るまで、Meta XR Toolボタンを押してFixやApplyをひたすら押してワーニングやエラーをなくしておきます。 何か操作するたびにワーニングやエラーが出るはずなので、神経質にならない程度にFixやApplyを押してエラーを解消しておきましょう。以下ではこの操作は書きませんので。たぶん状況によって表示される内容も個数も異なると思いますので。

ここまでで基本設定は終了です。Macではそのままでは動きませんが再生ボタンを押してエラーなくビルドっぽい動作が完了することを確認しておきましょう。

続いてBuilding Blockです。これ便利ですね。というかこれがないとたぶん開発は無理じゃないかなぁ。。。Camera RigとPassturoughをプラスボタンを押して追加してください。

次に以下のサンプルをダウンロードします。画面中の緑色のCodeと書かれたボタンを押してZIPファイルをダウンロードします。git cloneしてもいいですがファイルが欲しいだけなのでZIPファイルでもいいですね。

github.com

圧縮ファイルを展開します(git cloneしても同じですね)。フォルダ内にある、CameraViewerとPassthroughCameraの2つのフォルダをAssets以下にドラッグ&ドロップします。

そして、Unity Editor上でコピーしたフォルダを開いて以下のようにPrefabをドラッグ&ドロップします。

まず、WebCamTextureManagerPrefabをHierarchyのトップにドラッグ&ドロップします。

次に、CameraViewerManagerPrefabをCameraRig - TrackingSpace - CenterEyeAnchorにドラッグ&ドロップします。

ここまででUnityのHierarchyは以下のようになります。

CameraRigのCameraViewerManagerPrefabを選択し、インスペクタのPos Zの100を1.2に打ち替えます(これはサンプルと同じでパススルー映像を切り出した画像を投影する面をCameraRigの近くに持ってきているという操作になります)。

続いて、同じくCameraRigのCameraViewerManagerPrefabのインスペクターについて下図のように2個所にドラッグ&ドロップします。

設定後は以下のようになります。

これでおしまいと言いたいところですが、パススルーに対するアクセスの権限設定があります。

とりあえずここまででビルドしてQuest3に転送してみましょう。すると以下のエラーが出ます。これもWindowsではでなかったんだよな。。。たぶん。いや、「Meta Linkでは」だと思います。Windowsでもちゃんとビルドしていれば出たかもしれません。いまWindowsマシンが手元にないので確かめられませんが。

パススルーAPIを使いたいんやったらパススルー機能をEnableにしないとダメやねん。。。って仰っています。どうやればいいのかわかりませんが。。。このメッセージだけでは。

とりあえず、以下の2ステップを操作してみます。これも正解なのかわかりません。経験則です。

まず、CameraRigを選択するとインスペクターに以下のような項目があるはずです。ここに画像のようにPassthroughがSupportedとなっていますが、これをRequiredに変更します。

次に、UnityのメニューからMeta - Tools - Update AndroidManifest.xml を選択して実行します。

すると、Assetsフォルダ内のPlugin/Android/AndroidManifest.xml内に新たに「<uses-feature android:name="com.oculus.feature.PASSTHROUGH" android:required="true" />」が追加されているはずです。操作前後を見てみないと増えたかどうかはわからないでしょうけど、とりあえず操作したあとにAndroidManifest.xmlを見てもらえばいいかと思います。

ちなみにここまでの操作でApplyが1件だけ残ります。Applyボタンを押しても消えないので放置です。特に問題はいようです。

さあ、ビルド&実行してみましょう。

ビルド開始前に以下のダイアログが表示されます。いい感じですね。パススルーの変更がちゃんと伝わっていることを実感できます。

さて、うまくいけば以下のようになります。

youtube.com

ちなみに、アプリを起動した直後に以下の2つのダイアログが表示されます。アプリに対する許可が求められますので許可します。これらが録画されないのでQuestのレンズ越しにスマホで撮影しました。

ちなみにですね。。。権限を許可しても直後は反映されないようでPermission Grantedにはなるけど映像がでません(白い四角形だけが表示されます)。

Quest3のメニューからアプリを探してアプリを起動すると今度は映像が見れます。この辺はすぐに権限を反映できるように設定してないからじゃないかなと思います。

やっとです。1週間もかかりました(自分のコストを考えると恐ろしいですが。。。考えないことにします)。こんなサンプルを動かすだけで。でも、何となく仕組みがわかりました。あとはコードを読んで、あと以下のコードを参考にしながら画像データを編集するコードを書いていけば作れそうな気がします。

StreamDiffusionとQuest3で視界をリアルタイム変換してみる

ちかれた。。。1つ教訓。WindowsのMeta Linkはとても便利。これは間違いない。でも、動作が不安定。特にパスルルーを使うときには(フレームシンセシスさんも書いていて)。なので、多少時間はかかるけど確実に動作することを考えると毎回ビルドすべきかと思った。ビルドしている間、別のことしていればいいと思う。動いたり動かなかったりするストレスはヤバいものがある。

■2025/8/10 追記

Windowsで試してみた。SampleをUnity Projectに投入する前、つまり、普通にUnityプロジェクト作ってXRセッティングをしてからBuilding BlockでCameraRigとPassthroughをいれた状態でまずQuest2に転送してみた。あ、ちなみにMeta XR feature のワーニングはでなかったので手動でチェックをいれた。これでビルドするとちゃんとパススルー表示された。想定内。そのあと、Meta Linkアプリ(もちろんLinkアプリのベータのパススルーをLinkで使うチェックは入れて)を起動してQuest2の方もLink接続(有線)したものの、Quest2では真っ暗だった。。。あーあ。また始まった。もしかしてと思い、CameraRigのPassthroughをSupportedからRequiredに変えてAndroidManifest.xmlをアップデートしたもののLink実行ではQuest2の画面は真っ暗だった。

その後、とりあえずビルドして見れるか確認しようとするとやっと許可するか?というダイアログができきた。おっということはLink接続であっても権限周りが変更されるときにはビルドを一回やって許可しないとだめなのかな?と思って。とりあえずビルド&転送してパススルーが見えることを確認したあと、再度、Link接続でQuest2を見るとあいかわらず真っ暗。。。想定外。こういうのが本当にストレスフル。。。しかもWindowsマシンは遅くはないはずだけどビルドがM4より遅い。なんだろう?SSDが遅いのか?ビルドして開発するならもうMacでもいいな、という感じ。ビルド待ちはあるけど確実に前進する方が嬉しい。

とりあえず雨がひどくなる前に帰るので今日はここまで。