Jetpack XR 的 ARCore 可以检测用户环境中的平坦表面,并提供有关这些表面的信息,例如姿势、大小和方向。这有助于您的应用找到桌面等可放置对象的表面。
创建 ARCore for Jetpack XR 会话
通过 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. */) }
检索感知到的平面的状态
ARCore for Jetpack XR 通过发出平面状态的 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 }