005_Controller_BasicObjectGrabbing 基本物体抓取
这个场景展示了怎样实现高亮物体、抓取物体。首先使用控制器触碰物体,可以设置物体的是否高亮、高亮颜色等属性,然后按下Grip键,拿起物体。当松开Grip键的时候,物体沿着控制器的速度和方向被扔出去,如果控制器没动的话,就是自由下落了。下面我们来详细分析一下这个场景的物体和脚本。
高亮
要实现控制器触碰物体的高亮效果,需要两步操作:
在控制器对象上添加VRTK_InteractTouch脚本
在需要高亮效果的物体上面添加VRTK_InteractableObject脚本
下面来看看这两个脚本怎么用
VRTK_InteractTouch脚本
vrtk_interacttouch
参数说明:
Hide Controller On Touch: 当碰触发生的时候,隐藏控制器模型。
Hide Controller Delay: 在隐藏控制器之前的等待时间。
Global Touch Highlight Color: 全局触碰高亮颜色。如果可交互的物体没有设置自己的高亮颜色的时候,将会使用全局高亮颜色。
Custom Rigidbody Object: 自定义刚体对象。如果需要自定义控制器的刚体和碰撞体的话,就传递给这个参数。如果没有设置的话,HTC Vive将会在运行时使用自动生成的默认刚体和碰撞体。
ControllerTouchInteractableObject
VRTK_InteractableObject脚本
vrtk_interactableobject
参数说明(这里先解释触碰相关的部分):
Highlight On Touch: 这个选项勾选之后,物体被控制器碰触到的时候,才会有高亮效果。
Touch Highlight Color: 物体被触碰到时,高亮的颜色。会覆盖VRTK_InteractTouch中的全局颜色。
Rumble On Touch: 设置物体被触碰时的触觉反馈。Strength指的是震动强度,Duration指的是时间长度。
Allowed Touch Controllers: 指定哪个控制器可以进行触碰操作。
Hide Controller On Touch: 当碰触发生的时候,隐藏控制器模型。可以覆盖控制器上的设置。
当物体高亮或者取消高亮的时候,可以通过ControllerTouchInteractableObject和ControllerUntouchInteractableObject两个事件来处理。
边缘高亮实现
在默认情况下,物体高亮的时候是整体变颜色的效果。VRTK中提供了另外一种形式的高亮,就是显示物体的轮廓。VRTK_OutlineObjectCopyHighlighter这个类是做的这个工作。它继承自VRTK_BasicHighlighter这个抽象类。使用的时候,只需要把这个类添加到可交互的物体上面。
参数说明:
Active:决定这个高亮组件是否是active的,一个对象只能有一个active的高亮组件。
Thickness: 物体轮廓的粗细程度。
Custom Outline Model: 用来做为轮廓的模型。如果没有提供的话,当前对象中第一个带有有效Renderer的对象将会被使用。
Custom Outline Model Path: 如果在编辑时没有对象的话,在运行时要找的对象的路径。
高亮效果截图
边缘高亮
全局高亮颜色
可交互物体特定的高亮颜色
抓取
要实现控制器触碰到物体之后的抓取效果,同样需要两步操作:
在控制器对象上添加VRTK_InteractGrab脚本
在需要被抓取的物体上面添加VRTK_InteractableObject脚本,其实做高亮效果的时候已经添加过了
下面来看看这两个脚本怎么用
VRTK_InteractGrab脚本
vrtk_interactgrab
VRTK_InteractGrab脚本附加到[CameraRig]Prefab的控制器对象,Controller对象需要附加VRTK_ControllerEvents脚本,因为它使用此脚本监听控制器按钮事件以捕获和释放可交互的游戏对象。它侦听AliasGrabOn和AliasGrabOff事件,以确定应该何时抓取对象并应该释放。
控制器对象还需要附加VRTK_InteractTouch脚本,因为它用于确定何时触摸可交互对象。只有有效的被触摸对象可以抓取。
如果Controller触摸了包含VRTK_InteractableObject脚本并且标志isGrabbable设置为true的游戏对象,则可以抓取对象。
如果有效的可交互对象是可抓取的,那么按下控制器上的设置抓取按钮(默认为Grip)将抓取并捕捉对象到控制器,并且将不释放它,直到释放抓取按钮。当释放控制器抓取按钮时,如果可互动游戏对象是可抓取的,那么它将被沿着控制器所处的方向和速度推进,这可以用来模拟对象投掷。
可互动对象需要一个碰撞器来激活触发器和一个刚体来拾取它们并将它们移动到游戏世界周围。
参数说明:
Controller Attach Point:控制器模型上的刚体点,用于捕获抓取的对象(默认为尖端)。
Hide Controller On Grab:当有效抓取发生时,是否隐藏控制器模型。
Hide Controller Delay:在隐藏控制器之前等待的秒数。
Grab Precognition:抓取按钮被按下到控制器正在触摸某物要抓取之间的时间量。例如,如果物体以快的速率下落,则由于人的反应时间,很难及时地按下抓取按钮以抓住物体。这里较高的数字意味着在控制器触摸对象之前可以按下抓取按钮,并且当发生碰撞时,如果抓取按钮仍然被按下,则抓取动作将成功。
Throw Multiplier:与要抛出的任何对象的速度相乘的量。当放大[CameraRig]以模拟把物体扔的更远时,这可能很有用。
Create Rigid Body When Not Touching:如果选中此项并且当按下抓取按钮时,控制器未触及可交互对象,则会在控制器中添加刚体以允许控制器推动其他刚体对象。
当物体被抓取或者释放的时候,还可以使用ControllerGrabInteractableObject和ControllerUngrabInteractableObject这两个事件,处理事件。
VRTK_InteractableObject脚本
上面介绍该脚本的触碰部分,下面来看看抓取的部分:
Is Grabbable: 设置物体是否可以被抓取。
Valid Drop: 设置物体是否能被扔掉。
Secondary Grab Action: 当另外一只手柄控制器尝试抓住该物体的时候,采取什么操作。
Hold Button To Grab: 选中的话,需要持续按住Grab键才能抓住物体;没选中的话,Grab按键就成了按一下抓住,再按一下扔掉的toggle操作。
Grab Override Button: 设置成Undefined,使用全局的grab按键来抓取物体;设置成其他按键的话,会覆盖全局的设置。
Rumble On Grab: 设置物体被触碰时的触觉反馈。Strength指的是震动强度,Duration指的是时间长度。
Allowed Grab Controllers: 指定哪个控制器可以进行抓取操作。
Precision Snap: 如果这个选中的话,当控制器抓住物体的时候,将会精确的抓住控制器和物体的触碰点。
Right Snap Handle和Left Snap Handle: 需要一个空对象,必须做为抓取物体的子节点。它的Transform做为朝向点进行旋转,并且放置到相对于右手控制器的位置上。Precision Snap不需要。
Hide Controller On Grab: 当抓取发生的时候,隐藏控制器模型。可以覆盖控制器上的设置。
Stay Grabbed On Teleport: 当发生传送的时候,正在抓着的物体是否还被抓着。
Grab Attach Mechanic: 这个选项决定了抓取的物体怎样附加到控制器上面。这是个枚举值,有下面几个选项。每个模式的参数可以自己调整实验一下。
Fixed_Joint: 以固定关节的形式把物体附加到控制器上面。该物体会完美的追踪控制器的位置和旋转。
Spring_Joint:以弹簧关节的形式把物体附加到控制器上面。在物体和移动它的控制器之间有一定的弹性。这种效果在尝试拉物体的时候不错,让人感觉物体对移动有一定的抵制。
Track_Object:不以关节的形式添加物体,而是保证物体跟随着控制器的方向,对于铰接接头的物体效果不错。
Rotator_Track:会跟随控制器的方向,就像在物体上施加了一个外力,使物体发生旋转。对于轮子或者门这种合页对象比较理想。
Child_Of_Controller:把物体当做控制器的子节点,使它能够自然的跟随控制器运动的位置。
Climbable:非刚体接触物体允许player爬升。
抓取效果示意图
抓取可交互物体
参考:
https://vrtoolkit.readme.io/