VRTK4.0学习(八):物体交互 Interactor与Interactable

一、添加交互器(Interactor)

介绍

与虚拟对象进行交互的第一步是定义一个交互器,该交互器​​的概念是知道什么时候它正在触摸可交互对象以及能够抓住该对象以某种方式影响它。
可以将Interactor预制件添加到我们希望能够触摸和抓取可交互对象的任何GameObject。在本文中,我们将着眼于使虚拟控制器充当交互器,以便我们可以用虚拟手模拟拾取虚拟对象。

Touch -交互器与有效的可交互对象发生物理碰撞的位置的概念。
Grab -交互器通知有效触摸的可交互对象该交互器要启动抓取可交互对象的功能的概念。

先决条件

场景中设置了TrackedAlias。请参见TrackedAlias设置
Boolean Action在场景中定义了,我们可以使用它来启动抓取。请参见将浮点操作转换为布尔操作

第1步

所述Interactor预制体带有一个Example Avatar游戏物体,其提供交互器的含有简单立方体网格和一个简单的立方体撞机基本表示。可以更改这些设置以适合你的任何目的,但是在本示例中,将保持Example Avatar物体不变。
注意:如果你遵循了TrackedAlias设置指南,并为控制器添加了自定义GameObjects,则可以立即将其删除,因为ExampleAvatar物体会为我们提供基本的控制器头像。

在Unity Project窗口中展开VRTK Prefabs Package目录,直到该Packages -> VRTK Prefabs -> Interactions -> Interactors目录可见。对于此示例,我们将Interactor预制件添加到TrackedAlias预制件中的控制器别名中,因此在Unity Hierarchy窗口中展开TrackedAlias预制件,直到LeftControllerAlias和RightControllerAlias游戏对象可见。
拖放Interactor预制件成为LeftControllerAlias子物体,然后拖放另一个Interactor预制件成RightControllerAlias的子物体。
VRTK4.0学习(八):物体交互 Interactor与Interactable
注意:以下步骤将同时在LeftControllerAlias和RightControllerAlias上执行,说明仅概述了这些步骤一次,因此请确保对两个控制器都执行这些步骤。

第2步

在Unity Hierarchy中的LeftControllerAlias物体下选择Interactor预制件,然后更改其Interactor Facade组件以配置Interactor的基本功能。
我们需要指定一个操作来启动Interactor的Grab Action。Interactor Facade上的Grab Action参数允许我们提供一个Boolean Action以启动Interactor的Grab功能。

将浮点操作转换为布尔操作“ 指南中,我们学习了如何将控制器轴值转换为布尔值,以便我们可以启用操作,例如在控制器轴达到特定限制时进行抓取。这是理想的,因为对于本示例,我们将设置为按下控制器的扳机键启用Grab操作。

在Unity Hierarchy窗口中已经有一个RightTriggerPressed物体,它将为我们Right Controller Trigger轴提供Boolean Action。我们需要为左控制器触发轴创建相同的概念。将Unity Axis 1D Action物体重命名为RightTriggerAxis。
VRTK4.0学习(八):物体交互 Interactor与Interactable
注意:请确保对RightTriggerPressed物体和RightControllerAlias -> Interactor预制件进行相同的操作。

第3步

当一个Interactor抓住一个可交互对象时,通常要求该Interactor所移动的速度可以施加到该可交互对象上。例如,如果我们要拾取一个可交互对象并将其抛出,则我们希望将虚拟控制器的移动速度应用于该可交互对象,以便我们可以控制抛出的力量。
Interactor Facade组件Velocity Trackeron参数允许我们指定跟踪某个组件速度数据。TrackedAlias预制件已经在可以在虚拟世界中*移动的物体上附带了Velocity Tracker相关组件,例如Headset,Left Contoller和Right Controller上。
将TrackedAlias -> Aliases -> LeftControllerAlias物体拖放到Interactor Facade组件的Velocity Tracker参数中,以设置交互器跟踪来自Left Controller的速度。
VRTK4.0学习(八):物体交互 Interactor与Interactable

注意:请确保对RightControllerAlias物体和RightControllerAlias -> Interactor预制件进行相同的操作。

至此,左右控制器的交互器已经设置完成了,下一步我们将添加交互物体进行互动。

二、添加交互物体(Interactable)

一个Interactable预制体提供游戏对象可以与在虚拟世界中通过Interactor预制体进行交互。可以向Interactable 物体通知Interactor正在执行的动作,例如被Interactor触摸或对诸如按下抓取按钮之类的动作做出反应。

