转至https://www.cnblogs.com/zerotoinfinity/p/6474840.html

VRTK这个工具包提供了很多在Unity3d做VR开发中通用的VR功能,主要包括

1)具有别名的控制器按钮事件

2)控制世界指针(激光指针)

3)玩家瞬间转移

4)使用控制器抓起/握住物体

5)使用控制器与物体交互

6)把游戏物体变成交互式的UI元素

这个工具集主要分成三个部分:

1)Prefabs - VRTK/Prefabs/

2)Scripts - VRTK/Scripts/

3)Examples - VRTK/Examples/

DEMO 1  查询硬件手柄头显

在VRTK插件的第一个demo 001_CameraRIg_VR_PlayArea 案例。这个demo 显示的功能:  按下任一手柄上的按键,便载入下一个场景。找到demo场景中##Scene Changer## 游戏物体,打开附加的scene changer脚本,里面有两个核心的类,以及几个重要的API。

VRTK_DeviceFinder类:用于在场景中寻找左右手柄、头显、返回硬件编号或手柄,头显的gameobject。

           

重要的API:

获得左右手柄的游戏物体

VRTK_DeviceFinder.GetControllerRightHand();

VRTK_DeviceFinder.GetControllerLiftHand();

获得左右手柄对应的硬件编号

VRTK_DeviceFinder.GetControllerIndex(rightHand)

按下手柄任一按键或键盘上的空格键,加载下一个场景。ForwardPressed 用于侦测手柄的按键是否按下。

上图中引入第二个重要的类:VRTK_SDK_Bridge,这是插件封装了 SteamVR 的比较底层的API:VRTK_SDK_Bridge.IsTriggerPressedOnIndex(controllerIndex) 。输入硬件的编号,返回是否按下的布尔值。

DEMO 2手柄的输入事件

封装成VRTK_ControllerEvent脚本。针对VR中常见的交互动作: UI点击,抓住物体,触发物体功能等,自定义手柄按键,绑定这些动作。

pointerToggleButton:激光的显示开关,激光在VR里相当于鼠标箭头的指向功能。

pointerSetButton:激光停留的指向目标,触发目标的功能,相当于鼠标点击。

grabToggleButton:抓住物体动作,配合使用 VRTK 插件集成的抓取,投掷功能。

useToggleButton:触发目标事件,比如把手柄放在门把手上,按下这个按键,触发门打开的功能;手柄放在电灯开关上,按下按键,触发电灯开发的功能。这个和pointerSetButton区别在于后者需要激光落在目标上,才能触发目标上的功能。

uiClickButton:触发UI Canvas 目标的事件。

menuToggleButton:游戏目录显示开关。

axisFidelity:按键按下的强度,完全按下是1,松开时是0。现在只有Trigger按键(手部后面扳机)有此属性。

triggerClickThreShold:扳机要到多大程度,才能使用扳机的触发功能。如果是0.5,则表示只要按下一半的程度就可以触发,如果是1,则必须完全按下才能触发。

以上是设置各个按键在插件中交互的功能,如果要获得每个按键具体的使用情况,如按下、松开按键、手触摸板的按键位置、扳机的按下强度等,则需要在 VRTK_ControllerEvent 注册对应按键的事件。

在VRTK_ControllerEvents_ListenerExample脚本中,监听了VRTK_ControllerEvent所有按键的事件,和按键的参数信息。如下图的扳机键的按键事件。

事件的参数是:手柄的硬件编号、按钮的按下程度值(扳机键专有的属性)、 触摸板的触摸位置和角度(触摸板专有的属性)

DEMO 003_Controller_SimplePointer 传送位置

VRTK_Simple Pointer类。该脚本继承自VRTK_WorldPointer

功能的核心是将玩家的位置传送到激光所指落在的地方,该脚本应默认放在手柄的prefab上。其他的参数设置激活颜色、传送时是否显示玩家活动区域、激光有效触碰的层、激光的粗细等。

DEMO 004_CameraRig_BasicTeleport

VRTK_BasicTeleport。该脚本配合继承自VRTK_WorldPointer的子类,如VRTK_Simple Pointer,添加此脚本后才可以位移传送。

