Jetpack XR 的 ARCore 可偵測使用者環境中的平面,並提供相關資訊,例如姿勢、大小和方向。這項功能可協助應用程式尋找可放置物件的平面,例如桌子。
建立 Jetpack XR 的 ARCore 工作階段
透過 ARCore for Jetpack XR 工作階段存取平面資訊。請參閱「瞭解工作階段的生命週期」一文,取得 Session
。
設定工作階段
XR 工作階段預設不會啟用平面偵測功能。如要啟用平面追蹤功能,請設定工作階段並設定 PlaneTrackingMode.HORIZONTAL_AND_VERTICAL
模式:
val newConfig = session.config.copy( planeTracking = Config.PlaneTrackingMode.HORIZONTAL_AND_VERTICAL, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigureSuccess -> TODO(/* Success! */) else -> TODO(/* A different unhandled exception was thrown. */) }
擷取感知到的平面狀態
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 }