Closed25

Snapdragon Spaces SDKを読んだり、OpenXRやARFoundationについて学ぶ会

にー兄さんにー兄さん

当然UPMによる依存関係の解決はされないので
必要な依存パッケージは自分で読み込むしかない

  • input system
  • ARFoundation
  • OpenXR plugin

XRIはパッケージ名指定で入れる必要があるらしい
https://docs.unity3d.com/Packages/com.unity.xr.interaction.toolkit@2.3/manual/installation.html#version-20213

にー兄さんにー兄さん

本当はそれぞれのpackage.json見ながらバージョン合わせたほうが良さそうですが
今回はザクザクとやっていきます

にー兄さんにー兄さん

環境は

  • Windows 10 Home
  • Unity 2021.3.4

なぜか必要パッケージをインポートしてもエラーが出る

SpacesのUntyバージョンが2021.3.16推奨なのと
XRIのインポート方法が2021.3.9以降で違うらしいので
Unityのバージョンがいけないのかもしれない

にー兄さんにー兄さん

↑雑だけど、インストールしてあった2022.3.2f1にアプデしたらUnityエディタで出てくるエラーにつては解消した

にー兄さんにー兄さん

やはり念のため……ということで
2021.3.16f1をインストしてそこで検証することに

にー兄さんにー兄さん

2021.3.16で、SpacesSDKをtgz解凍してAssets以下に設置し、

  • Input System
  • ARFoundation
  • OpenXR Plugin
  • XRI

をインポート。
manifest.jsonの中身はこれ

manifest.json
{
  "dependencies": {
    "com.unity.collab-proxy": "1.17.7",
    "com.unity.feature.development": "1.0.1",
    "com.unity.ide.rider": "3.0.24",
    "com.unity.ide.visualstudio": "2.0.18",
    "com.unity.ide.vscode": "1.2.5",
    "com.unity.textmeshpro": "3.0.6",
    "com.unity.ugui": "1.0.0",
    "com.unity.modules.ai": "1.0.0",
    "com.unity.modules.androidjni": "1.0.0",
    "com.unity.modules.animation": "1.0.0",
    "com.unity.modules.assetbundle": "1.0.0",
    "com.unity.modules.imageconversion": "1.0.0",
    "com.unity.modules.imgui": "1.0.0",
    "com.unity.modules.jsonserialize": "1.0.0",
    "com.unity.modules.physics": "1.0.0",
    "com.unity.modules.screencapture": "1.0.0",
    "com.unity.modules.tilemap": "1.0.0",
    "com.unity.modules.ui": "1.0.0",
    "com.unity.modules.umbra": "1.0.0",
    "com.unity.modules.unitywebrequest": "1.0.0",
    "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
    "com.unity.modules.unitywebrequestaudio": "1.0.0",
    "com.unity.modules.unitywebrequesttexture": "1.0.0",
    "com.unity.modules.unitywebrequestwww": "1.0.0",
    "com.unity.modules.vr": "1.0.0",
    "com.unity.modules.xr": "1.0.0",
    "com.unity.xr.openxr": "1.6.0",
    "com.unity.xr.arfoundation": "4.2.7",
    "com.unity.inputsystem": "1.0.2",
    "com.unity.xr.interaction.toolkit": "2.3.0",
    "com.unity.xr.management": "2.3.0-pre.1"
  }
}
にー兄さんにー兄さん

ARFoundationなのか、OpenXRPluginsなのかわからないけど
subsystem, providor, featureなどという概念を整理したいね

にー兄さんにー兄さん

それぞれの機能については、同じような構成になってるっぽい

  • Feature
  • (Feature.Delegates)
  • Subsystem

にー兄さんにー兄さん

SubsystemのインナークラスとしてProvidorがで定義してあって
SubsystemはProvidorのメソッドを呼んでいるみたいな構成になっている
またsubsystemにuderlyningFeatureがあってそれも使う

subsystemはXRXxxSubsystemを継承し、ProvidorはXRXxxxSubsystemのインナークラスであるProvidorを継承している
Featureは(SpacesOpenXRFeatureを経由して)OpenXRFeatureを実装

にー兄さんにー兄さん

ちなみにARFoundationのSubsystem一覧はこちら
ARF5のページにあったので注意

にー兄さんにー兄さん

Subsystemの説明和訳

AR Foundationはサブシステムで構築されている。サブシステムは、さまざまなタイプの情報を表示するための、プラットフォームにとらわれないインターフェイスです。AR関連のサブシステムはAR Subsystemsパッケージで定義され、名前空間UnityEngine.XR.ARSubsystemsを使用します。AR Subsystems パッケージの型と対話する必要がある場合があります。

