標準 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 軸衝突),請使用下列方法明確管理版面配置體積:
- 使用偏移:使用
SubspaceModifier.offset將周邊 UI (例如 HUD) 沿 Z 軸推近或推遠,或移至使用者視野邊緣。 - 限制大小:套用
requiredSizeIn等修飾符,限制空間的定界框。
如要進一步瞭解座標空間、版面配置限制和所有可用的追蹤設定,請參閱 Subspace 參考文件。