参数

1)传送时黑屏:模拟眨眼动画,过渡更自然。

2)黑屏时间:随传送距离远近成正比的黑屏时间。假如传送的位置比较远,则黑屏时间更久。数值越大,黑屏时间越长,数值为0时,不受距离远近影响。

3)头部位置:以头部为基准,作为传送的位置。未打钩,则是玩家可玩区域的中心位置作为传送的目标点。可玩区域不能和游戏环境交叉,最大化玩家活动空间。

4)禁止传送物体的标签:如果传送的目标位置的物体标签和此相同,则不能传送。

5)作为第四个功能的补充:可以添加 VRTK_TagOrScriptPolicyList 脚本中添加多个禁止传送的物体标签。

6)navemesh 边缘限制:在 navemesh 上传送,如果在 navemesh 的边界,则禁止传送,数值是离边界的距离范围。

DEMO 005_Controller_BasicObjectGrabbing 

手柄上添加的组件

抓取物体 VRTK_InteractGrab,这个脚本用来抓取物体,抓的按键在 VRTK_ControllerEvent 脚本中设置。

controllerAttachPoint:被抓的物体,被附加在哪个物体上,默认是手柄的圆环处。

HideController On Grab:抓住物体时,隐藏手柄。

Hide Controller Delay:延迟几秒后隐藏手柄。

Grab Precognition:提前预判抓取物体。对应快速运动的物体,我们可能需要提早按下抓取按键才能抓住物体,数值是提前的时间值,值越大,可提前的抓取时间越长。

Throw Multiplier:把物体扔出去时,速度的倍增值。

Create Rigid Body When Not Touch:在碰到物体时才创建 RigidBody。默认情况下手柄也创建 Rigidbody,这就可以和物体在物理上碰撞。

 和物体接触 VRTK_InteractTouch

Hide Controller On Touch:接触物体时隐藏物体。

Hide Controller Delay:接触物体后延迟几秒后隐藏物体。

Global Touch HighLight Color:如果被接触的物体上未设置接触高亮颜色,则用此颜色来对改变目标的颜色。

Custom RigidBody Object:自定义用于判定接触的刚体物体,如果没有的话,会自动在子层级创建一个刚体物体。

交互物体上应该添加的脚本

VRTK_InteractableObject 需要有rigidbody组件和collider组件

1)Touch options 接触

HighLight OnTouch:接触时高亮显示物体颜色。

Touch HightLight Color:高亮的颜色。

Rumble On Touch:接触时的反馈震动强度和时间。

Allow Touch Controller:规定哪个手柄可以接触这个物体。

Hide Controller On Touch:覆盖是否隐藏手柄的设置,default是根据手柄的设置。

2)Grab Options 抓取

IsGrabbable:是否可以被抓取。

Is droppable:松开时是否掉落。

Is swappable:是否可替换。如果不行,则必须先把物体丢掉。

Hold Button To Grab:按住才能保证物体不掉落。

Grab Override Button:覆盖手柄的抓取按键设置。

Rumble On Touch:接触时震动,同上。

Allowed Grab Controllers:规定哪个手柄可以接触这个物体。

Precision Grab:精准抓取。如果是,则抓取的位置是刚接触到物体的点,而不是默认的物体中心位置。

Right Left Snap Handle:被抓物体的抓取点,该游戏物体应该放在被抓物的子层级下。

StayGrabbed On Teleport:传送后仍然抓住物体,否则物体丢掉。

GrabAttach Mechanic:被抓物体的依附机制。Fixed_joint 链接到fixed Joint 上,这是比较常用的物理上的固定位置链接;Spring_joint 和Fixed Joint类似,但是有点手臂关节,可以拉伸弯曲伸直;track Object 不靠joint 链接,而是让被抓物跟随手柄的位置方向;rotator_Track 比较适合门、车驾驶把手这种有固定转轴的物体,它只能在受转轴的约束下,根据手柄的抓取位置来调整旋转;child of controller 作为手柄的子物体;climbable固定不动的交互物体。

3)Use options 使用

Use only if Grabbed:只有在被抓取时才可以被使用。

Hold Button to Use:长按手柄按键才可以使用。

