WebXRManager

291 阅读6分钟

WebXRManager 是 Three.js 中用于支持 WebXR 的一个重要 API。WebXR 是一种允许在网页上进行虚拟现实(VR)和增强现实(AR)体验的标准。以下是 WebXRManager 的一些关键特点和功能:
此类表示WebXR设备API的抽象,并由WebGLRenderer在内部使用。 WebXRManager还提供了一个公共接口,允许用户启用/禁用XR并执行XR相关任务,例如检索控制器。

WebXRManager 有三个属性 十个方法

属性

  • cameraAutoUpdate : Boolean manager的XR摄像头是否应自动更新。默认为true。
  • enabled : Boolean 此标志通知渲染器准备好进行XR渲染。默认为false。 如果您要在应用中使用XR,请将其设置为true。
  • isPresenting : Boolean XR演示是否处于活动状态。默认为false。该标志是只读的,由WebXRManager自动设置。

方法

  • getCamera () : ArrayCamera 返回表示活动XR会话的XR相机的ArrayCamera实例。 对于每个视图,它在其cameras属性中包含一个单独的相机对象。 当前未使用相机的fov,不反映 XR 相机的 fov。 如果您需要应用级别的fov,则必须从XR相机的投影矩阵中手动计算。
  • getController ( index : Integer ) : Group index — 控制器的索引。 返回表示XR控制器所谓的目标光线空间的[page:Group 组]。使用此空间可视化3D对象,支持用户完成UI交互等指向任务。 示例,展示如何在 Three.js 中使用 VR 控制器接收事件并与场景中的物体进行交互。
    // 启用 WebXR
    renderer.xr.enabled = true;
    document.body.appendChild(VRButton.createButton(renderer));
    // 创建一个简单的立方体
    const geometry = new THREE.BoxGeometry(1, 1, 1);
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);
    // 创建控制器
    const controller1 = renderer.xr.getController(0);
    const controller2 = renderer.xr.getController(1);
    scene.add(controller1);
    scene.add(controller2);
    // 添加事件监听器
    controller1.addEventListener('selectstart', onSelectStart);
    controller1.addEventListener('selectend', onSelectEnd);
    controller2.addEventListener('selectstart', onSelectStart);
    controller2.addEventListener('selectend', onSelectEnd);
    function onSelectStart(event) {
        const controller = event.target;
        // 创建一个射线
        const raycaster = new THREE.Raycaster();
        const tempMatrix = new THREE.Matrix4();
        // 获取控制器的位置和方向
        controller.updateMatrixWorld();
        tempMatrix.identity().extractRotation(controller.matrixWorld);
        // 设置射线的起点和方向
        raycaster.ray.origin.setFromMatrixPosition(controller.matrixWorld);
        raycaster.ray.direction.set(0, 0, -1).applyMatrix4(tempMatrix);      
        // 检查与立方体的交互
        const intersects = raycaster.intersectObject(scene.children[0]); // 这里的 0 是立方体的索引
        if (intersects.length > 0) {
            const intersectedObject = intersects[0].object;
            intersectedObject.material.color.set(0xff0000); // 改变颜色
        }
    }
    function onSelectEnd(event) {
        // 在这里可以添加释放按钮时的逻辑
        console.log('Selection ended');
    }
    function animate() {
        renderer.setAnimationLoop(render);
    }
    function render() {
        // 渲染场景
        renderer.render(scene, camera);
    }
  • getControllerGrip ( index : Integer ) : Group index — 控制器的索引。 返回一个[page:Group 组],代表所谓的XR控制器的抓地力空间。如果用户要握住其他3D对象(如光剑),请使用此空间。 注意:如果你想显示用户手中的东西并同时提供指向光线, 你需要将手持对象附加到.getControllerGrip()返回的组, 并将光线附加到.getController()返回的组. 这个想法是在同一个WebXR控制器的两个不同坐标空间中有两个不同的组。getControllerGrip(index: Integer) 方法返回的对象可以被视为 VR 控制器中的目标或“指针”,类似于电脑中的鼠标光标。它在 VR 环境中用于表示用户的交互点,以下是一些具体的相似之处和功能:
    // 创建控制器握持模型
    const grip1 = renderer.xr.getControllerGrip(0);
    const grip2 = renderer.xr.getControllerGrip(1);
    scene.add(grip1);
    scene.add(grip2);
  • getHand ( index : Integer ) : Group index — 控制器的索引。 返回代表XR控制器所谓的手或关节空间的[page:Group 组]。在不使用物理控制器时,使用此空间可视化用户的手。getHand(index: Integer): Group 是 Three.js 中 WebXRManager 的一个方法,用于获取与 VR 手部追踪相关的组对象。这个方法通常用于表示用户的手部模型,使得 VR 环境能够更好地模拟用户的手部动作和位置。
    // 获取手部模型
    const hand1 = renderer.xr.getHand(0);
    const hand2 = renderer.xr.getHand(1);
    // 将手部模型添加到场景中
    scene.add(hand1);
    scene.add(hand2);
  • getReferenceSpace () : String 返回参考空间。getReferenceSpace(): String 是 Three.js 中 WebXRManager 的一个方法,用于获取当前 VR 或 AR 会话的参考空间类型。参考空间定义了虚拟对象在物理世界中的位置和方向。
    // 启用 WebXR
    renderer.xr.enabled = true;
    // 在会话开始时获取参考空间
    renderer.xr.addEventListener('sessionstart', (event) => {
        const referenceSpace = renderer.xr.getReferenceSpace();
        console.log('Current reference space:', referenceSpace); // 获取参考空间数据信息。
    });
  • getSession () : XRSession 返回XRSession对象,它允许在应用程序级别更细粒度地管理活动的WebXR会话。getSession(): XRSession 是 Three.js 中 WebXRManager 的一个方法,用于获取当前的 XR 会话对象。XR 会话对象提供了与虚拟现实(VR)或增强现实(AR)环境的交互能力。
    // 启用 WebXR
    renderer.xr.enabled = true;
    // 在会话开始时获取 XR 会话
    renderer.xr.addEventListener('sessionstart', (event) => {
        const session = renderer.xr.getSession();
        console.log('Current XR Session:', session);
    });
  • setFramebufferScaleFactor ( factor : Float, limited : Boolean ) : undefined factor — 要设置的帧缓冲区比例因子。 limited — 如果值最终高于设备的能力,是否应将帧缓冲区比例因子减小到本机限制。默认为false。 指定在渲染到XR设备时确定帧缓冲区大小时要使用的比例因子。 该值是相对于默认XR设备显示分辨率的。默认为1。值0.5将指定具有显示器原始分辨率50%的帧缓冲区。 注意:在呈现XR内容时无法更改帧缓冲区比例因子。用于设置帧缓冲区的缩放因子。这对于调整 VR 或 AR 渲染的清晰度和性能非常有用。
    // 启用 WebXR
    renderer.xr.enabled = true;
    // 设置帧缓冲区缩放因子
    const scaleFactor = 1.0;  // 正常清晰度
    const limited = false;     // 不限制缩放因子
    renderer.xr.setFramebufferScaleFactor(scaleFactor, limited);
  • setReferenceSpace ( referenceSpace : XRReferenceSpace ) : undefined referenceSpace — 自定义参考空间。 可用于配置覆盖默认参考空间的自定义参考空间。用于设置当前 XR 会话的参考空间。这可以帮助定义虚拟对象在物理世界中的位置和方向。
    // 启用 WebXR
    renderer.xr.enabled = true;
    // 创建并设置参考空间
    const referenceSpace = renderer.xr.getSession().getReferenceSpace(); // 假设你已经开始了会话
    renderer.xr.setReferenceSpace(referenceSpace);
  • setReferenceSpaceType ( referenceSpaceType : String ) : undefined referenceSpaceType — 要设置的参考空间类型。 可用于配置与用户物理环境的空间关系。 根据用户在3D空间中的移动方式,设置适当的参考空间可以改进跟踪。 默认为本层空间。 请查看MDN以了解可能的值及其用例。用于设置当前 XR 会话的参考空间类型。这使得开发者能够指定如何在虚拟环境中处理位置和方向。
    // "local":相对于用户初始位置的局部空间。
    // "local-floor":相对于用户在地面上的初始位置。
    // "bounded":用户的活动区域,有边界限制。
    // "unbounded":没有边界限制的空间。

    // 启用 WebXR
    renderer.xr.enabled = true;
    // 设置参考空间类型
    const referenceSpaceType = 'local'; // 或 'local-floor', 'bounded', 'unbounded'
    renderer.xr.setReferenceSpaceType(referenceSpaceType);
  • updateCamera ( camera : PerspectiveCamera ) : undefined 更新 XR 相机的状态。 如果您将.cameraAutoUpdate设置为false,请在应用级别使用此方法。 该方法需要场景的非 XR 相机作为参数。 调用此方法时,传入的相机变换会自动调整到 XR 相机的位置。 注意:在呈现 XR 内容时无法更改参考空间类型。