VR下双手与物体的交互

背景

Oculus的Touch, HTC Vive的Controller, PSVR的PS Move, 三家一线VR硬件都在给大家传达一个信息: VR下能够模拟双手的体感控制器是一个趋势. 在VR游戏中, 一旦有了双手, 这就意味着不光能看了…..如果说之前的VR游戏只是输出方式(显示器)发生了变化, 那现在有了个双手, 输入方式也发生了变化, 这对游戏来说是一个革命性的改变, 是完全可以改变用户体验的. 由此我们也看到了代表未来的一些VR应用开始出现: 如空间绘画Tilt Brush, VR雕塑Oculus Medium等. 从游戏玩法的角度, 如果能把传统的玩法跟双手的交互方式相结合, 这就是一个创新, 可以让VR游戏不仅仅是好看, 从而变得开始好玩.

这种双持的体感控制器, 在UE4中统称为MotionController, 在Unity中嘛(我们都是野孩子). 有了双手, 第一件想干事是什么? (嗯, 我指的不是摸) 是抓东西, 扔东西. 对于基于Motion Controller的操作方式来说, 是最最基本的一个功能了. 然而, 这个看似简单的功能, 却有很多问题, 没有办法做到非常完美.

常见实现方法

不就是把物体挂到手上吗? 有那么困难? 我先来分析一下实现方式:

1. Attach To Hand

这也是最常见的实现方法, 直接把Hand做为父结点, 把物体当成子级挂上去

2. Set Position

每帧更新物体的位置(和朝向), 让它跟Hand保持一致. 相对于方法1需要在移动时考虑碰撞, 比如在UE4中就是设置Sweep=true

3. Set Velocity

每帧更新物体的速度(角速度), 让它不断地追赶Hand. 这个方法的缺点是有一帧延迟, 移动得快了是肉眼可见物体与手脱离的.

4. Constraint

直接把物体和手的碰撞体用Constraint进行连接. 看上去与方法1很像, 区别是一个是场景逻辑层面的, 一个物理引擎层面的.

一些细节问题

因为双手是虚拟的, 物体也是虚拟的, 所以想完全模拟出现实中一模一样的体验是不可能的(至少现阶段不行). 上述几种方法也不是都不能用, 只是各自都有其不完美的地方. 下面挨个问题来说:

物体的重力

除了悬浮的物体, 一般是都有重量的. 但是拿到手上后, 这个受力是需要解除的, 不然会不停往下掉. 一般都是抓起来后就关掉重力影响, 放开时再恢复, 这个大家应该都有考虑到.

扔出去时的速度

方法2的实现在扔出去后其实是没有继承手部的速度的, 所以需要自行对Rigidbody设置速度(和角速度). 方法1对于不同引擎实现机制不同, 也会有类似的问题.

与静态场景模型的碰撞

当我们手上没抓东西时, 让手插入静态场景模型(比如墙壁), 怎么处理? 一种做法是让手保持与现实中的位置一至, 一种做法是让手留在碰撞的地方不动. 前一种做法更常见, 因为可以有比较好的沉浸感, 不过也有人会有异议, 下文都是假设以前一种做法为基础. 当我们手上拿着东西时, 让手上的物体插入墙壁, 这时候怎么处理? 有人说也可以让它像手一样穿过墙壁呀, 但是如果这么做了的话, 这时松开手, 这个物体就卡在墙上了, 或者被弹飞(物理引擎的一些问题). 所以正确的做法一般是让手上的物体留在墙面上, 手穿过去, 这时松手的话, 物体自然掉落. 方法1和方法4都有穿插的问题. 方法3会有不断碰撞造成的抖动问题, 可以临时禁用弹性系数解决.

与动态物体的碰撞

假设物体A和物体B都是可以拿起来的动态物理对象, 手拿起物体A, 去推物体B. 方法2物体A会停在物体B上, 物体B不会动. 方法1和方法4可以把物体B推动. 方法3如果物体A质量远小于物体B, 是推不动的, 所以这是最能符合我们期望的结果.

手持物体快速挥动的碰撞