Use Override Button:自定义操作按键。

Pointer activates Use Action:如果打钩,当手柄发射的激光落在交互物体上,于此同时如果Holon to use没有打钩,则使用该物体,Holon to use打钩了,则要按住使用按键才可以使用该物体。

该脚本可以 为交互物体增加一个外轮廓颜色。

VRTK_InteractableObject扩展

DEMO 006_Controller_UsingADoor

该例子用了一个开门的交互来扩展VRTK_InteractableObject 脚本

接触VRTK_InteractableObject类,覆盖开始使用物品的方法,在此方法中写入交互动作的逻辑方法。此外还有物体被接触时,抓取时,接触接触,结束抓取动作发生时调用的函数,可以覆盖此方法,自定义扩展你的交互动作。

注意:手柄上应该添加下图脚本,否则无法使用物体

DEMO 007_CameraRig_HeightAdjustTeleport  高度升降传送

此脚本继承VRTK_BasicTeleport,不像DEMO 4场景只能水平面平移传送,它可以传送高低不同的地面,而且还可以模拟走上下楼梯的位移感。 上图中红框中是扩展的功能参数。

Play space falling:是否能下落

Play space fall restriction:下落条件, 规定哪个手柄位于当前平面内,就不会下落

Use gravity:是否自由落体加速度

Gravity Fall Height:超过多少高度差,才开始自由落体

Blink Y threshold:高度落差超过多少值时,才会模拟黑屏眨眼的效果

Floor Height Tolerance:找过这个数值时,才会有上升和下降的位移

DEMO 008_Controller_UsingAGrabbedObject

和第6个场景原理类似,都是继承VRTK_InteractableObject 脚本,物品的使用功能拓展。

DEMO 009_Controller_BezierPointer

抛物线传送侦测。和VRTK_Simple Pointer功能类似,不同的是使用抛物线来代替激光直线获取传送的位置

红框内是额外的参数,  设置抛物线的最长有效距离,  抛物线 中的物体, 落地的光标物体设置等,没有什么额外特别的东西

DEMO 010_CameraRig_TerrainTeleporting地形传送

此例子没有演示新的功能,只是展示了可以在地形上传送

DEMO 011_Camera_HeadSetCollisionFading

头部碰撞到物品后黑屏眨眼效果,提示玩家已经和游戏中物体相接触,让其返回到正常的区域。附加在Camera(eye) 上

DEMO 012_Controller_PointerWithAreaCollision

传送的位置附近的物品如果和玩家可活动范围碰撞器的相接触,将影响传送位置的最终位置,使其在合理的范围内。

开启可玩区域碰撞体

DEMO 013 演示了多个物体抓取和使用的功能

DEMO 014 演示了抓取物品握住的位置

主要是这里的参数设置,这些参数的意义之前已经有说明

DEMO 015_Controller_TouchpadAxisControl

演示手指在手柄触摸板的触摸位置vector2 (x,y),来控制小车的移动方向,手柄的扳机,控制小车跳起的动作。基本思路是:一个脚本监听手柄的输入事件, 将事件的相关值传入到小车的控制器。

监听手柄按键

传入到小车的控制运动的脚本

小车的运动部分函数

DEMO 016_Controller_HapticRumble

手柄震动

当蓝色盒子上的剑和红色盒子撞击时,触发手柄震动

基本思路是剑的物体碰撞器侦测到碰撞时,获取手柄的运动速度,来决定震动的强度。

如下图,controllerAction和ControllerEvents对应的手柄身这两个脚本。

关键的震动方法是:有VRTK.ControllerAction.TriggerHapticPulse ( 震动强度, 震动持续时间,震动间隔时间)。

DEMO  017_CameraRig_TouchpadWalking

使用触摸板来控制人物行走,以及在低矮的洞穴中蹲走时碰到头顶的碰撞体,返回到能正常直立站立的位置。附加在此物体上

VRTK_PlayerPresence 让人物有碰撞体,且头部上方有碰撞体时,如果不蹲着走,就会强制返回可以正常站立的位置。

HeadSet Y position:头部碰撞体离头顶向下的偏移值, 这样可以通过更矮的挡板

