使用Oculus rift显示Web应用程序输出

yu.*_*ets 6 webgl oculus webvr

我有一个使用WebGL生成3D场景的Web应用程序.我想知道是否有可能使用Oculus rift显示这个场景?这有多难?

vt5*_*491 5

概述

虽然我意识到这是一个老问题,而且现在有很多关于那里的信息,但我还是要发布一个答案,因为之前发布的答案不是最新的。

我已经创建了一个基本的 plunker,它说明了让three.js、webvr 和oculus 协同工作需要做什么。注意:我无法在 plunker 下全屏工作,但是如果您在mozilla nightly build下使用 oculus Rift (OR) 运行 plunker, 您应该会看到头部旋转正在工作。如果您在 plunker 之外运行它,您应该能够获得完整的 OR VR 体验。

我认为另一个值得参考的好应用是RiftSketch。这是我第一次用来学习如何让 OR 在浏览器下工作(这实际上是这个问题的原始发布者编写的应用程序)。

以下是与标准three.js 应用程序不同的相关webvr 片段:

this.controls = new THREE.VRControls(this.camera);
this.effect = new THREE.VREffect(this.renderer);
this.effect.setSize(this.width, this.height);

this.vrManager = new WebVRManager(this.renderer, this.effect);
Run Code Online (Sandbox Code Playgroud)

并在渲染函数中:

this.controls.update();

this.renderer.render(this.scene, this.camera); 

if (this.vrManager.isVRMode()) { 
  this.effect.render(this.scene, this.camera);
}
else {
  this.renderer.render(this.scene, this.camera);
}
Run Code Online (Sandbox Code Playgroud)

需要的模块

您需要做的另一件事是提供以下四个库(除了three.js):

  • VRControls.js
  • VREffect.js
  • webvr-manager.js
  • webvr-polyfill.js

VRControls.js 和 VREffect.js 分别位于“examples/js/controls”和“examples/js/effects”下的three.js库中

更新:我建议您从webvr-boilerplate github获取所有库因为three.js 似乎没有最新版本。

另外两个可以在webvr-boilerplate github上获得

您可以选择直接访问 webvr API,如此处所述,但我认为使用支持库要容易得多。

最后的话

您基本上根本不需要处理 Oculus Rift SDK。需要直接调用 OR SDK API 的只有 Unity 引擎开发人员和 Mozilla API 开发人员。

WebVR 创建了一个通用 API,试图为所有 HMD 设备(例如 Cardboard、OR 和(大概在未来)三星、HTC Vive、leap motion 等)提供标准化接口。如果您选择使用 VRControls 和 VREffects,您将拥有一个额外的 API 层以使其更加容易。它基本上只是一堆样板。最后,我不认为你真的对幕后真正发生的事情有太多了解。您基本上只需设置一次,就再也不会碰它了。

一旦您获得 OR 支持,那么为您的应用程序开发几乎就像任何其他 Three.js 应用程序一样。


Jhe*_*ico 2

Rift 渲染有两个主要组成部分:头部跟踪扭曲

扭曲通常由 Oculus SDK 使用 OpenGL 或 Direct3D 来完成,但也可以用 Javascript 来实现。您可以在此处查看相关示例。该页面使用从 Oculus SDK 中提取的一组预烘焙扭曲顶点,适合与 DK1 模型一起使用。

头部跟踪要困难得多,因为它需要访问硬件或与硬件通信的运行时。Mozilla 正在开发一组 API,用于访问头部跟踪,并可能获取失真参数,但它似乎远不稳定。

Three.js 似乎有想要支持实验性 VR api 的示例,以及使用名为 ouclus-rest 的示例。

基本上可以归结为:如果你想用 Javascript 来做 VR,你要么必须推出自己的解决方案,尝试击中移动目标,要么要有耐心。