Steam VR Unity VRTK Examples 2 物体触碰和抓取

005_Controller_BasicObjectGrabbing 基本物体抓取

这个场景展示了怎样实现高亮物体、抓取物体。首先使用控制器触碰物体,可以设置物体的是否高亮、高亮颜色等属性,然后按下Grip键,拿起物体。当松开Grip键的时候,物体沿着控制器的速度和方向被扔出去,如果控制器没动的话,就是自由下落了。下面我们来详细分析一下这个场景的物体和脚本。

高亮

要实现控制器触碰物体的高亮效果,需要两步操作:

  1. 在控制器对象上添加VRTK_InteractTouch脚本
  2. 在需要高亮效果的物体上面添加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: 如果在编辑时没有对象的话,在运行时要找的对象的路径。

高亮效果截图

边缘高亮
全局高亮颜色
可交互物体特定的高亮颜色

抓取

要实现控制器触碰到物体之后的抓取效果,同样需要两步操作:

  1. 在控制器对象上添加VRTK_InteractGrab脚本
  2. 在需要被抓取的物体上面添加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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容