VRTK Prefab包提供了许多不同的Interactable预制件。
但在此示例中,我们将集中于设置Interactable.Primary_Grab.Secondary_Swap预制件,这是Interactable物体最常见的用例。

默认情况下,Interactable物体通常可以执行两个操作,具体取决于哪个Interactor对它们起作用。一个常见的用例是具有左右控制器的场景,它们既可以抓取Interactable物体并以某种方式携带它,则从Interactor进行的第一次抓取尝试称为Primary Grab Action,而在从另一方中交互器进行的第二次抓取尝试称为Secondary Grab Action。

本文将展示如何设置一个Interactable。我们可以用任何一个控制器抓取可交互物体,当我们用另一个控制器抓取时,Interactable 物体将在手与手之间交换,就像我们在虚拟手之间传递了GameObject一样。

Touch -交互器与有效的可交互对象发生物理碰撞的位置的概念。
Grab -交互器可在何处动作以通知有效的触摸式可交互对象该交互器要启动可交互对象的抓取功能的概念。
Rigidbody-一个Unity组件,允许GameObject受到Unity Physics系统的影响。可以将力(例如重力)应用于GameObject。
Mesh -在3D空间中排列的代表3D形状的三角形的集合。

第1步

在开始将Interactable预制件添加到场景之前,让我们创建一个简单的表面,因为Interactable物体具有一个Rigidbody组件,这意味着它们会受到我们虚拟世界中重力的影响。如果将Interactable预制件添加到空白场景中,则在播放场景时,虚拟世界将无限下落,因为虚拟世界将对其施加重力并将其拉下,直到其与实体表面碰撞为止。

通过选择Main Menu -> GameObject -> 3D Object -> Cube,然后将Cube重命名为来创建新的Unity 3D对象Table。
注意:你可能需要更改Table物体属性,以便将其放置在易于触摸并抓住Interactable预制件的位置。
VRTK4.0学习(八):物体交互 Interactor与Interactable

第2步

在Unity Project窗口中展开VRTK Prefabs Package目录,直到该Packages -> VRTK Prefabs -> Interactions -> Interactables目录可见,然后将Interactable.Primary_Grab.Secondary_Swap预制件拖放到Unity Hierarchy窗口中。
VRTK4.0学习(八):物体交互 Interactor与Interactable

第3步

我们将更改Interactable.Primary_Grab.Secondary_Swap物体的外观,因为默认情况下它只是一个1 x 1 x 1多维数据集,在我们的虚拟世界中将非常大。

在“ Unity层次结构”窗口中展开Interactable.Primary_Grab.Secondary_Swap物体,直到Meshes -> DefaultMesh物体可见。我们可以在Meshes物体下添加一个新的网格或一组网格,并简单地将Meshes -> DefaultMesh物体设置为非活动状态以将其从场景中隐藏起来,或者我们可以简单地更改Meshes -> DefaultMesh物体 上组件的参数。

在此示例中,我们将更改Meshes -> DefaultMesh来减小多维数据集的大小。选择Meshes -> DefaultMesh游戏对象,改变Transform组件Scale属性为X = 0.2,Y = 0.2,Z = 0.2。
VRTK4.0学习(八):物体交互 Interactor与Interactable

第4步

让我们移动Interactable预制体物体,使其停在场景中Table物体的顶部。移动Interactable预制件物体时,请确保不要移动内部网格,而是移动已拖动到Unity Hierarchy窗口中的Interactable预制物体。

在Unity Hierarchy窗口中选择Interactable.Primary_Grab.Secondary_Swap 物体并调整Transform组件属性,以使Interactable物体停留在Table物体的顶部。

注意:你的位置不必一定是十分完美的,如果Interactable物体太高,则重力会使它掉落在桌子的顶部,并且如果它与桌子稍微相交,则Unity Physics系统将解析碰撞,然后将Interactable物体向上推一点,直到将其正常放置在桌子上。
VRTK4.0学习(八):物体交互 Interactor与Interactable

结语

播放Unity场景,然后使用“左”或“右”控制器触摸Interactable.Primary_Grab.Secondary_Swap物体。控制器上的交互器将告诉Interactable物体它正在被触摸,然后在控制器上按下扳机键将启动“Grab Action”,并使Interactable物体跟随我们抓取它的控制器。

你可以用另一个控制器抓取Interactable物体,以将握持的Interactable物体交换给另一只手,还可以抛出物体并松开扳机键以应用控制器的速度,这将抛出Interactable物体。

注:本文内容引用自VRTK学院。用于自己学习笔记,文章如有描述不当的地方,也欢迎各位朋友在评论处留言指正,感谢大家支持。