🗒️

Snapdragon Spaces の Dual Render Fusion v0.14.0について

2023/06/10に公開

スマホ接続型ARグラスの特徴を活用できる機能

Snapdragon Spacesのアドオン機能としてDual Render Fusionという機能が提供されました。
この機能はThink Reality A3のような ARグラスをスマホに接続するハード構成 のデバイスで活用できる ** モバイル画面と接続された拡張現実デバイスの両方に同時に映像出力 ** が可能になります。そしてモバイル画面でのタッチスクリーン入力もサポートするというもの。

サンプルの動かし方

では早速使ってみたい方のためにサンプルを動かしてみましょう。幸いなことにすでにSnapdragon Spaces SDKのダウンロードコーナーにはこのアドオンライブラリが追加されています。

開発環境

  • Snapdragon Spaces v0.13.0 (SnapdragonSpaces SDK本体)

  • Snapdragon Spaces Dual Render Fusion (Experimental) v.0.14.0

  • Unity Hub 3.4.2

  • Unity 2021.3.16f1

    • Android Build Support一式
    • packages
      • OpenXR Plugin
      • Input System
      • XR Management
      • XR Interaction Toolkit

Snapdragon Spaces for Unityの導入

Snapdragon Spaces for Unityはサイトからダウンロード可能です。
https://spaces.qualcomm.com/sdk/

今回はSDK本体と今回追加された Dual Render Fusionのアドオンをダウンロードします。

Snapdragon Spaces SDK本体

ダウンロードサイトへ行くとUnity向けとUnreal向けがダウンロードできます。Unity用のものをダウンロードしてください。


ダウンロードしたファイルはサンプル含めたZipファイルになっています。まずはこのzipファイルを展開します。

D:.
│  Controller_Android_Project0_13_0.zip
│  NOTICE.txt
│  README.txt
│  SnapdragonSpacesServices_0_13_0.apk
│
└─Unity Package
    │  .DS_Store
    │  com.qualcomm.qcht.unity.interactions-4.0.0-pre.11.tgz
    │  SnapdragonSpaces_Package_0_13_0.tgz
    │  SnapdragonSpaces_Unity_Samples_0_13_0.apk
    │
    └─package
      ...

次にエクスプローラー等で[空のUnityプロジェクトフォルダ]\Packagesを開きます。新規フォルダとして[SnapdragonSpaces]を作成しこの中に以下のファイルを格納します。

  • SnapdragonSpaces_Package_0_13_0.tgz

Snapdragon Spaces Fusion Package

先ほどと同じダウンロード先からDual Render Fusion for Unity(Experimental)をダウンロードします。


ダウンロードしたファイルはサンプル含めたZipファイルになっています。こちらも先ほどと同じようにzipファイルを展開します。

D:.
│- com.qualcomm.snapdragon.spaces.fusion_0_14_0.tgz
   NOTICE.txt
   README.txt

SDK本体と同じように次にエクスプローラー等で[空のUnityプロジェクトフォルダ]\Packages[SnapdragonSpaces]の中に以下のファイルを格納します。

  • com.qualcomm.snapdragon.spaces.fusion_0_14_0.tgz

これらのパッケージは後程Unity Editorからプロジェクトへインポートします。

Unityプロジェクト作成~パッケージ導入

Unity Hubを起動し、新しいプロジェクトを作成します。

設定値は以下の通りです。バージョンの設定に注意してください。

  • Editor Version : 2021.3.16f1
  • template : 3D
  • Project name : 任意
  • Location : 任意

空プロジェクトの作成が完了しUnity Editorが立ち上がったら一度終了します。
次に各パッケージを導入します。

パッケージのインポートとサンプルの取込み

次に、今回のサンプルに必要なパッケージやサンプルコードのインポートを行います。

Snapdragon Spaces for Unityのインポート

インポートは[Window]-[Package Manager]を選択しPackage Managerウィンドウを開きます。左上の[+]ボタンを押して、[Add package from taball...]を選択し[空のUnityプロジェクトフォルダ]\Packages\SnapdragonSpaces内に先ほどコピーした2つのパッケージをインポートします。

インポート後は一度Editorを再起動します。

TextMesh Proのインポート

次にTextMesh Proのリソースをインポートします。サンプルの一部はTextMesh Proを利用しているためインポートが必要です。

なお、インポートせずに使うとTextMesh Proを利用する段階で以下のようなダイアログが表示されてインポートを即されます。どちらにせよ必ず必要なのでインポートを忘れずに。

OpenXRの設定

[Edit]-[Project Settings]を開き[XR Plug-in Management]を選択します。タブがAndoroidになっていることを確認の上OpenXRを有効化します。サブ項目として[Snapdragon Spaces feature group]が追加されるのでここにもチェックをします。この際設定に問題があればエラーや警告が出ます(例えば、OpenXRはARM64にしか対応していないため、ビルド時の設定でArm64を対象にビルドする必要があるなど)
修正については[Edit]-[Project Settings]を開き[XR Plug-in Management]-[Project Validation]の項目を選択し[Fix ALL]を何度か押すことである程度自動的に問題を解消してくれます。ただし、画像のように3つほどは警告が残るはずですが、無視しても問題ありません。

