使用 ARCore for Jetpack XR 偵測平面

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
}

平面具有下列屬性:

對平面執行命中測試

命中測試是一種方法,可計算光線與工作階段追蹤物件的交集。點擊測試的常見應用是將物件放置在桌面上。執行命中測試會產生命中物件清單。換句話說,命中測試不會在第一個命中的物件停止,不過,您通常可能只對特定類型的第一個物件命中感興趣。

如要執行命中測試,請搭配使用 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
}