有没有一种方法可以在应用程序中在前后摄像头之间切换

时间:2019-09-13 21:44:00

标签: javascript augmented-reality aframe playcanvas 8thwall-web

我正在尝试开发一种网络体验,允许用户在整个体验中在前后摄像头之间切换,同时在使用SLAM / 6dof的同时使用后摄像头。理想情况下,我想使用PlayCanvas,但无法使前置摄像头正常工作。在框架内实现此功能方面,我取得了一些成功,但是很多事情正在中断。

我找不到有关启用前置摄像头并使用XR.stop()以及XR.run({Canvas:document.getElementById('camerafeed'),cameraConfig:{方向:XR .XrConfig.camera()。FRONT}})没有任何作用。

在a帧内,我正在执行类似的事件序列,但看到了一些结果。前置摄像头已激活,但是日志中有错误,没有渲染3D对象(当我们在前置摄像头模式下启动时会渲染),并且尝试再次切换摄像头会显示“糟糕,出了点问题!”屏幕。

至于切换SLAM / 6dof,我一直收到一个错误,即执行XR.run后无法更改disableWorldTracking。即使我已经运行XR.stop函数并侦听了stopxr事件。

应该切换到前置摄像头的A帧功能(仅重要位):

init: function() {
this.el.sceneEl.addEventListener('stopxr', event => {
      console.log("AR has been stopped.");
      const videoCanvas = document.querySelector('canvas.a-canvas');
      XR.XrController.configure({disableWorldTracking: true});
      XR.run({canvas: videoCanvas, cameraConfig: {direction: XR.XrConfig.camera().FRONT}});
    });
},

switchToFace: function() {
    this.el.sceneEl.emit('stopxr');
    //XR.stop();
  },

在场景运行时更改disableWorldTracking参数的正确方法是什么? 在场景运行时在前后摄像头之间切换的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

与第8名Wall开发人员交谈后,他们确认每页仅支持一个XR会话,因此在XR.stop之后,将无法再次调用XR.run。但是,还有另一种方法可以在前后摄像头之间切换,并且可以启用SLAM。

  1. 收听onCameraStatusChange事件,并获取对streamvideo元素的引用。
  2. 启动相机交换时,请使用XR.pause()暂停第8面墙。
  3. 停止在第一步中抓取的stream中的所有曲目。
  4. 使用navigator.mediaDevices.getUserMedia(constraints);获取所需摄像机的视频流。
  5. 将新流分配给您在步骤1中抓取的video元素。
  6. 收听视频元素以触发playing事件,然后调用XR.resume();

需要注意的一件事:SLAM仅在您从后置摄像头开始时才起作用。切换到前后摄像头后,SLAM将不再起作用。

答案 1 :(得分:1)

现在可以停止和恢复XR会话(从13.1版本开始)。您可以先调用XR8.stop(),再调用XR8.run()并传递新的所需摄像机方向。

如果您在AFrame项目中使用第8墙,则只需从xrweb中删除<a-scene>组件即可停止XR,然后再添加回XR(带有新的cameraDirection参数,然后重新启动。

以下一些项目说明了如何翻转相机方向:

https://www.8thwall.com/8thwall/camera-shaders

https://www.8thwall.com/playground/swap-dof