Ignore Grabbed Collisions:忽略交互物体的碰撞效果,建议勾上

Reset Position On Collision:在低矮的洞穴中蹲走时碰到头顶的碰撞体,返回到能正常直立站立的位置

Falling physics only:如果打钩,则可以自由落体下降

VRTK_TouchpadWalking通过触摸板的触摸位置来定位移动方向

参数:

leftController ,rightController:如果勾选则可以控制移动。

Max Walk Speed:最大行走速度,如果触摸位置离中心位置越近,移动速度越慢。

Deceleration:行走结束时的减速效果,防止恶心。

MoveOnButtonPress:按下哪个按键时才能触发移动(前提触摸板也要输入)。

Device For Direction:移动的方向以哪个设备为基准。头显朝向,还是左右手柄的正方向。

DEMO  018_显示当前帧数

把这个prefab 拖到场景中就可以显示当前帧数

DEMO 019_Controller_InteractingWithPointer

用手柄激光和物体交互

VRTK_interactionObject的pointer activates use 打钩后,就可以用激光和物体交互,如果HolonToUse 没有勾选,那么激光落在物体上,就直接使用该物体。如果HolonToUse勾选了,那就需要激活指在物体上,同时按下扳机按键,才使用物体。

DEMO 020_CameraRig_MeshTeleporting

在各种形状的网格上传送

激活指针传送和抛物线在复杂网格模型上的传送效果,没有新的功能演示

DEMO 021_Controller_GrabbingObjectsWithJoints

物体不同的交互方式

打开宝箱

盒子的上半部分添加转轴组件

设置转轴的转动轴向,位置,就可以像真实打开箱子一样。

箱子的把手需要添加以下脚本

VRTK_Interactable Object 是必须要添加的脚本,它保证可以被手柄抓取 rigidbody和fiexed joint是用来连接上半部分的盒子,固定把手的位置

有一定活动区间关节物体

使用character joint 来确定上下关节的连接关系(每个关节也要添加rigidbody 组件)

其关节上的VRTK_InteractableObject 的Grab Attach Mechanic 要设置成spring_joint

该关节交互组件继承重写了 抓取和松开物体时的方法,   抓取时,刚体模拟动力学运动,松开时,就停止模拟,防止受重力影响

抽屉

和打开盒子相似的设置,不过约束的方式不一样,用的是configurable joint 注意约束轴向和可活动距离约束数值设置

VRTK_InteractableObject 的抓取方式

DEMO 022_Controller_CustomBezierPointer

自定义抛物线的外观

DEMO 023_Controller_ChildOfControllerOnGrab

弓箭的思路   抓取方式:作为手柄子物体,跟随手柄运动

 

制作弓箭的弯曲动画

大致思路:

1)手柄抓取弓时,弓的interactableObject 组件查询是哪个手柄握住弓,得到该手柄的VRTK_ControllerEvents,和VRTK_ControllerActions。前者监听手柄的输入,后者控制手柄震动,同理 获得缓冲拿箭的手柄的这两个组件。

2)如果当前弓上有箭头,且手柄握着箭,箭头位置归零,箭头对向瞄准处。拉弦时,弓箭的朝向有拉弦手柄到握弓手柄方向。根据拉弦强度播放拉弓动画。如果拉弦的手柄松开,发射弓箭,初始化弓箭的刚体速度方向。

3)被握住箭碰到弓,  将箭定位到拉弦处的虚拟定位物体的子层级下,箭的方向由拉弦处位置朝向弓把手上箭的放置位置。

DEMO 024_CameraRig_ExcludeTeleportLocations

限制可传送的物体

在这里写入的标签,无法识别传送到该物体表面。可以写入多个标签,然后拖入红框中第二个方框内。

