学习如 Oculus Rift 等VR设备开发需要掌握哪些知识/技术？
要想完整说明的话，先要明确以下Oculus Rift是个什么概念。 Oculus Rift是一种虚拟现实仪器（以下简称rift），用一个遮罩在双眼前的不透明显示器，搭配两个可更换透镜，高质量陀螺仪、加速度传感器和地磁传感器，以及后来的位置跟踪器（DK2专有）而成的一整套设备。目前rift尚未发布面向正式消费者的版本，而只公开了两个版本开发包（development kit），通常称之为DK1和DK2。 Rift的工作原理分为两部分。一部分跟目前3D电影或者3D眼镜概念类似（顺带说一句，我个人比较讨厌3D这个说法，太宽泛也极具商业欺骗性，更准确的说法是stereoscope，这里感谢 指正），即模仿现实世界，通过为左右两眼显示不同的画面，让大脑合成一副带有更多深度信息的“立体”图像。另一部分是跟互动相关。由于rift不只是要做另一个Sony HMZ-T3W，所以它为了互动体验还专门提供和优化了捕捉头部运动的组件。Rift设备可以很精准且迅速地捕捉到头部的任意旋转，DK2更能在一个空间角范围内捕捉头部的线性运动。 结合这两部分，rift能营造一个和现实世界完全隔绝的视觉环境，且能提供一定程度上的体感结合，即头部旋转和小范围线性移动。在硬件上也做到了较好的广视域和低延迟。 ============================= Rift的义务广告到此结束。了解了rift是什么后，我们进入正题：要具备怎样的知识才能进行rift开发？ 首当其冲的一点是3D相关知识。这里我说的不是stereoscopic的“3D”，而是一些计算机图形学基本知识。这里面包括现代实时图形应用的主要逻辑组成部分，包括： 其他方面如屏幕空间后处理效果、shader、动画系统等铺开的部分不是必须项。说得更明白一些，是一个运用3ds max/Maya这类数字内容创作软件的创作人员应该熟知的部分。这方面稍有门槛，但不算太高。 在早期stereoscope概念出来的时候，很多开发者还必须关心如何在节省性能的前提下渲染左右两张不同的画面。而现在rift硬件和SDK已经做掉大部分工作，不要说什么头部高速同步，连透镜色散和调瞳距都被我们卡马克大神和Abrash大神做掉了。而且Oculus公司也跟很多引擎大厂合作，提供了这些引擎的插件。所以如果你用Unity或者Unreal的话，连SDK集成的事都可以省去了(out-of-box)。留给开发者的任务是更好地理解rift硬件所能带给我们的特性，并将这些特性应用到实际应用中去。 举个很实际的例子：由于rift是沉浸式的体验，带上了rift视觉上就跟外界说拜拜了。这时候输入便成了一个棘手问题。如果要用户在看到logo之后，再脱下rift去摸键盘就太弱了，而且不是所有键盘用户都能应付盲打，保不齐某些用户还要在使用过程中再脱下来去找键位。配备一个手柄会好一些，但不能从根本上解决问题。当然还有一些诸如挂载LeapMotion、MYO之类的解决方案，但这都超出了rift本身的范畴。就这个问题来说，我倾向于从rift能提供的输入来着手解决。比如把头部旋转和移动不仅看做是摄像机的同步，还能当做一种输入方式。这方面比较好的例子有《Titans of Space》和《Vanguard V》，但我最欣赏的还是Google Cardboard官方应用的做法（好像有奇怪的东西混了进来）。 所以我认为除了必要的3D知识之外，rift开发要学习的东西对于大部分人都是全新的，而且他们基本都属于应用层问题。 官方煞费苦心地在官网放了很多关于如何开发rift应用的忠告（ ），主要是一些Do and Don't的条例，有较多关于避免眩晕(sickness)和增强沉浸感方面的内容。不过我浏览了官方 中的demo（吐了）之后，却发现好像甚少有人注意这些点。这里先列出一些我初步看下来有必要关心的吧： 最后还是夹一下私货，这是我在知乎专栏写的： ，有兴趣可以看看。 以上 ==== UPDATE: 上面说到的“官方解决”的输入问题，Oculus Touch控制器和Steam VR(HTC Vive)所提供的几个原型控制器，可以算是初步解决问题了。相比之下Gear VR头盔上的触摸板、Cardboard上的磁块拨片对于重度游戏来说就显得过于简单了。 UPDATE2: 之前据体验过Steam VR(HTC Vive)的同学讲，它的控制器做到的一些类似力反馈效果拔群，例如在它的“修理场”demo里，俯身下去捡起一把扳手，并使用扳手拧螺帽的感觉很棒。道听途说，权当参考。