做了一个月的 VR 游戏主播之后,除了越发沉迷于《半条命:Alyx》之中,我还在思考另外一个问题:现在的 VR 还差点什么?
作为一名“中之人”,我在直播时会用虚拟形象来解说——我相信,如果未来一定要有一个虚拟世界,我们跟自己的数字替身要“深度绑定”在一起。这个绑定不仅是外在认知上的,还有真实世界和虚拟世界中的体验应该是共通的。
玩家知道,VR 游戏与传统游戏拥有着截然不同的体验。在 VR 游戏里,你不必哈腰坐在电脑前,摆弄着鼠标键盘。你真的可以用双手手柄当作枪,瞄准敌人、扣动食指按压扳机,今天的 VR 游戏已经能非常准确地识别手指动作——但你却无法在 VR 世界中捡起一节掉落的弹夹。
偶然间,我在油管闲逛时,看到 Lucas(一个美国的 VR 创业团队创始人)制作了一款 VR 触觉手套,重点是所有零件成本,他只花了 60 美元。
我将这条视频申请转载到自己的账号上,没想到反响热烈。加上 Lucas 的那句“你真的可以用它来触摸任何东西”,加重了我的好奇心。顺藤摸瓜,我在 GitHub 上找到了开源的教程,准备动手做一对。
目前的技术来说,我并没有期待“能触摸到任何东西”的 VR 外设出现。但打动我的也正是这一点。目前 VR 市场上,除了一个头显、两个手柄,就没什么所谓的新东西了,任何能以“平民价格”扩展用户体验的尝试,我觉得都值得一试。
1987 年,还是任天堂红白机的时代,手套作为体感游戏的外设就已经承担起“输入设备”的功能。
Power Glove丨YouTube“Gaming Historian”
现实中的你如果想摸到游戏里那把枪,除了让计算机识别你的手在动,建模出虚拟的手跟着真实的手同步运动(信号输入功能),还要等到虚拟的手握住枪时,返回一个信号——这个信号作用在手上,也就是我们常说的力反馈。
Meta 曾经放出触感手套的视频,采用微流体(microfluidics)技术,使用气致动器(pneumatic actuators)通过气泡充气、放气的方式制造精准压力。为此 Meta 称还在构建一个高速微流体处理器。本来大家还在欣慰“all in”元宇宙的扎克伯格,终于拿出来点儿东西时,另一家触感手套开发商 HaptX 说,“Meta 是抄我们的!”
Meta 研发了七年,HaptX 研发了十年,谁抄谁我们不得而知,但确定的事,VR 相关技术从面世到成熟(最起码价格上被普通用户接受)需要很多年的沉淀。
如何以“极低成本”实现力反馈让我兴奋。当我翻阅教程之后,发现 LucidVR 用了一种特别“取巧”的方式。如果说 Meta 和 HaptX 是让你的每一寸手部皮肤都是受力点,那 LucidVR 这副手套只把力反馈给指尖。
简单来说,当即将抓住物体的一刻,手指要被立即拉扯住,防止进一步弯曲。因为弯曲幅度不同,意味着手里“握”着的物体大小、形状都不同。控制手指不能继续弯曲的方式,就是给指尖一个“反作用力”。
所以手套的主体部分就是一个“总闸”,延伸出去五根套在指尖的拉绳,随时喊停。
舵机与电位器相连。
当轮轴转至(舵机)限位时,舵盘就会挡住轮轴上的螺丝钉,让轮轴无法继续转动,拉绳不能继续展开。
丨作者供图
当我知道力反馈的原理之后,还需要搞清楚何时,以及如何“关闸”。
“何时”很好理解,就是当虚拟的手触碰到虚拟世界的物体的时刻。因此我们需要做一个媒介,让生物体的动作信号和计算机的电信号能相互转换,彼此“理解”。这也是我认为这副手套最为巧妙的设计。
旋转式电位器(其原理类似于初中课本上的滑动变阻器)与拉绳连接使用,当手指弯曲时,五条拉绳分别带动五个电位器,拉绳拉出的长度被转化为电位器阻值的变化,传递给虚拟世界做解析。
在建模“数据手套”上,也有例如基于 IMU(惯性测量单元)或弯曲传感器的其他实现方式。所谓惯性传感器是测量物体三轴姿态角和加速度的装置,一般包括三轴陀螺仪、加速度计、磁力计来进行多传感器数据融合,以重建每根手指的三自由度方向。弯曲传感器更好理解,手指在做弯曲动作时,发生物理变形来使传感器阻值发生变化。
这两者传递数据明显更加精准,但为什么不用?答案只有一个:更昂贵。
借助 3D 打印的轮轴把电位器和拉绳“连”起来丨作者供图
了解完何时“关闸”,还有如何“关闸”。显然,拉绳需要一个装置,在其伸缩过程中“卡”住它。我跟着教程买回了 MG-90S,航模中常见的舵机,也很便宜 10 元一个。
看完一遍教程,我迅速掌握了原理,对自己说,这“貌似”挺简单的?不就先这样,再这样,最后那样?
我立刻在电商平台下单了所有零件,都是一些生活中常见的工具。唯独有一部分没法买到的现成品(将各模块拼装起来的骨架),我是根据开源的零部件参数,用家用 3D 打印机解决的。
然后,这一做就是一个月啊……同时我深刻理解了“取巧”的另一层含义是“还不完美”。
当我戴上做好的触觉手套,调整好 Valve Index(VR 头显)的位置,启动游戏《半条命:Alyx》。我身处熟悉的“17 号城市”,从背包中掏出手枪,瞄准散落在街边的酒瓶,“砰!”在开枪的一瞬间,我脑补应该有一股后坐力传来。实际上,仅是我的食指在扣动扳机的那一刻被拉住了——要说这体验比在公园打气球还“塑料”。
但是我应该是成功了吧!我换了一个散落在街边的酒瓶子,“拿”在手里,我能大概“摸”出,它是一个圆柱体。
首先是“识别准确率”问题。我们需要先明白,定位追踪和局部追踪是两个概念,手套整体的定位追踪可以通过附加 Vive Tracker、Oculus 手柄,这样现成的追踪技术来实现。
手指的局部追踪才是一款力反馈手套要去解决的重点。我在组装时就发现,这副手套设计并非为每个指关节附有传感器,手指的弯曲状态只能通过拉绳转化的电阻信号被大概建模出来(为此 Lucas 可能设计了一套软件),不够精确到每一处关节。
其次是“识别范围”问题。同样是因为手套简陋的构造,我的手指只能在上下运动时被识别,左右展开,旋转等其他自由度是无法实现的。但是 Lucas 告诉我,他已经在解决这个问题,下一版手套将会增加左右展开的自由度,实现方式是在第一节指关节处增加一个电位器。
识别准确与否,会影响力反馈的效果。另外一个因素,就是限位位置的调整。手指的不同弯曲程度,与不同的限位位置一一对应,驱使舵盘转向不同的角度,再作用给正在伸缩中的拉绳。
在我的理解中,能实现这一点,是 LucidVR 系统预设好了这种“对应关系”。
但是每个人手部状况不尽相同,需要在使用前,对限位做“个人化”的校准。调太紧导致,还没等抓到物体手就被拉住;调太松导致,拿到物体就跟空手握拳一样。
这一点没有简便的方法,只能在戴上头显时,感受松紧,“估算”限位位置。摘下头显之后,拧开舵机螺丝,调整舵盘,如此反复,直到在虚拟世界中正巧抓住物体。
除此之外,长时间的拉伸,会导致拉绳、手套变形。由于整套装置并非完全贴合在手上,而是粘在手套上,手套的轻微移位也会带来力反馈的误差。
在我调试很多遍之后,舵机依然纹丝不动。我跑到 Discord 上面求助,网友告诉我,并不是舵机线跟开发板连错了,而是电流太小了,带不起舵机。我需要单独给舵机连接一个新的充电宝,而不是跟开发板共用一个充电宝。
LucidVR 的 Discord 讨论组里有 14000 个关注者。有人将这副手套改良,把拉绳换成更加坚韧的塑料片,解决拉绳容易变形的问题。
也有人直接改变构造,做成了外骨骼形状,留出空间加更多传感器。很多的开源项目,都不会面面俱到,相反他们会留出很多“空白”,让技术爱好者自行探索。
Lucas 在他的演示中,把戴了手套的 VR 体验描绘得令人异常兴奋。在《半条命:Alyx》中,你可以拾起易拉罐,再扔出去,走到车旁,开门上车,甚至遇到危险时,爬墙而逃。不过,这更多是带入其他感官体验的“脑补”,你最多体验到顶在一面墙上的阻力,不会有克服重力向上攀爬的感觉。
明知道这些,当我第一次戴上这只手套,感受着物体是大是小,是圆是方,即便只是从指尖传来的生硬“触感”,仍然让我觉得新奇。在此之前,我甚至无法想象“空握”一只玻璃瓶。
几乎在做手套同时,我自制了 SlimeVR 全身追踪器。与手套“同理”,我做了五个传感器分别绑在脚踝、大腿、腰部(因为 SlimeVR 软件没有对上肢建模),五个传感器先通过 T-pose 重置识别出绝对位置,再通过“彼此”识别出相对位置,将电信号解析成虚拟人的动作。配合这副手套(手柄)和头显,就能让“老二次元”在 VRChat 里快乐斗舞。
SlimeVR 也将代码开源丨图片来自 SlimeVR
几个月之前,我将自己制作的视频发在网上,随机收获了很多关注者。当然这还不是令我最兴奋的。“SlimeVR 全身追踪器”视频发出两个月后,其中最重要的零部件——BNO-080(九轴传感器模块)在淘宝上从 90 块钱涨价到 300 块钱。(在此之前,没有人教学自制 SlimeVR 全身追踪器,姑且当作是我激发了老二次元们的热爱吧。)
当然我收到的不都是“赞美”。我 3D 打印了一个能正好装下小风扇的模型,接到头显上,解决闷热的问题。
但这一次,因为使用的风扇过于便宜,我的方案被调侃产生噪音过大——“像飞机场”。