各サブシステムは特定の機能を処理します。たとえば、XRPlaneSubsystem はプレーン検出インターフェイスを提供します。

Providorの説明和訳

プロバイダはサブシステムの具体的な実装です。例えば、ARCore XR Plugin パッケージには、多くの AR サブシステムの ARCore 実装が含まれています。

プロバイダによって特定の機能のサポートが異なるため、各サブシステムには、どの特定のサブシステムの機能をサポートするかを示す記述子もあります。例えば、XRPlaneSubsystemDescriptor には、水平面検出と垂直面検出のどちらをサポートしているかを示すプロパティが含まれています。

各サブシステムの実装方法は、個々のプロバイダが決定します。一般的には、そのプラットフォームのネイティブSDK(例えば、iOSのARKitやAndroidのARCore)をラップします。

にー兄さんにー兄さん

Spacesの機能の実態は、OpenXRFeatureの実装になっており
FeatureをProvidorが使って機能を提供していて、
SubsystemがProvidorの機能を使って機能を提供している
という階層構造になっていそう

にー兄さんにー兄さん

Spacesの中に入っているHandTracking系の機能は全部Obsoleteになっていて
代わりにQCHT内に実装がありそう

HandTrackingのSubsystemはもともとARFoundation(ARSubsystem)にはないが
SubsystemWithPreovidorを継承してカスタムで作られて入るっぽさ

にー兄さんにー兄さん

結局SpacesSDKの機能の実態って何なんですかー!っていうのは分からんな

Spaces対応デバイスがどこかでネイティブのAPIを提供していて、
おそらくそれがネイティブプラグインになっていて
そのDLLをOpenXRFeatureが参照しているっぽいと推測しているけど

xr architectureみたいな図作りたいね

img

にー兄さんにー兄さん

ここのページのDeepL和訳してみる

Unityは、プラグインフレームワークと一連の機能とツールパッケージを通じてXR開発をサポートしています。プロジェクト設定のXRプラグイン管理カテゴリに移動して、UnityプロジェクトでXRサポートを有効にし、プロジェクトがサポートするXRプラットフォーム用のプラグインを選択します。Unity Package Manager を使用して、追加機能パッケージをインストールします。

次の図は、現在のUnity XRプラグインフレームワークの構造と、プラットフォームプロバイダーの実装との連携方法を示しています:

ig

XR サブシステムは、XR 機能の共通インターフェースを定義します。XR プラグインは、実行時にサブシステムにデータを提供するために、これらのサブシステムインターフェイスを実装します。XR アプリケーションは、Unity Engine およびパッケージ API を使用して XR 機能のデータにアクセスできます。

XR providor plug-in framework

XRプロバイダプラグインは、1つまたは複数のXRデバイスプラットフォームをサポートするUnityプラグインです。例えば、ARCoreプラグインはハンドヘルドAndroidデバイスのAndroid ARプラットフォームをサポートし、OpenXRプラグインは複数のオペレーティングシステムの複数のXRデバイスをサポートします。

XRプロバイダプラグインは、Unity XR SDKによって定義されたインターフェースを実装します。これらのインターフェースはサブシステムと呼ばれます。1 つ以上のサブシステムを実装するプラグインをプロバイダプラグインと呼びます。通常、プロバイダプラグインは、デバイスプラットフォームのネイティブライブラリを使用して、デバイス用のUnityインターフェースを実装します。

Unityは、サブシステムインターフェースを使用してさまざまなプラットフォームのプロバイダーと通信し、アプリケーションのXR機能を強化します。これらのインターフェースのおかげで、その機能のプロバイダを持つすべてのXRデバイスで、アプリケーション内の同じ機能コードを再利用できます。

Subsystems

XR サブシステムを使用すると、Unity アプリで XR 機能にアクセスできます。Unity XR SDKは、サブシステム用の共通インターフェイスを定義しているため、機能を実装するすべてのプロバイダプラグインは、一般的にアプリで同じように動作します。多くの場合、プラットフォームがほぼ類似している限り、アクティブなプロバイダを変更し、異なるXRプラットフォーム上で実行するためにアプリを再構築することができます。

Unityエンジンは、基本的なXRサブシステムのセットを定義します。Unityパッケージは追加のサブシステムを提供できます。たとえば、AR Subsystems パッケージには、AR 固有のサブシステム インターフェイスの多くが含まれています。

このスクラップは2023/07/16にクローズされました