当你尝试VR的时候,第一件事就是尝试一下“投掷”。拿起虚拟的咖啡杯,把它吸上来。然后它扔出去,杯子(或者甜甜圈、球)开始在空中疯狂打转,飞向盆栽。入门的教程都会讲到。

为何VR中的投掷效果差?

泰课在线上图中我在向对面的白板投掷易拉罐

你的一些投掷飞的太远,又有一些飞的太低。总有那么一两个砸在被困扰的NPC上。也许我们在VR的第一课就是,准确的投掷确实是很难。当有这样经历的时候,我认为这是因为我还不擅长玩VR。大家都接受了这个观念:掌握怎样控制是本来就是学习VR游戏过程的一部分。但是当投掷同样的动作产生很大差异的结果的时候,你还是非常沮丧。用力的投掷却落在很近的地方。

泰课在线 尝试去夹住一个水瓶。手腕只是轻轻一弹东西就飞走  
泰课在线只是轻轻活动一下手腕就可以掷出去  

 Rescuties:一款折腾小孩的游戏   
在夏天,我一直在做一个休闲动作游戏称为Rescuties。 这是一个关于投掷和捕捉婴儿(或者其他可爱的动物)的VR游戏。在VR中,如果世界以与我们的直觉相矛盾的方式对我们做出反应,我们不能使玩家沉浸其中,或者我们会给玩家太多挫败感。 作为一个游戏,所有关于投掷,Rescuties不能依赖一个机械物理规律是令人沮丧的。

泰课在线

挫败感是这类游戏设计中与生俱来的。简而言之,投掷VR很难,因为你无法感觉到虚拟对象的重量。解决的方案方法各不相同 - 但大多数游戏都尽量尊重你所持有的虚拟对象的物理性质。你抓住一个对象,在游戏中就会对应的应用一些虚拟动量,然后关闭它。
这里的问题:你在现实生活中的感觉和虚拟世界中发生的事情之间是割裂的。当你拿起一个虚拟对象,该对象实际的质心和你感觉到的质心确实会存在不一致。你的肌肉得不到正确的物理信息
当你投掷,如果你只是在一个方向向前移动自己的受,这种偏差还不会有太大关系。但当你尝试去弯曲你的手臂,旋转你的手腕,然后去投掷。 (关键是投掷的准确? - “这一切都在手腕上!”)当你旋转你的手,你最终对虚拟对象施加大于真是情况的动量,就像你经由一个勺子把它甩了出去。这是一个不能容忍的问题。在许多VR游戏中,可以“拾起”一个物体,但这个物体仍然离你的手一英尺远。按下一个按钮,物体被附着在你的手上,但物体停留在固定的距离,把你的手活活变成弹射器。三英寸和十二英寸之间的差异意味着轻轻的动一下手腕会发送一个对象穿过房间或只是稍稍的向前轻推它一下。

泰课在线手腕的活动变得像弹射器

 在Rescuties,你捕捉快速移动的婴儿 - 你急于把他们送到安全的地方。 旧的方法导致过于精细的控制而且很容易令人感觉沮丧和不一致。 为什么我不能用我应该能够感觉到的样子去扔掷呢?

物理与虚拟重量  
更好的投掷策略的关键是要按照游戏的物理引擎所建议的那样使尊重用户对于控制的感知。不是测量你持有的虚拟对象的投射速度,而是从你持有的现实生活对象(例如HTC Vive或Oculus Touch控制器)中测量它。 这是你在你手中感觉到的重量和动量。 这是你的肌肉记忆的重量和动量 - 这才是你在现实生活中一直在发展的物理技能和本能 - 正在反应的对象。

泰课在线无论你抬起什么虚拟物体,这个你感觉的质心不会改变。

将物理重量桥接到虚拟的方式是使用物理控制器的质心来确定游戏中的速度。首先,找到真正的质心点在游戏中的位置。控制器告诉你他们在游戏空间的位置;它通过你偷看耳机下面和尝试校准来判断质心在哪里。然后,您在其改变位置时相对于控制器跟踪该点计算其速度。 
 一旦我做了这个改变,我的测试人员在Rescuties游戏中得到更高的分 - 但我仍然看到和感觉很多不一致。

定时
准确地说,玩家打算什么时间投掷一个对象?在现实生活中,当我们扔东西,我们的手指松开,对象开始离开我们的掌握,我们的指尖会继续朝着我们想要的方向推它,直到够不到它了为止。也许我们会在最后一分之一秒通过我们的手指使对象旋转起来。
大多数VR游戏使用食指控制触发器的方式代替这种触觉反馈。它比一个按钮更好但你不能通过你的手指感觉到物体离开你的掌握和滚动。上述手指的打开仅仅是触发器的(可能是逐渐地)释放。我发现,一旦玩家开始松开手指,我就想检测来自玩家的投掷信号。当触发压力缓慢 - 不是一直到0%或最轻微的量(一个通过实验设置的量),检测到抛出。

泰课在线触发器压力随时间的变化曲线 

上图显示了抓取 - 保持 - 抛出周期的触发压力随时间的变化。在这种情况下,用户没有将触发器一直按到100% - 这是HTC控制器的触发器达到〜80%的常见情况,然后你必须显着更难以使他们点击达到100%。首先,触发器被挤压以拾取对象。然后压力基本稳定,因为玩家抓住物体并卷起来投掷 - 在这里你会看到你从触发传感器得到的那种噪音。当对象被抛出或丢弃时,玩家释放触发器。
信号噪声和播放器的心跳可以使触发强度抖动。这需要一种用于检测玩家动作的阈值方法。具体地,这意味着当触发压力比从玩家拾取物体时检测到的峰值触发压力小(例如)20%时,游戏检测到下降。阈值必须足够高,玩家才不会意外丢下一个婴儿 - 这是我通过试验和错误与我的测试人员发现的。类似地,如果你在太低的压力下检测到抓取动作,你将没有足够的余量来检测可靠的投掷/释放。

动量噪声
测量正确的速度和改善时机很好地缓解了投掷不一致。但是我们的源数据本身 - 来自硬件的速度测量 - 相当嘈杂。当耳机或控制器快速移动时,噪声特别明显。 (比如说,当你做一个投掷运动!)处理噪声要求打到平滑的效果。
我尝试用一​​个浮动平均值(也称为低通滤波器)来使速度平滑 - 但这只是导致慢的部分(卷起)与最快的部分(释放)平均了一下 - 至少在某种程度上。我的测试人员发现他们就像在水里扔东西一样费力。 (这是我在娱乐室感觉到的。)

泰课在线平均控制器速度更可靠,但结果速度太慢

我试图采取最近测量的速度的高峰,所以我的测试者看到他们的婴儿飞行至少与他们想要的一样快 - 但往往和他们预想的方向不一致,因为最后测量的方向仍然受到噪音问题。你真正想做的是采取最后几帧的数值,并观察他们的趋势 - 即绘制一条趋势线。 通过测量的简单线性回归给出了看上去更可靠的结果。 最后,当我想放的时候,我就可以把宝贝放在我想要的地方! 

泰课在线调试速度可视化显示,最后四帧中红色表示测量得到的冲量,黄色表示回归得到的冲量

如何改善投掷效果的总结
 1.从用户能感觉到的物体(即控制器)的质心位置来测量投掷的冲量。
 2.更准确的测量用户打算投掷的时刻(即在触发器的压力发生突变的时刻)
 3.充分利用你测量的速度数据(即进行回归,以更好地估计玩家的意图)