常见的应用场景是手拿球拍去击球. 方法1在速度非常快的情况下会击不出球, 因为前一帧在球前, 后一帧就跑到球后面去了. 方法2球拍会停在与球接触的地方. 方法3和方法4可以符合预期.

与带约束的动态物体交互

比如一个转盘, 只能绕一个轴旋转. 手持一个物体去推动这个转盘. 方法1: 转盘会被推到偏离转轴 方法2: 物体停在与转盘接触的位置 方法3: 物体停在与转盘接触的位置, 转盘会正常转动, 不过也会出现抖动问题 方法4: 物体会与转盘穿插, 但转盘会正常转动

空手直接去抓转盘进行交互是不行的, 可以参考NVR(参考资料1)的实现, 把抓取行为改为对转盘释加力进行转动.

物体的重量

如果想模拟出提起物体时不同重量物体的表现 , 可以通过施加力的方式来模拟出物体与手之间的相对移动, 通过速度快慢表现出不同物体的重量. 见参考资料2

物体的触感

不同材质, 不同重量的物体, 可以通过控制器的振动频率和振幅来进行模拟.

物体与手的相对位置(和旋转)

有些物体我们希望任意位置都可以抓住, 比如球, 花瓶, 玩具等. 有些物体我们希望手拿起来就在把手位置, 比如球拍, 手枪等. 这种可以在物体上设置挂点解决.

其它

待继…

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

记一道贝叶斯公式的裸题

上课好不容易听懂了,赶紧整理一下,不然以我的记性估计明天就要忘干净了 题目 一个用户所有邮件分为两类:$A_1$代表垃圾邮件, $A_2$代表非垃圾邮件 根据经...

34050
来自专栏量子位

谷歌大脑发布神经架构搜索新方法:提速1000倍

岳排槐 发自 LZYY 量子位 出品 | 公众号 QbitAI ? 去年,谷歌大脑团队发布神经网络自动架构搜索(NAS)。这个方法理论上能够更好地、自动化地设计...

380100
来自专栏新智元

Jeff Dean、李飞飞等发起SysML大会,Jeff Dean主题演讲:系统与机器学习融合(45PPT)

新智元报道 来源:SysML 2018 编辑:闻菲、艾霄葆、常佩琦、刘小芹 【新智元导读】Jeff Dean、Michael I.Jordan、李飞飞、...

45480
来自专栏灯塔大数据

每周学点大数据 | No.52众包算法例析

NO.52 众包算法例析 小可:讨论了这么多,我还是想通过一个具体的众包例子来了解一下众包算法。 Mr. 王:好,我们就从计算机的角度用具体的例子来分析一下众...

36870
来自专栏机器之心

从PyTorch到Mxnet ,对比7大Python深度学习框架

选自kdnuggets 作者:Madison May 机器之心编译 参与:王宇欣、李亚洲 选择什么深度学习框架一直是开发者非常关心的一个话题,而且深度学习框架...

56860
来自专栏数据和云

嘉年华专访 | 国际上智能运维研究

张圣林,南开大学助理教授,于2017年7月获清华大学工学博士学位(计算机科学与技术专业)并获得清华大学优秀博士学位论文,导师是刘莹老师和裴丹老师。

54030
来自专栏人工智能

机器学习并不难

在这篇文章中,我们将讨论一般情况下的机器学习的方法以及其与数据库之间的交互途径。如果你是一个不知从何开始学起的初学者,有兴趣知道到底为何我们需要机器学习,并且疑...

25490
来自专栏xingoo, 一个梦想做发明家的程序员

白话推荐系统——从原理到实践,还有福利赠送!

之前流水账似的介绍过一篇机器学习入门的文章,大致介绍了如何学习以及机器学习的入门方法并提供了一些博主自己整理的比较有用的资源。这篇就尽量以白话解释并介绍机器学...

22660
来自专栏新智元

新数学框架“终极算法”理论提出,或让机器诞生意识

20760
来自专栏机器人网

三种人工智能开源框架

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流...

23010

扫码关注云+社区

领取腾讯云代金券