Jetpack XR 適用的 ARCore 可偵測使用者環境中的平面,並提供相關資訊,例如姿勢、大小和方向。這有助於應用程式尋找可放置物件的平面,例如桌子。
存取工作階段
透過 ARCore for Jetpack XR Session 存取平面資訊。如果您使用適用於 XR 的 Jetpack Compose 強化空間 UI,請從適用於 XR 的 Jetpack Compose 存取工作階段。如果您要處理 Jetpack SceneCore 程式庫的空間實體,請從 Jetpack XR Runtime 存取工作階段。
設定工作階段
根據預設,XR 工作階段不會啟用平面偵測功能。如要啟用平面追蹤功能,請設定工作階段並設定 PlaneTrackingMode.HORIZONTAL_AND_VERTICAL 模式:
val newConfig = session.config.copy( planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* The session could not be configured. See SessionConfigureResult for possible causes. */) }
擷取感知平面狀態
Jetpack XR 的 ARCore 會透過發出平面狀態的 StateFlow 提供平面狀態。在工作階段中訂閱平面後,應用程式會在平面新增、更新或移除時收到通知。
Plane.subscribe(session).collect { planes -> // Planes have changed; update plane rendering }
平面具有下列屬性:
label:指定Plane的語意說明。可能為WALL、FLOOR、CEILING或TABLE。centerPose:偵測到的平面中心姿態。extents:偵測到的平面尺寸,單位為公尺。vertices:近似於平面的凸多邊形頂點清單。
對平面執行命中測試
命中測試是一種計算射線與工作階段追蹤物件交集的方法。點擊測試的常見應用是將指標指向桌子,並在該位置放置物件。執行命中測試會產生命中物件清單。換句話說,命中測試不會在命中第一個物件時停止,不過,您通常可能只對特定類型的第一個物件命中感興趣。
如要執行命中測試,請搭配使用 Interaction.hitTest() 和 Ray:
val results = androidx.xr.arcore.hitTest(session, ray) // When interested in the first Table hit: val tableHit = results.firstOrNull { val trackable = it.trackable trackable is Plane && trackable.state.value.label == Plane.Label.TABLE }