Unity Steam_VR 开发工具插件 VRTK自带案例分析(第一部分)相关推荐

  1. Unity Steam_VR开发工具插件---VRTK 自带案例分析

    DEMO 1  查询硬件手柄头显 在VRTK插件 的第一个demo   001_CameraRig_VR_PlayArea 案例 这个demo 显示的功能:  按下任一手柄上的按键,便载入下一个场景 ...

  2. VSCode前端开发工具插件--LiveServer实时刷新网页

    VSCode前端开发工具插件–LiveServer实时刷新网页 1.概述 当我们使用VSCode工具开发前端HTML页面时,修改内容后都要重新刷新网页才能展示更新代码的内容.那么有没有一种方式能够实时 ...

  3. Unity游戏开发工具的下载与安装

    Unity游戏开发工具 Visual Studio下载 UnityHub的下载 Visual Studio下载 打开网址https://visualstudio.microsoft.com/zh-ha ...

  4. 2021-2027全球及中国G Suite开发工具行业研究及十四五规划分析报告

    2021-2027全球及中国G Suite开发工具行业研究及十四五规划分析报告 2019年,全球G Suite开发工具市场规模达到了xx亿元,预计2026年将达到xx亿元,年复合增长率(CAGR)为x ...

  5. .NET平台C/S架构应用程序开发核心技术总结(MyKTV点歌系统案例分析)

    .NET平台C/S架构应用程序开发核心技术总结(MyKTV点歌系统案例分析) 总结日期:2019年10月10日                                             ...

  6. 推荐一款IDE开发工具插件GitToolBox

    作用 此插件在idea中,光标点击的代码行之后显示 git 用户名,commit 等一些信息. 示例 1. GitToolBox,先上图. 2. 作用:显示当前代码提交的用户名.时间.以及备注信息 此 ...

  7. Unity商业开发必备插件

    1.Dowteen: 配合UGUI做UI动画 2.Odin插件 3.行为树插件BT:配合FSM做角色AI 4.EasyTouch 移动端手柄插件 5.Litjson :处理json数据 6.Cinem ...

  8. HTML(四)——HTML标签(三)——开发工具插件安装

    目录 开发工具 VScode的使用 VScode工具生成骨架标签新增代码 4.3.1 文档类型声明标签 4.3.2 lang语言种类 4.3.3 字符集 总结 VSCode插件安装 安装方法 推荐插件 ...

  9. VRTK插件详解四:部分自带案例分析

    DEMO 1  查询硬件手柄头显 在VRTK插件 的第一个demo   001_CameraRig_VR_PlayArea 案例 这个demo 显示的功能:  按下任一手柄上的按键,便载入下一个场景 ...

最新文章

  1. Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)
  2. (C++)1040 有几个PAT
  3. bfs迷宫寻路问题(一看就懂的讲解)
  4. scvmm2008R2创建委派管理员角色
  5. jQuery处理点击父级checkbox所有子级checkbox都选中,取消选中所有子级checkbox都取消...
  6. 01背包+概率问题 计蒜客 offer
  7. fun(1),fun(2),fun(3)
  8. 有苹果表的快看看!屏幕存在破裂可能的 苹果将免费更换了
  9. Oracle 项目就是那回事 ----表空间的管理
  10. 今日头条电脑版官方版_imclass电脑版下载-imclass在线教室pc版下载 v1.0.2 官方版...
  11. Clojure 的身份与状态思想
  12. http请求头中包含未编码中文时webapi self host崩溃
  13. 数据中心已死:2025 年 80% 将关闭,目前 10%
  14. 计算机专业毕设外文翻译springboot_计算机毕业设计之SpringBoot物流管理系统
  15. 《HRNet-OCR:Object-Contextual Representations for Semantic Segmentation》论文笔记
  16. OpenGL可编程管线
  17. 51单片机采用ADC0808检测ADC_LCD1602显示
  18. 互联网请回答2020
  19. 自定义绘制三阶B样条曲线
  20. ZBlog支持ppt一键导入

热门文章

  1. flashback使用
  2. leetcode 5473. 灯泡开关 IV medium (智力题,O(n)思路详解)
  3. quartz 参数说明
  4. FreeType字体引擎介绍
  5. java导出excel 提示文件格式或文件扩展名有误
  6. php 环信easyui_php集成环信IM即时通讯系统(大致流程方法)
  7. 给真的想【卷】的你们
  8. VS下报LNK1104的一种解决方法
  9. Set集合和Collection集合
  10. C语言实现贪吃蛇小游戏(详解)