ターゲットを追跡するサブスペースを追加する

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
XR ヘッドセット
有線 XR グラス

標準の Subspace は、システムによって決定される固定位置に留まりますが、アプリの空間 UI をユーザーとともに動的に移動させたり、環境内または現実世界の特定の場所に固定したりしたい場合があります。FollowTarget を Subspace の follow パラメータに渡して、ヘッドロックされた HUD や現実世界のオブジェクトにアタッチされた情報パネルなどのエクスペリエンスを構築できます。

ユーザーのビューに追従するサブスペースを追加する

ユーザーの画角を基準に配置されたサブスペースを追加するには、FollowTarget.view を使用します。指定したフォローモードに応じて、ユーザーの頭の動きを継続的に追跡したり、ユーザーが見ている場所に基づいてコンテンツを静的に配置したりできます。これは、HUD、永続的な通知、クイック操作コントロールなどに使用できます。

権限を宣言してリクエストする

権限をリクエストする前に、<uses-permission> 要素を使用してアプリのマニフェスト ファイルで権限を宣言する必要があります。

<manifest ...>
    <!-- Only declare permissions that your app actually needs. In this example,
    we declare permissions for head tracking. -->
    <uses-permission android:name="android.permission.HEAD_TRACKING"/>
    <application ...>
        ...
    </application>
</manifest>

次に、権限をリクエストします。詳しくは、権限の原則とワークフローを確認して、優れたユーザー エクスペリエンスを実現してください。たとえば、アプリが必要とする実行時の権限をユーザーがすでに付与しているかどうかを確認したり、この権限をリクエストする前にアプリがユーザーに根拠を示す必要があるかどうかを確認したりします。

セッションを構成する

次に、DeviceTrackingMode.SPATIAL を設定して、Jetpack Compose for XR の使用時に作成されるアプリのセッションを構成します。

val session = checkNotNull(LocalSession.current)
session.configure(
    config = Config.Builder(session.config).setDeviceTracking(DeviceTrackingMode.SPATIAL)
        .build()
)

サブスペースを作成する

最後に、ユーザーのビューをターゲットとするサブスペースを、追従モードとともに作成します。

// Example: A subspace that softly follows the user's view (like a HUD)
Subspace(
    follow = FollowTarget.view(
        // Customizing the soft follow to move slightly faster and tracking all dimensions
        mode = FollowMode.soft(
        )
    ),
    modifier = modifier,
) {
    SpatialPanel {
      // SpatialPanel Content
    }
}

ユーザーのビューをターゲットとするサブスペースのフォローモード

FollowTarget.view をターゲットとして使用する場合は、FollowMode を指定してコンテンツの動作をカスタマイズできます。

  • FollowMode.soft: コンテンツがターゲットの動きに徐々に追いつき、スムーズなフローティング効果が生まれます。
  • FollowMode.snap: コンテンツは、ユーザーの初期ビューポーズに基づいてユーザーの前に一度配置され、その後は静止したままになります。
  • FollowMode.tight: コンテンツは、遅延を最小限に抑えてユーザーの視点をすぐに追跡し、コンテンツをユーザーの動きに密接に連動させます。

すべての追従モードで、次のオプションから追跡する動きのディメンションを選択できます。

  • X 軸
  • Y 軸
  • 提案
  • ロール
  • ヨー
  • RotationOnly: 回転に関連するディメンション(ピッチ、ヨー、ロール)を追跡する単一の値を指定できます。

これらのディメンションを任意に組み合わせて選択することも、すべてを追跡するデフォルト値の TrackedDimensions.All を使用することもできます。

環境特徴に沿ったサブスペースを追加する

ユーザーの環境内の物理的な特徴に空間コンテンツを厳密にロックするサブスペースを追加するには、FollowTarget.anchor() を使用します。このタイプのターゲットは、検出された平面、アンカー、地理空間位置を追跡するために使用します。

現実世界の対象物をトラッキングするには、トラッキングする対象物に応じて追加の権限とセッション構成が必要です。

ARCore 機能の認識機能の操作、必要な権限の設定、FollowTarget.anchor() を使用するためのセッションの構成の詳細については、平面、アンカー、地理空間ポーズに関する Jetpack XR SDK のドキュメントをご覧ください。

次の例では、現実世界のアンカーに追従するサブスペースを作成します。

// A subspace locked to a real-world anchor
Subspace(
    follow = FollowTarget.anchor(anchor = myAnchor)
) {
    // Rotate the panel to ensure it faces the user while remaining anchored
    SpatialPanel(SubspaceModifier.rotateToLookAtUser()) {
      // SpatialPanel Content
    }
}

空間的な重複を避ける

作成した各 Subspace は、独自の独立した 3D シーンを管理し、存在する他のサブスペースを認識しないため、衝突を自動的に回避することはありません。

ヘッドロックされた HUD が、アンカーされた POI パネルをクリッピングしないようにする(Z ファイティング)には、次の方法を使用してレイアウト ボリュームを明示的に管理します。

  1. オフセットを使用する: SubspaceModifier.offset を使用して、周辺 UI(HUD など)を Z 軸上で近づけたり遠ざけたり、ユーザーの視界の端に移動したりします。
  2. サイズを制限する: requiredSizeIn などの修飾子を適用して、スペースの境界ボックスを制限します。

座標空間、レイアウト制約、使用可能なすべてのトラッキング構成の詳細については、Subspace のリファレンス ドキュメントをご覧ください。