偏移或移动参考空间

90 阅读1分钟

场景

用户进入immersive-vr模式时,重置参考空间为用户头戴看向的位置和方向

实现

useFrame((state: RootState, delta: number, frame?: THREE.XRFrame) => {
    if (flag.current && frame) {
      const baseReferenceSpace: XRReferenceSpace = gl.xr.getReferenceSpace();
      const viewerPose = frame?.getViewerPose(baseReferenceSpace);
      const newReferenceSpace: XRReferenceSpace =
        baseReferenceSpace.getOffsetReferenceSpace(viewerPose.transform);
      gl.xr.setReferenceSpace(newReferenceSpace);
      flag.current = false;
    }
  });

存在问题

上述设置存在一个问题,重置后的参考空间类型仍旧为local-floor,但用户的高度变了,初步分析原因为在重置参考空间local-floor之后需要重设用户高度,可采取的办法如下:

  1. 从系统层获取用户高度
  2. 已知viewerPose的XRRigidTransform的结构如下,可通过new XRRigidTransform调整参考空间的位置减去用户高度: image.png

写在后面

对于当前存在的高度问题,我的理解可能是错误或者片面的,有比较了解的同学欢迎评论交流指正!