XRReferenceSpace - 使用指定的跟踪行为描述了虚拟世界中特定被跟踪实体或对象的坐标系
XRReferenceSpace
是 WebXR 设备 API 的接口,使用指定的跟踪行为描述了虚拟世界中特定被跟踪实体或对象的坐标系。跟踪行为由选定的参考空间类型定义。它扩展了 XRSpace
基类,增加了对几种不同跟踪行为的支持,并请求一个新的参考空间来描述被跟踪对象与世界上另一个位置之间的偏移转换。
所有的参考空间(唯一的例外是有界的参考空间)都使用 XRReferenceSpace
类型进行描述。有界空间被实现为 XRBoundedReferenceSpace
对象。这些是特殊的空间,可让您建立一个让观看者在其中 “安全” 移动的边界。对于允许用户进行物理移动的 XR 系统,例如那些使用真实摄像机跟踪移动的系统,无论是由于物理障碍还是由于 XR 硬件的限制,都会建立用户能够在其中移动的区域的边缘。请参阅文章使用有限的参考空间来保护查看器,以获取有关使用边界防止用户与物理和虚拟障碍物碰撞的更多信息。
属性
除了从其父接口 XRSpace
继承的属性(目前尚无)之外, XRReferenceSpace
还继承了 EventTarget
的属性。XRReferenceSpace
没有定义其他属性。
方法
除了从其父接口 XRSpace
继承的方法(目前尚无)之外, XRReferenceSpace
还继承了 EventTarget
的方法。XRReferenceSpace
还提供以下方法。
getOffsetReferenceSpace()
创建并返回一个新的引用空间对象,该对象与您调用该方法的对象具有相同的类型(因此是 XRReferenceSpace
或 XRBoundedReferenceSpace
)。新的参考空间可用于将坐标从调用该方法的对象的参考空间转换为不同的坐标空间。这对于在渲染时定位对象以及在更改查看器在 3D 空间中的位置和 / 或方向时执行所需的转换很有用。
事件
除了可能发送到 XRSpace
或 EventTarget
对象的其他事件之外,以下内容也适用于 XRReferenceSpace
对象。
reset
当浏览器检测到被跟踪对象的原点相对于用户的环境或位置发生不连续时,会将 reset
事件发送到 XRReferenceSpace
对象。例如,在用户重新校准其 XR 设备之后,或者在丢失和重新获得跟踪后该设备自动调整其原点时,可能会发生这种情况。
除了使用 addEventListener()
,您还可以通过 onreset
来设置 reset
事件处理程序。
参考空间类型
由 XRSession.requestReferenceSpace()
返回的参考空间为 XRReferenceSpace
或 XRBoundedReferenceSpace
。下表中的 “接口” 列指示为每个参考空间类型常量返回两种类型中的哪一种。
参考空间描述符
下表中列出了参考空间的类型,以及有关它们的用例,以及用于实现它们的接口的简要信息。
bounded-floor
与 local
类型类似,不同之处在于,不希望用户移动到预定边界之外,该边界由返回对象中的 boundsGeometry
赋予。
对应的接口是 XRBoundedReferenceSpace
。
local
创建会话时其原始位置位于查看者位置附近的跟踪空间。确切位置取决于基础平台和实现。用户不会移动太多,甚至不会超出他们的起始位置,并且针对此用例优化了跟踪。
对于具有六个自由度(6DoF)跟踪的设备,local
参考空间会尝试使原点相对于环境保持稳定。
对应的接口是 XRReferenceSpace
。
local-floor
与 local
类型类似,不同之处在于,起始位置放置在安全的位置,以使观看者可以站立,其中 y 轴的值在楼层为 0。如果该底限未知,则 user agent 将估计底限。如果估计的楼层高度不为零,则预期浏览器将其舍入为一种避免产生指纹的方式(可能会接近最近的厘米)。
对应的接口是 XRReferenceSpace
。
unbounded
一个允许用户完全自由移动的跟踪空间,可能距离他们的原点很远。没有跟踪查看器;观众完全没有被跟踪;跟踪是为用户当前位置的稳定性而优化的,因此原始原点可能会根据需要漂移以适应这种需要。
对应的接口是 XRReferenceSpace
。
viewer
一个跟踪空间,其原始位置跟踪查看者的位置和方向。它用于用户可以在其中进行物理移动的环境,并且受到沉浸式和嵌入式的所有 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: 1, z: 0, w: 1});
xrReferenceSpace = xrReferenceSpace.getOffsetReferenceSpace(offsetTransform);
这将用新的 XRReferenceSpace
替换老的 XRReferenceSpace
,并对其原点和方向进行了调整,以将新原点放置在相对于当前原点的 (2, 0, 1)
处,并旋转给定的单位四元数 确定空间的方向,使观看者相对于先前的世界方向笔直向上。
几何
任何 XRReferenceSpace
的原点总是被配置为 +X 被认为在右边,+Y 被认为是向上,而 +Z 被认为是 “向后” 或朝向用户。
规范
规范 | 状态 | 备注 |
---|---|---|
WebXR Device API XRReferenceSpace 的定义 |
工作草案 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
getOffsetReferenceSpace() | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
onreset | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
reset 事件 | 79 | 79 | 不支持 | 不支持 | 不支持 | 不支持 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
getOffsetReferenceSpace() | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
onreset | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |
reset 事件 | 不支持 | 79 | 未知 | 不支持 | 未知 | 不支持 | 不支持 |