交互是沉浸式VR的一个关键方面。为了提高留存并提升整体体验,它必须自然和直观。所以,Meta为Presence Platform带来了Interaction SDK,从而帮助开发者利用模块化和灵活的组件来实现大量交互,从而创建高质量的手部和控制器交互。
在日前发布的博文中,Meta介绍了Interaction SDK的功能、示例和其他资源。视频可以访问YouTube,下面映维网整理了相关的文字说明:
1. 什么是Interaction SDK?
Interaction SDK是一个组件库,用于为你内容体验添加控制器和手部交互。它允许你纳入用户交互的最佳实践,Ray光线投射、Poke戳和Grab抓的交互模型,以及HandGrab、HandGrabUse和Pose Detection的交互模型。
要使用Interaction SDK,你需要安装支持的Unity版本和OculusIntegration包。更多有关先决条件、支持设备、Unity版本和依赖关系的更多信息请查看这一页面。
Meta希望令你的Interaction SDK体验尽可能流畅,所以团队会定期添加新功能,进行bug修复和改进。有关新功能、弃用和改进的最新信息可以查看这一页面。
2. Interaction SDK如何工作?
Interaction SDK中的所有交互模型都由一对Interactor-Interactable组件定义。例如,Ray光线交互由RayInteractor-RayInteractable组件对定义。Interactor和Interactable组件一起构成交互。
更多有Interactor-Interaction的信息请查看这一页面。你同时可以选择使用InteractorGroup并根据多个Interactor的状态来协调它们。这一页面介绍了InteractorGroup是什么,如何使用它们,以及它们如何帮助你协调多个Interactor以创建 InteractorGroupMulti。
如果你想令一个交互依赖于另一个正在进行的交互,你可以在一个主要-次要关系中将交互彼此联系起来。例如,如果你想首先抓取一个对象,然后使用它,这时抓取交互为主要,而使用交互则是次要。更多信息请访问这一页面。
3. 有什么可用的交互?
Interaction SDK允许你实现一系列稳定和标准化的交互,如Ray光线投射、Poke戳和Grab抓等:
3.1 Hand Grab手抓
Hand Grab交互提供了一种抓取对象,并将对象对齐到预先编写的手抓姿势的方法。它使用HandGrabInteractor和HandGrabInteractable进行此交互。
Hand Grab使用每个手指信息,使用HandGrabAPI来通知选择何时开始或结束,HandGrabAPI指示抓取开始和停止的时间,以及抓取姿势的强度。当HandGrabInteractor搜索最佳可交互候选对象并提供所需的必要对齐信息时,HandGrabInteractor指示是否可以抓取对象、对象如何移动、哪根手指执行抓取、用手信息、手指约束、手应该如何对齐等等。这一页面讨论了Hand Grab Interaction的更多信息。
3.2 Poke戳
Poke交互允许用户通过直接触碰与表面交互,例如按下或悬停在按钮之上,然后与弯曲和平面的UI交互。
Poke使用PokeInteractor和PokeInteractable进行交互。PokeInteractor使用名为Pointable Surface的碰撞曲面来计算悬停和选择。更多源于Poke的信息请访问这一页面。
PokeInteractable同时可以与PointableCanvas结合,以实现可直接触碰的Unity UI。这一页面介绍了如何将Interaction SDK与Unity Canvas集成。
3.3 Hand Pose Detection
Hand Pose Detection手势检测提供了一种能够识别手部何时匹配形状和手腕方向的方法。
这个SDK提供了六个示例姿势作为预制件,并展示了Hand Pose Detection的工作原理:剪刀石头布的石头姿势 剪刀石头布的布姿势 剪刀石头布的剪刀姿势 拇指向上姿势 拇指向下姿势 停止姿势
根据所述姿势定义的模式,你可以定义自己的姿势。更多关于姿势预制件包含的内容,请查看这一页面。
这个交互使用ShapeCognition、TransformRecognition、VelocityRecognition和其他函数来检测形状、姿势和方向。ShapeRecognizer允许你指定手指特征,而Transform提供有关方向和位置的信息。更多相关信息请查看Shape页面,Transform页面和Velocity页面。
3.4 Gesture手势
Interaction SDK结合了Sequences和Active State的使用,使得你能够创建手势。你可以使用Sequences链接Active State以创建手势,例如滑动手势。
当满足指定的条件(如形状、变换特征、速度等)时就可以激活一个状态。例如,当手指特征的所有状态与所列形状中的状态匹配时,或者说当满足指定形状的条件时,一个或多个ShapeRecognizerActiveState组件可以变为活动状态。
由于Sequences可以随着时间的推移识别一系列活动状态,所以它们可以用于创建复杂的手势。更多关于Sequences的信息请查看这一页面。
3.5 Distance Grab远距离抓取
Distance Grab交互允许用户选择和移动通常超出臂展范围的对象。例如,这可以意味着将对象吸到手,然后抓住它。 Distance Grab同时支持其他动作。
这个交互使用DistanceHandGrabInteractor和DistanceHandGrabInteractable。这一页面介绍了Distance Grab交互是如何工作,如何选择最佳的远程交互,以及如何自定义交互的行为等等。
3.6 Touch Hand Grab接触抓取
Touch Hand Grab根据碰撞器的配置抓取对象,并令手指动态贴合其表面。这意味着用户可以通过接触表面来抓取交互对象,无需完全抓握对象。
这个交互使用TouchHandGrabInteractor和TouchHandGrabInteractable。TouchHandGrabInteractor定义了接触交互属性,而TouchHandGrabInteractable定义了Interactor用于在选择期间测试重叠的碰撞器。更多关于Touch Hand Grab交互的信息请访问这一页面。
3.7 Transformers变换
Transformers允许你定义在三维空间中操纵可抓取对象的不同方式,包括如何使用可选约束平移、旋转或缩放对象。
例如,可以为对象使用Grab交互、Transformers和Constraints来实现交互,例如在平面上移动对象、使用双手更改其比例和旋转对象等等。
3.8 Ray Interactions射线交互
Ray Interactions允许用户通过光线投射来选择对象。然后,用户可以选择使用姿势进行交互。
这个交互使用RayInteractor和RayInteractable。RayInteractor定义了光线投射的原点和方向,以及交互的最大距离,而RayInteractable则定义了被投射对象的表面。使用手时,HandPointerPose组件可用于指定RayInteractor的原点和方向。更多关于射线交互的信息请访问这一页面。
如果你想了解更多关于上述功能的信息,请查看这个交互文档。
4. Interaction SDK示例
为了方便你尝试相关交互,Meta提供了Interaction SDK Samples应用,并展示了上面讨论的每个功能。这个示例应用程序位于App Lab。为了帮助你更好地理解交互,它将每个功能作为单独的示例突出显示。
在尝试示例之前,请确保你已启动手部追踪。请转到头显端的“Setting/设置”,单击“Movement Tracking/运动追踪”,然后打开“Hand Tracking/手部追踪”。你可以将“Auto Switch Between Hands And Controllers/手和控制器之间的自动切换”选项保留为选中状态,以便在放下控制器时可以使用手部。
进入应用后,页面将显示所有可供尝试的示例交互,包括上面列出的交互。 HandGrab示例:这个示例展示了HandGrabInteractor,并演示了单手抓握姿势。例如,你可以以单手抓握火炬。 Touch Grab示例:这个示例展示了如何通过触摸而不是实际抓取对象来抓取对象。Touch Grab使用对象的物理形状动态创建手势。在这里,你可以找到一个运动学和非运动学的例子来尝试这种交互。 Distance Grab示例:这个示例展示了多种发送信号、吸取和抓握远距离对象的方法。例如,Anchor at Hand可以锚定对象,你可以移动锚点而不实际抓取。Interactable to Hand则显示对象快速朝手部移动,然后保持与手的连接。最后,Hand to Interactable允许你远距离移动对象,就好像你的手就在远距离对象的附近一样。 Transformers示例展示了GrabInteractor和HandGrabInteractable,并添加了物理、变换和对象约束。地图展示了仅平移具有平面约束的可抓取对象。宝石展示了可以用手拿起,扔下,变换和缩放的物理物体。相框则展示了带有约束的单手旋转变换。 Hand Grab Use示例:这个示例演示了如何在HandGrab交互之上执行Use交互。在本例中,你可以抓住喷水瓶并用手指按住扳机。然后,你可以瞄准植物,按下按钮,从而以直观自然的动作洒水叶片。 Poke示例:这个示例展示了PokeInteractor应用在各种具有触碰限制的表面之上。它使用独立按钮或Unity Canvas来演示戳按交互和可按下按钮。 Ray示例:这个示例展示了RayInteractor使用CanvasCylinder组件与弯曲的Unity画布交互。它演示了与Unity画布的射线交互。它同时展示了允许各种材质类型的曲面:Alpha Cutout、Alpha Blended和Underlay。 Poses示例:这个示例展示了六种不同的手部姿势,并带有姿势识别的视觉信号。它检测拇指向上、拇指向下、剪刀石头布和停止姿势。姿势可以由左手或右手触发。它同时会在姿势开始时触发粒子效果,并在姿势结束时隐藏效果。Interaction SDK提供了一个手势创作工具,它允许你启动编辑器,以自然的方式伸出手并握住项目,记录姿势,然后立即使用姿势。 Gestures示例:这个示例演示了Sequence组件与ActiveState逻辑的结。需要注意的是,手势仅在悬停在对象上时才处于活动状态。
更多关于上述示例如何工作的信息,并寻找开始使用它们的参考材料,请查看示例场景和功能场景。
5. 尝试《First Hand》
除了上述示例,Meta同时利用Interaction SDK构建了手部追踪演示内容《First Hand》。这款应用将允许你以双手使用开关、杠杆和虚拟用户界面,以及构建机器人手套等等,从而以裸手方式体验直接用手与虚拟世界交互的魅力。
《First Hand》利用Presence Platform的交互组件、手势和工具库Interaction SDK构建,并包含一系列旨在展示裸手交互魅力的交互模型。它通过App Lab发布,是一个开源项目,面向希望在自家游戏和应用中轻松复制类似交互的开发者。
Meta指出,《First Hand》的灵感来自于Touch控制器演示内容《Oculus First Contact》,而《Oculus First Contact》不仅是一种愉快的体验,而且重新定义了与六自由度控制器的交互类型。所以对于《First Hand》,“我们希望同样以类似的方式来激励开发者构建突破性的内容。”
《First Hand》展示了Meta认为最神奇、最强大、最容易学习、但又适用于众多类别内容的手部交互。团队表示,通过Interaction SDK提供的先进直接触摸启发法(如触摸限制,防止手指意外穿过按钮),与虚拟现实中的2D UI和按钮进行交互感觉非常自然。
这个工具同时展示了SDK提供的多种抓取技术。用手直接与虚拟世界交互有其内在的意义,但团队发现相关交互需要仔细调整才能真正发挥效用。在应用程序中,你可以通过与各种对象交互来进行实验,甚至可以通过用力挤压岩石来真正压碎岩石。
进入《First Hand》后,你将会看到一张桌子摆放着可以与之交互的各种物品。你可以看到映射着真实手部动作的虚拟双手。你会注意到你左边的一个灯在闪烁,这表明你可以与它交互。它告诉你一个快递包裹正在等待你签收。然后,你可以按下签收按钮。这主要演示了HandGrab和Poke交互。
包裹签收后,系统会提示你拉动手柄。拉动手柄会打开包裹。这演示了HandGrab交互和one-handed rotate transform单手旋转变换。接下来,你需要输入写在数字键盘的代码以解锁包裹。这使用了Poke交互。
接下来,一个转轮出现在你面前,你可以用手抓握并转动它。这将打开对话框,并出现一个可交互的UI。你可以通过所述UI创建自己的机器人手套。
你可以用手导航UI,并点击选择要首先创建的手套哪个部分。这演示了Poke交互。选择第一个部分,它将在你面前显示手套的部分。你会看到三种颜色选项。滑动以选择你喜欢的颜色。这演示了滑动手势检测功能。你可以拿起它,缩放它,旋转它,或者移动它。这个交互使用Touch Grab交互和Two Grab Free Transformer。一旦你选择了一种颜色,你就可以按下按钮进行实际构建。然后,你可以转到下一节,并以类似的方式创建手套的其余部分。
一旦你的手套准备完毕,系统会给你三块石头,你可以在它们之间进行选择并添加到你的手套中。你可以通过抓住一块石头进行装备,然后你可以通过用力挤压石头,压碎它,令它露出水晶。这是一种Use Grab交互。一旦水晶准备完毕,你就可以把它放在手套进行激活。现在,你拥有了超能力手套。
接下来,一个物体开始围绕你飞行,并尝试用激光攻击你。你可以使用你的超能力向目标射击,并同时躲避对方的攻击。射击时,你可以张开手掌瞄准。如果要创建一个盾牌,请双手合十。这显示了如何将姿势检测用于双手姿势。基于正确的姿势,它执行适当的动作。
最后,你会看到手套有一个蓝色按钮,并允许你通过戳压来选择。它可以将你传送到一个可以远远看到钟楼和其他可交互对象的世界,从而令玩家畅想交互可以解锁的能力。
建立裸手交互体验需要跨多个约束进行优化:技术(如追踪能力)、生理(如舒适度和疲劳度)和感知(如手-虚拟对象交互表示)。
《First Hand》展示了Meta认为最神奇、最强大、最容易学习、但又适用于众多类别内容的手部交互。团队表示,通过Interaction SDK提供的先进直接触摸启发法(如触摸限制,防止手指意外穿过按钮),与虚拟现实中的2D UI和按钮进行交互感觉非常自然。
为了帮助你更轻松地使用所述交互,Meta创建了一个开源项目,演示了如何使用Interaction SDK创建《First Hand 》应用地各种交互。在下一节中,团队将向你介绍Unity中的Interaction SDK软件包以及如何设置《First Hand》示例的本地副本。
6. 设置《First Hand》示例的本地副本
6.1 设置
要获得示例的本地副本,你需要在PC或Mac安装Unity并安装Oculus Integration软件包。本次演示使用了Unity 2021.3.6f1进行设置,但你可以使用任何支持的Unity版本。更多有关先决条件、支持设备、Unity版本和依赖关系的更多信息请查看这一页面。Oculus Integration SDK可以从Unity Asset Store或Oculus开发者中心下载。
你哦同时应确保头显端已打开“开发者模式”。你可以通过头显或MetaQuestapp完成这一操作。对于头显端,请依次转到设置→ 系统→ 开发者,然后打开USB连接对话框选项。对于Meta Quest app,你可以进入菜单→ 设备→ 从列表中选择头显,然后打开“开发者模式”选项。
安装Unity后,打开一个新的3D场景。要安装Interaction SDK,请转到窗口→ Asset Store,并查找Oculus集成包,然后单击“添加到我的Asset”。要安装Oculus Integration软件包,请打开软件包管理器,单击“导入”,然后将文件导入到项目中。
如果系统检测到OVRPlugin存在新版可用,建议使用最新版本。继续并启用它。
如果要求将OpenXR用于OVRPlugin,请单击“使用OpenXR”。只有OpenXR后端才支持Passthrough API等新功能。你可以随时通过Oculus→ Tools→ OVR Utilities Plugin切换legacy和OpenXR后端。
它将确认选择,提供一个选项来升级Interaction SDK并执行清理以删除过时和弃用的asset。请允许它这样做。另外,你可以随时通过Oculus→ Interaction → Remove Deprecated Assets来执行这一操作。
安装后,你可以在Oculus下的Interaction文件夹中找到Interaction SDK组件。
由于你是为为Meta Quest构建内容,请确保平台更新为Android。为此,请转到文件→ 生成设置→ 选择Android并选择“Switch Platform”
6.2 Interaction SDK软件包有什么?
Interaction SDK组件在Oculus下的Interaction文件夹。SDK包含三个文件夹:Editor、Runtime和Samples。Editor包含SDK的所有编辑器代码,Runtime包含Interaction SDK的核心运行时组件,Samples包含前面讨论的Interaction SDK示例演示所使用的场景和asset。
在Samples下,单击“Scenes”。在这里,你可以找到示例场景、功能场景和工具。Example Scenes目录包含你之前在Interaction SDK示例应用程序中看到的所有场景。Feature Scene目录包含专用于任何单个功能基础的场景,Tools目录包含Hand Pose Authoring Tool等助手。我们打开其中一个示例HandGrabExamples,看看场景设置、脚本和其他组件,以及如何使用它们来构建你在示例中看到的交互。
打开任何示例场景时,系统可能会要求你导入TMP essentials。然后你的场景就会打开。
下面我们看看部分游戏对象和脚本,了解它们的工作原理: OVRCameraRig:这个预制件提供了表示Oculus追踪空间的变换对象。它包含一个TrackingSpace游戏对象及其下的OVRInteraction游戏对象。 TrackingSpace:这个预制件允许用户微调头部追踪参考帧和世界之间的关系。在Tracking Space下面,你会找到一个center eye anchor,这是主要的Unity camera,每只眼睛有两anchor game object,控制器则是左右手anchor。 OVRInteraction:它包含OVRControllerHands和OVRHands。
关于OOVRIntegration预制件的更多信息以及它如何与OVRHands一起工作,请查看这个Input文档。
OVRCameraRig预制件附带两个主要脚本:OVRManager和OVRCamera Rig。
OVRManager是VR硬件的主要接口,并向Unity引擎expose相关的Oculus SDK。它包含目标设备、性能、追踪和色域的设置。除了所述设置,OVRManager同时包含Meta Quest特定的设置: 手部追踪支持:这允许你为应用程序选择所需的输入启示类型。你可以选择“仅控制器”;“控制器”和“手”并在两者之间切换;或仅“手”。 手部追踪频率:你i可以从列表中选择手部追踪频率。更高的频率可带来更好的手势检测和更低的延迟,但会占用更多的性能。 手部追踪版本列表:这个设置允许你选择要使用的手部追踪版本。选择v2以使用最新版本的手部追踪。最新的版本允许你更接近在VR中构建沉浸和自然的裸手交互。
如前所述,每个交互都由一对Interactor和Intractable组成。Intractable是手或控制器将与之交互的刚体对象,它们应始终具有Rrabbable组件。更多有关Grabbables的信息请查看这个页面。
这个示例演示了HandGrabInteractor和HandGrabInteractable对。HandGrabInteractor脚本位于OVRInteraction → OVRHands → Choose LeftHand or RightHand→ HandInteractorsLeft/Right → HandGrabInteractor。
刚体对象的对应位于Interactables → Choose one of the SimpleGrabs → HandGrabInteractable。它包含HandGrabInteractable脚本,而HandGrabInteractable用于指示对象可以使用手或控制器并通过Hand-Grab进行交互。它们需要一个用于Interactable 的刚体组件和一个用于3D操纵的Grabbable组件。
现在,你已经基本了解如何使用OVRCameraRig、OVRManager、OVRInteraction设置场景,以及如何添加 Interactor-Interactable对。下面我们来看看如何设置《First Hand》示例的本地副本。
6.3 从GitHub克隆并在Unity中建立《First Hand》示例
GitHub repo包含Unity项目,其演示了《First Hand》应用程序中呈现的交互。它设计用于手部追踪。在本地设置示例的第一步是克隆repo。
首先,你应该通过运行以下命令来确保安装了Git LFS: git lfs install
接下来,通过运行以下命令从GitHub克隆repo: git clone https://github.com/oculus-samples/Unity-FirstHand.git
项目成功克隆后,在Unity中打开它。如果使用不同版本的Unity,你可能会收到警告。接受警告后,它将解析软件包并使用你的Unity版本打开项目。这可能会触发另一个警告:Unity需要更新URP材质以便启动项目。接受它,项目将加载。
主要场景称为 Clocktower钟楼场景。所有实际项目文件都位于“Assets/Project”中。这个文件夹含有运行示例的所有脚本和asset,不包括Interaction SDK的一部分。这个项目已经含有Oculus SDK的v41,包括Interaction SDK。你可以在Assets/Project/Scenes/Clocktower下面找到主场景。就像以前一样,如果你没有TMP essentials,请导入它,场景将成功加载。
在构建场景之前,请确保将“Hand Tracking Support”设置为“Controllers and Hands”。要执行这个操作,请转到Player → OVRCameraRig → OVRManager。
在Hand Tracking Support下面,选择“Hands and Controllers or Hands only”。将Hand Track Version设置为“v2”以使用最新版本,将Tracking Origin Type设置为“Floor Level”。确保你正在构建的平台是Android。要生成,请转到 File → Build Settings设置并单击“Build”。
你可以选择单击“Build and Run”直接在头显加载并运行它,或者从Meta Quest Developer Hub(MQDH)安装并运行它。
如果选择使用MQDH,可以将apk拖到应用程序之中,然后单击安装以在头显安装并运行。
当加载示例时,你将看到《First Hand》中的可交互对象。你同时会看到一个启用爆炸和盾牌手势的选项,以及启用远距离抓取的选项。你将能够使用Poke交互与前面的UI交互。你同时可以像在《First Hand》中那样用手套与物品进行交互。请注意,这个示例仅展示了《First Hand》的交互,它不是完整的游戏。
下面列出了本示例中可以与之交互的对象及其演示的交互类型:
以上演示了《First Hand》用Interaction SDK创建的各种交互。下面我们来看看相关的资源和最佳实践。
7. 最佳实践
为了令手部追踪成为VR中有效的交互手段,它需要感觉直观、自然、轻松。然而,手不像其他输入方式那样带有按钮或开关。这意味着没有关于如何与系统交互的暗示,同时没有触觉反馈来确认用户的动作。
为了解决这个问题,Meta建议通过清晰的能指和对所有交互的持续反馈来传达可供性。你可以用两种方式来考虑这一点:能指,传达用户可以对给定对象做什么;反馈,它在整个交互过程中确认用户的状态。
例如,在《First Hand》中,视觉和听觉反馈在提示用户与对象交互方面起着重要作用;装置会发出嘟嘟声并发出红光,从而告知玩家应该按下按钮,发光的物体有助于玩家识别何时可以从远处抓取物体,UI按钮的颜色变化会在选中时确认用户的选择。另外,创建提示以引导玩家非常有效。
手的移动方式和姿势几乎无穷无尽。这带来了一个充满机会的世界,但同时会造成混乱。通过限制系统可以解释哪些手部动作,我们可以实现更精确的交互。例如在《First Hand》示例中,玩家可以抓取某些对象,但不能抓取所有对象。他们可以抓取、移动和缩放一些对象,但不是所有对象。另外,为了防止对象变形,不允许他们仅在一个方向进行缩放。
SnapInteractors是放置区域交互和固定项目的绝佳选择。你会看到《First Hand》中有广泛使用,尤其是手套构建场景之中。
Interaction SDK的Touch Hand Grab交互可用于小型对象,尤其是没有自然方向或抓取点的对象,你无需使用预先编写的姿势限制玩家。
对于用户无法触及的对象,光线投射在选择对象时非常方便。Distance Grab同时是另一种选择,可以帮助用户轻松地与对象进行交互,无需用户走向对象或伸手接触对象。这可以令你的体验更直观。
Distance Grab易于配置。通过重复使用为常规抓取设置的相同手部姿势,你可以在设置Distance Grab项目时节省时间。在《First Hand》示例中,你可以看到如何使用Distance Grab从远处抓取对象,以及来自手的视觉光线如何确认将抓取哪个对象。
在设计你的裸手交互体验时,追踪和人体工程学发挥着巨大的作用。头显的传感器能看到的手部范围越多,追踪就越稳定。只有在头显视场内的对象才能被检测到,所以,你应该避免强迫用户接触追踪区域之外的对象。
确保用户尽可能保持持平的身体姿势十分重要。这允许更舒适的人体工程学体验,同时将手保持在追踪传感器的理想位置。例如在《First Hand》示例中,整个游戏可以坐着或站着体验,而手几乎总是放在头显前面。这使得手部追踪更加可靠。
以上是你在设计裸手交互时的最佳实践建议。未来可继续关注Meta分享的更多开发实践。