XRReferenceSpace
WebXR 设备 API 的 XRReferenceSpace 接口使用指定的跟踪行为,描述了虚拟世界中特定跟踪实体或对象的坐标系。跟踪行为由所选的 参考空间类型 定义。它通过增加对几种不同跟踪行为的支持,以及请求一个描述跟踪对象和世界中另一位置之间的偏移变换的新参考空间,来扩展基类 XRSpace。
除受限参考空间(bounded reference spaces)外,所有参考空间都使用 XRReferenceSpace 类型进行描述。受限空间实现为 XRBoundedReferenceSpace 对象。这些是特殊空间,可让您建立一个周界,在其中用户移动是“安全”的。对于允许用户实际四处移动的 XR 系统(例如,通过真实摄像头跟踪移动的系统),此边界确定了用户可以活动的区域边缘,无论是由于物理障碍还是 XR 硬件的限制。有关使用边界防止用户与物理和虚拟障碍物碰撞的更多信息,请参阅文章 使用受限参考空间保护用户。
实例属性
XRReferenceSpace 继承了 EventTarget 的属性,但没有定义其他属性。
实例方法
XRReferenceSpace 除了以下方法外,还继承了 EventTarget 的方法。
getOffsetReferenceSpace()-
创建并返回一个新的参考空间对象,其类型与调用方法的对象相同(即,
XRReferenceSpace或XRBoundedReferenceSpace)。新的参考空间可用于将坐标从调用方法的对象的参考空间转换为另一个坐标空间。这对于在渲染时定位对象以及在更改查看者的 3D 空间位置和/或方向时执行必要的变换很有用。
事件
reset-
当浏览器检测到跟踪对象原点与用户环境或位置之间出现不连续性时,会向
XRReferenceSpace对象发送reset事件。例如,在用户重新校准其 XR 设备后,或者设备在丢失并重新获得跟踪后自动调整其原点时,可能会发生这种情况。
参考空间类型
参考空间类型的列表如下表所示,并附有关于其用例和实现它们所使用的接口的简要信息。
有界地板-
一个
XRBoundedReferenceSpace,类似于local类型,但用户预计不会超出由返回对象中的boundsGeometry给出的预定边界。 local-
一个
XRReferenceSpace跟踪空间,其本地原点位于创建会话时查看者位置附近。具体位置取决于底层平台和实现。预期用户不会(或很少)超出其起始位置移动,并且跟踪针对此用例进行了优化。对于具有六自由度 (6DoF) 跟踪的设备,local参考空间会尝试使原点相对于环境保持稳定。 局部地板-
一个
XRReferenceSpace,与local类型类似,但起始位置放置在查看者站立的安全位置,其中 y 轴的值在地面水平处为 0。如果不知道地面水平,用户代理将估算地面水平。如果估算的地面水平非零,则浏览器应将其四舍五入,以避免指纹识别(可能精确到最近的厘米)。 无界-
一个
XRReferenceSpace跟踪空间,允许用户完全自由移动,可能距离其原点非常远。查看者根本不被跟踪;跟踪针对围绕用户当前位置的稳定性进行了优化,因此本地原点可以根据需要漂移以适应该需求。 查看器-
一个
XRReferenceSpace跟踪空间,其本地原点跟踪查看者的位置和方向。这用于用户可以实际四处移动的环境,并且受到所有XRSession实例(沉浸式和内联)的支持,尽管它对于内联会话最有价值。在确定查看者与输入之间的距离,或在使用偏移空间时特别有用。否则,通常会更频繁地使用其他参考空间类型之一。
用法说明
创建 XRReferenceSpace
您需要在两种情况下获取 XRReferenceSpace。第一种情况是在设置场景时,需要获取一个参考空间来表示用户在 XRSession 持续期间对世界的视角。为此,请调用 XRSession 方法 requestReferenceSpace(),并指定您希望获取的参考空间类型。
xrSession.requestReferenceSpace("local").then((refSpace) => {
xrReferenceSpace = refSpace;
// …
});
您可能需要获取新参考空间的另一种情况是,如果您需要将原点移动到新位置;例如,当您的项目允许用户使用键盘、鼠标、触摸板或未通过 XR 设备连接的游戏控制器等输入设备在环境中移动时,通常会这样做。由于原点通常是用户在空间中的位置,因此您需要更改原点以反映他们的移动和所做的任何方向更改。
要移动或旋转用户对世界的看法,您需要更改用于表示该视角的 XRReferenceSpace。但是,XRReferenceSpace 是不可变的,因此您需要创建一个表示更改后的视角的新参考空间。使用 getOffsetReferenceSpace() 方法可以轻松完成此操作。
let offsetTransform = new XRRigidTransform(
{ x: 2, y: 0, z: 1 },
{ x: 0, y: 0, z: 0, w: 1 },
);
xrReferenceSpace = xrReferenceSpace.getOffsetReferenceSpace(offsetTransform);
这会将 XRReferenceSpace 替换为一个新对象,该对象的新原点和方向将调整为相对于当前原点位于 (2, 0, 1) 处,并通过一个单位 四元数进行旋转,该四元数将空间定向为使查看者相对于先前世界方向直视上方。
几何体
任何 XRReferenceSpace 的本地原点始终配置为:+X 向右,+Y 向上,+Z 向“后”或朝向用户。
规范
| 规范 |
|---|
| WebXR Device API # xrreferencespace-interface |
浏览器兼容性
加载中…