ビルド設定

後は実機にデプロイするためのAPKを作る準備です。
今回サンプルには合計で5つのシーンが含まれています。
それぞれビルドすることで簡単な動作検証が行えるようになっています。
CubeManipulationだけは、それ単体でビルドする必要があります。

それ以外の4つのシーン[ControllerPrefabSampleScene], [LandscapeUISampleScene], [OpenXRLoadingTest], [PortraitUISampleScene]はメニューで移動できるようになっているので ** 最初に起動しておきたいシーンを一番上 ** にしてサンプルのシーンをすべて追加しておきます。こうすることでメニューから選択すればそれぞれの機能を試すことができます。

サンプルのそれぞれの動作

Dual Render Fusionのサンプルに含まれる各シーンは以下のようなものがあります。

CubeManipulation

ControllerPrefabを利用してSnapdragon Spaces ControllerでCubeを操作するサンプルです。
Snapdragon Spaces Controllerのタッチパッドを操作することで、スマホ、ARグラス両方で表示されているCubeを動かせます。

  • 1本指でドラッグ操作 -> Cubeが移動(UnityのX軸,Z軸)
  • 2本指でドラッグ操作 -> Cubeが回転
  • 3本指でドラッグ操作 -> Cubeが移動(UnityのY軸)

https://youtu.be/r1ucCwD_fC8

ControllerPrefabSampleScene

UnityのPrefabとして設計されたSnapdragon Spaces Controllerを使ったサンプルです。スマホをコントローラにしてRayによってCubeをの移動を行えます。Snapdragon Spaces Controllerは3Dofになっており空間の位置はARグラスの座標系に同期しています(頭のPositionに合わせて動く)。Dual Render Fusionを使わない場合はネイティブ実装されたコントローラをスマホに表示していました。

https://youtu.be/qz_dab_jpo0

LandscapeUISampleScene

スマホを横向き状態で使うUIサンプルです。CanvasUIで作成されたいくつかのUI操作を行う事でARグラスで見えているCubeを操作できます。行える操作は「Cubeの回転」, 「Cubeの表示/非表示」, 「Cubeの色変更」が可能です。

https://youtu.be/4pZTRRZiU94

PortraitUISampleScene

スマホを縦向き状態で使うUIサンプルです。CanvasUIで作成されたいくつかのUI操作を行う事でARグラスで見えているCubeを操作できます。行える操作はLandscapeUIと同様に「Cubeの回転」, 「Cubeの表示/非表示」, 「Cubeの色変更」が可能です。
また、ARグラス側で見えている映像が同期してテクスチャーも描画されています。

https://youtu.be/T6p4B8Z1CGw

OpenXRLoadingTest

OpenXRの動的ローディングのサンプルです。こちらもLandscapeUI,PortraitUIのサンプルと同じようにスマホでUI操作を行うことができ、「Cubeの色変更」も行うことができます。
とても興味深いのは、OpenXRの動的に有効/無効化のところです。

  • OpenXRを無効化するとARグラス上のコンテンツ描画が終了する。
  • OpenXRを有効にするとARグラス上でコンテンツが表示される。

例えば、基本的な操作はスマホで行いながら詳細を見るために立体視したいときのみARグラスを使って空間に3D表示するといった操作が可能になります。
ARグラス向けのアプリを作りながら工夫次第でARグラスがなくてもスマホアプリとして使えるコンテンツを開発することも可能だと思います。

https://youtu.be/17hsV0SJbb0

簡単な仕組み(現時点)

内部の詳細な部分は別途調査しているのですが、このDual Render Fusionが行っている簡単な仕組みは現在は以下のようになっているようです。
仕組みとしては非常にシンプルで、Dual Render Fusionは2つのカメラを利用して実現しています。

  • Think Reality A3のようなARグラスに映像を投影するカメラオブジェクト(Target 2)
  • スマホ画面に映像を投影するカメラオブジェクト(Target 1)

Unityではあるカメラオブジェクトに投影するディスプレイの設定(Camera.TargetDisplay)があります。Snapdragon SpacesのDual Render Fusionはこの機能を利用してARグラス,スマホそれぞれの描画に使うカメラを使い分けるようになっています。
このような仕組みのため、ARグラスではないデバイス(例えばVRXなどのヘッドセット型)の場合は、投影するディスプレイを調整することでARグラウトヘッドセット両対応といったことも可能だと思います。

今回のサンプルの中にあるPortraitUIのようなスマホ側にUIを出しているものはCanvasの描画ターゲットをスマホ側のカメラで指定することでスマホのみに表示させています。全体のCubeについては描画対象を絞っていないので、スマホ/ARグラス両方で表示されています。

まとめ

Dual Render Fusionはスマホ接続が必要なARグラスなどで「スマホもUIに活用できる」仕組みです。今までは首から下げてコンテンツ描画の演算位しかすることがなかったスマホをARコンテンツの拡張コントローラやサブディスプレイといった形で活用しスマホ接続型のARグラスにおける新しいUXを生み出せる面白い仕組みだと思います。

この仕組みを実装でどのように行っているかは引き続き解説したいと思います。

参考リンク

Discussion