适用于 Jetpack XR 的 ARCore 可以检测用户环境中的平面,并提供其姿势、大小和方向等信息。这可以帮助您的应用找到桌面等表面来放置对象。
创建适用于 Jetpack XR 的 ARCore 会话
通过适用于 Jetpack XR 的 ARCore 会话访问平面信息。请参阅了解会话生命周期以获取Session
。
配置会话
平面检测在 XR 会话中默认未启用。要启用平面追踪,请配置会话
val newConfig = session.config.copy( planeTracking = Config.PlaneTrackingMode.HorizontalAndVertical, ) when (val result = session.configure(newConfig)) { is SessionConfigureConfigurationNotSupported -> TODO(/* Some combinations of configurations are not valid. Handle this failure case. */) is SessionConfigurePermissionsNotGranted -> TODO(/* The required permissions in result.permissions have not been granted. */) is SessionConfigureSuccess -> TODO(/* Success! */) }
检索感知到的平面的状态
适用于 Jetpack XR 的 ARCore 通过 StateFlow
提供平面状态,该 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 }