注: 文章写于2015年8月, 目前VR游戏Demo已经完结, 所以把上一次预研的一些经验分享出来, 希望对大家有所帮助
背景
初接触Oculus时, 从网上下载了一大堆的Demo来体验, 但是, 操作体验大都比较差, 特别是FPS类. 这也让我们意识到, 对于VR游戏, 最大的挑战还不是显示方式的变化, 而是交互方式. 在一个沉浸式的环境中, 最自然的交互就是最完美的方式. 其中基本的需求, 就是可以使用双手跟VR中的虚拟环境进行交互. 这么一来, 首先键鼠或手柄就被排除掉了, 我们只好针对市面上的一些输入设备, 挨个进行评估实验:
- Wiimote: 只能检测运动和方向, 无法准确定位双手的位置
- Leap Motion: 粘在Oculus上可以模拟出双手, 但是识别范围太小, 骨骼的稳定性比较差, 严重影响体验
- Razer Hydra: 可以获取双手的空间位置和旋转, 加上两个手柄上的按键也能触发一些状态切换, 算是看起来还不错的方案. 缺点是位置偏差比较大, 可能是磁场受干扰的问题
- RealSense: 类似LeapMotion, 但是精度比较低, 导致识别出的骨骼位置抖动严重, 无法用于双手的骨骼映射
试来试去, 好像目前市面上除了高成本的动作捕捉设备, 还没有比较完美的VR输入设备可以用. 最后, 把目光转向了旁边XboxOne开发机配的Kinect2.
因为我们组去年进行了XboxOne体感游戏的研发, 积累了一些Kinect2体感操作的经验, 就把Kinect2连接到了PC上, 看看能不能把体感操作与Oculus的VR显示结合到一起.
需求分析
前面也提到了, 尽量达到接近自然的交互方式, 那就需要实现这几个关键点:
- 可以在虚拟世界中显示出双手, 最好能有肢体躯干
- 虚拟空间中的双手位置与现实空间中跟头部的相对位置(包括旋转)保持一致
- 可以使用双手对虚拟世界中的物体产生影响
- 能够识别一些简单的手势, 如抓, 推, 拉, 按, 摸等等
那Kinect2提供的数据或者功能有哪些呢?
- 30帧/s的Color/Depth/BodyIndex/IR数据
- 身体骨骼位置和朝向(比较不稳定, 会抖动)
- 双手的三种状态识别, 正好对应 石头 剪刀 布(误识别率较高)
- 其它诸如语音之类的功能暂时用不上
像LeapMotion那样每根手指单独识别是做不到了, 退而求其次, 只能在交互设计上就去规避过小元素, 使用整个手掌做为交互
双手的骨骼位置可以为我们提供双手的空间定位, 而三种状态可以参考我们在XboxOne体感游戏中的UI交互经验, 把抓住拖动之类的手势利用起来
实现细节
双手肢体的绘制
因为Kinect API已经提供了人体骨骼的变换信息, 那自然而然的我们就想在游戏中绑定到一个蒙皮模型上
最终我们也在UE4中实现了, 但是体验下来