在虚拟现实中构建的过程有着一种神奇的感觉。想象一下能够组装无重量的汽车发动机,布置动态的虚拟工作空间,或者用无限砖块建造想象中的城堡。在教育、企业和工业培训以及桌面游戏和实时策略游戏等各种体验中,布置或者组装虚拟物体是一种常见情景。
Barrett Fox和Martin Schubert的客座文章
Barrett是Leap Motion的主要虚拟现实互动工程师。通过混合原型制作、工具和工作流程的搭建,并结合用户反馈循环,Barrett一直在推动和探索计算机交互的边界。
Martin是Leap Motion的主要虚拟现实设计师和技术支持。他创建了多种体验,如Weightless、Geometric和Mirrors,并目前正在探索如何使虚拟世界更具触感。
Barrett和Martin是Leap Motion团队中的精英成员,以创新和有吸引力的方式展示虚拟现实和增强现实交互设计的实质性工作。
最新消息(2018年3月18日):Leap Motion已经发布了脚手架演示,任何配有Leap Motion外设的用户都可以下载并尝试。他们还发布了一个视频,展示了成品原型的样子(见上方)。
在我们最新的交互研究中,我们探索了如何使建造和堆叠的交互感觉流畅、响应迅速和稳定。在保留适当的物理模拟的细微差别和丰富性的同时,我们如何能够快速准确地放置、堆叠和组装虚拟物体?
挑战
用手直接操纵物理模拟的虚拟物体是一项极其复杂的任务。这也是我们开发Leap Motion互动引擎的原因之一,其目的是使抓取和释放虚拟物体的基础元素变得自然。
然而,对物理模拟的物体进行精确的旋转、放置和堆叠,虽然完全有可能,但需要熟练的操作。特别是堆叠是一个很好的例子。
在虚拟现实中进行堆叠操作不应该像拆弹。
当我们在物理世界中堆叠物体时,我们通过触觉感知塔的稳定性的许多方面。将一个积木放在一堆物体上时,我们能感觉到持有的积木何时何地与结构接触。在那一瞬间,我们感受到实际的物理阻力。
在虚拟现实中消除这些问题的最简单方法是禁用物理模拟,只是简单地移动物体。这确实消除了意外碰撞和意外推动。
在禁用重力和惯性的情况下,我们可以任意组装积木,但缺乏与真实世界中进行相同任务时重要的基于物理的行为的逼真性。
然而,这个解决方案远非理想,因为精确的旋转、放置和对齐仍然具有挑战性。此外,禁用虚拟物体的物理模拟会使与之交互变得不那么引人入胜。在虚拟现实和增强现实中,物理模拟的虚拟交互本身就具有一种固有的丰富性,当您能够用自己的双手操作时,这种丰富性更加突出。
可展开脚手架
最好的虚拟现实和增强现实交互设计通常将现实世界的线索与媒体独特的可能性相结合。在探索如何更容易地在物理世界中组装物体时,我们看到了尺子和测量带的用于对齐的例子,以及脚手架的概念,这是一种用于支撑材料以辅助建造的临时结构。
可吸附的网格是平面3D应用程序的常见特征。即使在虚拟现实中,我们也可以看到早期的实现,例如Google Blocks中非常完美的实现。
然而,我们提出的想法不是在整个世界中覆盖网格,而是将它们作为离散的体积工具。这将是一个临时的、可调整大小的三维网格,可帮助创建虚拟物体的组合-一个可部署的脚手架!当物体放置到网格中时,它们会自动吸附并由物理弹簧保持,从而在整个交互过程中保持物理模拟。一旦用户完成组装,他们可以将脚手架收起,然后开始进行其他操作。在组装完成后,他们可以停用网格。这会释放弹簧并使物体返回到无约束的物理模拟状态。
为了创建这个脚手架系统,我们需要构建两个组件:(1)一个可部署、可调整大小且可捕捉的3D网格,以及(2)一个示例对象集合供组装使用。
生成一个3D网格
围绕脚手架交互的可视网格的构建很直接。但由于我们希望能够动态改变脚手架的尺寸,因此一个场景中可能会有多个脚手架(甚至多个场景中可能有多个脚手架)。为了优化效果,我们创建了一个自定义的GPU实例化着色器来渲染我们的脚手架网格中的点。这种对相同对象进行重复渲染的方式非常适合放在GPU上,因为它能够节省CPU周期,保持我们的帧率高。
在开发的早期阶段,将这些点进行色彩编码是很有帮助的。由于网格将被动态调整尺寸,颜色有助于识别我们要销毁和重新创建的对象,或者我们的点排序是否有序(并且这看起来很漂亮,我们喜欢彩虹色)。
基于着色器的网格悬停效果
在我们的工作中,我们力求使事物对我们的行为产生反应,以增强存在感和让VR成为如此美妙的媒介的神奇感。VR缺乏我们在物理世界中依赖的许多深度线索,因此反应性对于提高我们的本体感(我们对身体不同部分相对位置的感知)也非常重要。
基于这一点,我们不仅仅停留在制作一个立方体网格的阶段。由于我们使用自定义着色器来渲染网格点,我们可以为着色器添加功能,以帮助用户更好地理解他们手部的位置和深度。因此,当你的手靠近时,我们的网格点会变大并发光,使其更加响应和易于使用。
制作对脚手架做出反应的块及它们的幽灵
将可以放置在(并与)我们的新网格中进行对准的对象创建始于将InteractionBehaviour组件添加到其中一个块模型上。结合Interaction Engine,这个组件负责使对象可抓取。为了使块能够与网格交互,我们创建并添加了另一个MonoBehaviour组件,我们称之为ScaffoldBehaviour。该行为尽可能处理与块相关的逻辑,以便网格类保持简单并且易于使用(是的,这是一个词)。
与网格本身一样,我们已经学会考虑与交互本身对应的工具的使用价值。我们设计了交互逻辑,以创建和管理块的幽灵,这样当你释放块时,你可以轻松地知道块将去哪里:
使用Interaction Engine手柄调整网格大小
通过构建可以抓取和拖动的手柄,用户可以调整脚手架以适应特定区域。我们使用Interaction Engine的行为创建了球形手柄,并将其限制在其控制的轴上移动。这样,如果用户将块放置在脚手架上,并拖动手柄使网格变小,块将被释放。相反,如果拖动手柄使网格变大,并且已经在这些网格点上放置了块,那么块将自动回到原来的位置!
继续阅读第2页:小部件的阶段、状态和形状 »
小部件的阶段、状态和形状
现在我们有了一个可调整大小的3D网格,并且能够在将对象吸附到位置之前显示对象的幽灵位置,现在是将这个功能捆绑到一个小部件中的时候了。我们希望能够使用多个脚手架,并且能够释放脚手架小部件,使其动画到最近的表面上,自动对齐,并在落地时自动展开其手柄(呼!)。为了管理这种更高级功能所带来的所有状态变化,我们创建了一个名为Scaffold的类,位于层次结构的顶层,并控制其他类。
对于这种功能,我们有一个简单的状态机,有四种状态:
锚定状态:除了可抓取的图标外,隐藏脚手架的所有特征。
被持有状态:脚手架的网格和手柄显示出来。我们运行逻辑来找到合适的表面。
降落:当脚手架被放开时,它会动画并与最近的表面对齐。
部署:这是脚手架网格及其手柄的主要活动状态。
预部署锚定阶段是网格完全收缩的状态,此时它可以附加到浮动的手部菜单槽位上,或者放置在环境中的某个位置,以待拾取。在这个状态下,我们将小部件缩小为一个3D图标,只有三个彩色球体和一个较大的白色锚定球体。
一旦你拾取了图标小部件,我们就进入了持有/放置状态。图标变成了具有完整功能的小部件,其红、绿和蓝色轴手柄被收回。在持有它时,我们从小部件中向外投射光线,寻找一个合适的放置表面。旋转小部件可以对准光线投射的方向。
当光线投射到达目标表面时,我们显示一个灰色虚影版本的扩展小部件,对齐到目标表面上。当你指向一个可用的表面后释放小部件时,小部件将动画到目标位置,然后自动展开轴线,生成一个3D脚手架。
部署的小部件需要一些功能:通过推动或抓取轴手柄来调整每个轴线的大小,通过抓取较大的白色锚柄来拾取整个脚手架并将其放置在其他位置上,并且可以停用/重新启用脚手架。
小部件本身的形状经过了几次迭代,灵感来自测量带和其他手持建筑辅助工具以及基于软件的变换工具。我们关注了轴手柄(红、绿和蓝色)、锚手柄(白色)的重要直接交互要素,以及白色外壳的暗示的方向性。
彩色轴手柄可以推动或抓取拖动:
可以通过抓取较大的白色锚柄来拾取整个小部件和脚手架。这暂时将小部件返回到持有/放置状态,并在新的可行目标位置上进行光线投射。
通过翻转开关,可以收回轴线并停用整个脚手架:
现在我们终于进入了有趣的部分:叠放东西并将它们推倒!网格单元大小是可配置的,并且会被缩放到适合手部的舒适尺寸,比乐高积木大一些,比砖块小一些。我们建模了一些简单的形状,并创建了一个小的倾斜环境来设置和推倒组件。然后我们努力达到一种平衡,以便通过互动符号和视觉提示,帮助用户快速准确地创建组件,而不感到不知所措。
当你靠近任何一个块时,它的颜色会稍微变亮,这是由于接近性而驱动的。当你拾起一个块时,它会发出明亮的发散高光,使“抓取”状态非常清晰:
当你将一个持有的块带入网格时,一个白色的虚影版本会出现,显示最近的可行位置和旋转。当虚影是白色时释放块,它会自动固定在位。如果虚影与已占用的空间相交,虚影会变成红色。当虚影是红色时释放块,块就不会自动固定到网格中,而是从手中掉落。
一旦块被固定到网格中,凹槽会在它们的角落处展开以强调它们被脚手架固定住的感觉:
最后一个也许最重要的部分是调整整个交互过程中的物理感。作为参考,这是当我们在将块固定到脚手架后禁用物理效果时的效果。
与块的互动(或缺乏互动)突然感觉空洞和不令人满意。从碰撞到非碰撞的交互规则突然切换感觉不一致。也许如果在网格中放置块时变为虚影,这种变化就不会那么突兀…但是如果我们添加弹簧并保持块的可碰撞性,会发生什么呢?
好多了!现在感觉更像是网格是一个结构化的力场,将块保持在固定位置。然而,由于块仍然保持可碰撞性,所以也可以更像是弹簧。当组装过程受到强烈干扰时,方块会相互碰撞,由于它们的弹簧会试图将它们推回到原位。
幸运的是,由于我们在虚拟现实中,我们可以简单地使用图层来设置方块在网格中只与手碰撞,而不会互相碰撞。
这种做法在保持互动中的物理性的同时,又不会因碰撞混乱而牺牲速度和准确性。现在是时候来玩转我们的方块了!
您对虚拟现实中这种堆叠和组装的概念有何看法?您希望看到哪些应用程序具备这种功能?请在评论中告诉我们!如果您想要尝试一下这个演示,请在本周稍后访问Leap Motion的博客。我们将分享演示以及完整的深入解析如何构建它的。
更多内容:
Leap Motion 探索使无需控制器输入更直观和沉浸的方式
召唤与超能力 – 在远离的距离里设计虚拟现实互动
图片来源:Leap Motion、CanStock、Medium、Google、Sunghoon Jung、Epic Games
0