新增追蹤目標的子空間

適用的 XR 裝置
本指南可協助您為這類 XR 裝置打造體驗。
XR 頭戴式裝置
有線 XR 眼鏡

標準 Subspace 會固定在系統決定的位置,但有時您可能希望應用程式的空間 UI 能隨著使用者動態移動,或固定在環境或現實世界中的特定位置。您可以將 FollowTarget 傳遞至 Subspace 的 follow 參數,建構頭部鎖定 HUD 或附加至真實世界物件的資訊面板等體驗。

新增會跟隨使用者視角的子空間

如要新增相對於使用者視野位置的子空間,請使用 FollowTarget.view。視您指定的跟隨模式而定,這項功能可持續追蹤使用者的頭部動作,或根據使用者的視線靜態放置內容。這項功能可用於抬頭顯示器、常駐通知或快速操作控制項等。

宣告和要求權限

要求權限前,您必須使用 <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 參考文件。