最近写VR项目的时候用到了SteamVR Unity Plugin - v2.0.1插件,感觉比之前用到的SteamVR plugin for Unity - v1.2.2版本改进了很多,就算不用VRTK插件,也能实现很多交互操作了。在此记录一下新版本插件的中的主要内容。(主要是根据InteractionSystem文档和自己的理解)

这个InteractionSystem包括一系列脚本,预制件和其他资产资源,这个系统专门设计的轻巧灵活。。其中大多数包含的组件在实际案例中都运用到了,但也包括一些没有在案例中用到的组件,但是它可能也是有用的。

1.首先概述一下示例场景中包括的预制件和脚本主要的功能:

Player:这个预制件是整个系统的核心,大多数其他组件都依赖于player
Teleporting:传送预制件处理所有关于传送的逻辑。
InteractableExample:这个类是一个和手柄进行简单交互的类。会接收手柄发来的信息并作出反应。
Throwables:这个展示了在游戏中怎样使用交互系统来创建一些更复杂的能够被使用的对象。
UI&Hints:这个显示了交互系统如何处理提示。并且如何使用它和Unity UI控件像按钮一样进行交互。
LinearDrive:这是一个稍微复杂的交互,可以通过简单的直线移动操作对象来控制的目标对象进行螺旋上升和下降。
CircularDrive:这个类主要实现了通过手柄控制一个圆盘的转动
Longbow:这是案例中使用的长弓。是这个系统创建的更复杂的对象之一。

2.简单介绍交互系统

交互系统的核心是Player,Hand和Interactable类。Player预制件为场景设置play对象和SteamVR摄像机。这个交互系统通过发送信息给场景中所有可以和手柄进行交互的对象,这个对象再对接收的信息作出反应。并可以设置对象附着到手柄上。为了接收手的信息只要添加Interactable组件到对象上,这个对象就可以根据手的信息作出相应的悬停监测。还包括了一些常用的可交互方式,例如Throwable(扔)或者LinearDrive(直线移动物体)。Player预制件也创建了一个用于模仿鼠标事件可以简单地用Unity UI控件控制的输入模式。交互系统也包括一个传统的第一人称摄像机,用键盘和鼠标控制。鼠标就类似人的一只手一样。当开发者没有VR头显时,这个模式就非常有用了。

3.Player类的功能介绍

-Player类是一个单例,意味着在一个场景中只有一个Player对象。
-Player主要功能是持续追踪手柄和头显。
-它可以在整个项目中全局访问,并且交互系统的许多方面都假定Player对象始终存在于场景中。
-不管是VR模式还是2D fallback模式,它都保持追踪。
-通过Player类使用访问器允许其他组件以类似的方式运行,而不知道是否正在使用VR头显或鼠标/键盘。
-2D fallback模式虽然有用,但仍然有限制。此模式主要用于测试非常简单的交互,仅限于一个手和触发按钮。它对于一个团队在开发中,并不能保证每个人一直都有一个VR头显和控制器设备。
-Player的一些有用的属性:
-hmdTransform:一只返回当前摄像机的transform。可能是VR头显和2D fallback camera。
-feetPositionGuess:根据头显的位置猜测玩家脚的位置。但不能准确知道脚的位置,根据玩家的站立方式,这可能非常不准确。
-bodyDirectionGuess:类似于feetPositionGuess,根据玩家的站立方式,这可能非常不准确。
注意:在编辑场景中,player类设置使用icons显示feet和hands。但由于unity工作方式,需要将Core/icons移动到根目录下Gizmos中,才能起作用。
-关闭2D fallback mode的两种方式:
1、在build之前,将player的属性面板中Allow Toggle To 2D取消勾选
2、在PlayerSetting.Player中Scripting Define Symbols增加HIDE_DEBUG_UI。这将会在build时取消2D debug view,但允许在编辑器中使用。

4.Hand类的功能介绍

-Hand类为交互系统完成了大部分繁重工作。
-Hand检测正在悬停的对象(Interactables)并根据当前的悬停状态向它们发送消息。
-hand在同一时间只能悬停在一个对象,在相同时间只能有一只hand能悬停在一个对象。
-对象可以附着在手柄上,也可以从手柄上分离。只有一个对象可以是手柄的焦点对象,但是同时可以将多个对象附加到手柄上。
-一旦一个对象从手柄上分离,那么之前附着在手柄上的对象(仍然附着在手柄上)会成为手柄的焦点对象。
-当手柄上没有任何东西时,它将始终显示手柄控制器。
-当对象一旦附着在手柄上时,可以给附着在手柄上的对象可以设置一个附着标志物UI来确定手柄和对象的行为。
-根据情况,可以锁定手柄以悬停在其他物体或任何物体上。
-这些是hand发送给交互物体的信息:
OnHandHoverBegin: 当手柄首次开始悬停在对象上时发送
HandHoverUpdate: 悬停在对象上时,每一帧都发送信息
OnHandHoverEnd: 当手柄停止悬停在对象上时发送
OnAttachedToHand: 当对象附加到手柄上时发送
-HandAttachedUpdate: 附加到手柄上时,每一帧都发送信息
OnDetachedFromHand: 当对象从手柄中分离时发送
OnHandFocusLost: 当附加对象失去焦点时发送,因为其他东西已附加到手柄上
OnHandFocusAcquired: 附加对象获得焦点时发送,因为前一个焦点对象已从手柄中分离
- 这些是手柄发送给其子对象的消息:
OnHandInitialized: 通过将自己与SteamVR跟踪控制器的设备ID相关联来首次初始化手柄时发送
OnParentHandHoverBegin: 当手柄开始悬停在某物上时发送
OnParentHandHoverEnd: 当手柄停止悬停在某物上时发送
OnParentHandInputFocusAcquired: 当游戏窗口获得输入焦点时发送
OnParentHandInputFocusLost: 当游戏窗口失去输入焦点时发送
- 这些成员处理附加和分离:
AttachObject: 将传入的附加标签设置在附着对象上
DetachObject: Detaches the object from the hand and optionally restores it to its original parent currentAttachedObject: This returns the in-focus attached object on the hand,if any
- Hand还有一些有用的属性和函数可用于自定义其行为:
OtherHand: 这是玩家控制的另一只手柄。这对于需要用两个手柄交互的对象(例如长弓)非常有用。
HoverSphereTransform and Radius: 这可用于自定义手柄的悬停范围。
HoverLayerMask: 这可以改变,以便手柄只悬停在某些层中的对象上。
HoverUpdateInterval: 根据游戏的要求,可以设置进行悬停检测的时间间隔。
HoverLock/Unlock: 这用于使手柄仅悬停在某个对象上。当hover locked时,传入为null将使得手柄不会悬停在任何东西上。此技术用于在传送arc处于活动状态时使手柄不悬停在对象上
GetStandardInteractionButton/Up/Down: 这些用于检查手柄上的扳机的状态。 这对于也可以与2D fallback一起使用的简单对象非常有用。 在2D fallback情况下,左键单击用作标准交互按钮,对象的行为相同。
GuessCurrentHandType: 这使用一些SteamVR函数来确定哪个手柄最左边哪个是最右边的。
GetAttachmentTransform: 物体可以使用手上的“attachment transforms”来弄清楚如何附着到手柄上的transform。

5.Interactable类更像是一个标识符。它向Hand标识该对象是可交互的。具有此组件的任何对象都将从Hand接收相关消息。

仅使用以上这3个组件,就可以能够创建许多不同且复杂的交互式对象。

6.Throwable类的主要功能:

这是最基本的交互式对象之一。
- 当手柄在其上悬停并按下交互键(扳机)时,玩家可以拾取此对象。
- 按下扳机时,物体会附在手柄上并保持在那里。
- 当释放扳机时,手柄的速度都会赋给抛出对象。
- 这可以创建可以拾取和抛出的基本对象。

7.LinearDrive类的主要功能是允许用手柄在开始和结束点之间移动对象,对象的当前位置用于设置LinearMapping。

8.CircularDrive类的主要功能是允许用手柄控制圆盘转动。对象的当前位置用于设置LinearMapping。

9.LinearMapping值由LinearDrive和CircularDive设置
-映射可用于将简单的手部交互映射到更复杂的行为。
-一个例子是长弓中的字符串,它使用LinearMapping将弓弦的拉动映射到长弓拉回动画。
-几个其他类使用该映射来插入其属性
LinearAnimation
LinearAnimator
LinearBlendShape
LinearDisplacement
HapticRack

10.VelocityEstimator类可用于根据对象位置的变化估计对象的速度和加速度。在大多数情况下,如果从实际控制器获得速度和加速度,将获得更准确的结果,但有时这是不可能的,例如使用2Dfallback hand时。

11.IgnoreHovering类主要功能是,当你希望某对象不进行悬停检查时,则可以将此组件添加到该对象或特定的碰撞器上。

12.UIElement类的主要功能:

将此组件添加到unity的UI控件上,则手就可以与UI进行交互。
这将生成基于手部交互的鼠标悬停和单击事件,并通过Unity事件系统发送它们以使用现有的UI控件。
此外,它还将生成一个OnHandClick事件,该事件也将传递到点击的那个手柄。

13.ItemPackage类的主要功能:

-ItemPackage是用于暂时覆盖手柄的功能的对象集合
-在长弓的例子中,当长弓被手柄拿起后,长弓和手柄就结合在一起,并暂时替代手柄的功能。
-ItenPackages的概念是能够捡起和放回到物体被捡起的地方。
-一旦附带ItemPackage组件的对象被拿起,此对象会附着在手柄上,直到此对象被放回。不需要按钮就可以让此对象保持在手柄上。手柄仍然可以正常的传递消息(与场景中的对象交互),但此对象通常会禁用手柄的某些功能,例如手柄的悬停功能。

14.ItemPackageSpawner脚本处理产生和收起ItemPackage时的逻辑,以及如何在产生后将物品附加到手柄上。还可以处理拾取对象的展示和预览或者拾取对象的轮廓。

15.ItemPackageReference可以将此组件添加到对象以指示它是组合对象的一部分。

16.PlaySound这个类允许使用更多参数来使用AudioClips。可以接收多个AudioClips并且每次随机播放一个。还可以随机播放剪辑的方式。

17.SoundPlayOneShot类专门用于播放一次且不循环播放的声音或者需要在播放时暂停的声音。

18.Util类中全是interaction system中用到的工具方法。

19.InteractableHoverEvents当收到手柄传递的信息时这个类生成UnityEvents。

20.InteractableButtonEvents此类将手柄按钮输入转换为UnityEvents。

21.ComplexThrowable类当手接触对象时使用物理关节而不是simple parenting,这允许在手接触对象时进行更多基于物理的交互。
注意:这个类是实验性的,还没有真正运用到场景中,此类的功能是不完整的并且可能有错误。

22.DistanceHaptics基于两个transform之间的距离触发手柄的震动反馈。

23.Player(Prefab)功能

-这是交互系统的单个部分,它结合了所有基本部分
-这个预制件管理玩家和手部,使他们都可以轻松访问。
-包括所有SteamVR和2Dfallback的设置
-交互系统的大多数的组件都依赖于Player预制件,并且一些组件假设player和hand都用这种方式设置。
-每个场景只有一个。

24.BlankCOntroller(Prefab)当手柄没有接触任何东西时使用,控制器的渲染模型通过SteamVR加载,其所有部件都是铰接式(articulated)的。

SteamVR Unity Plugin - v2.0.1中的InteractionSystem的更多相关文章

  1. SteamVR Unity工具包(VRTK)之概览和控制器事件

    快速上手 · 克隆仓库  git clone https://github.com/thestonefox/SteamVR_Unity_Toolkit.git · 用Unity3d打开SteamVR_ ...

  2. 联盟链FISCO BCOS v2.0.0-rc3 发布

    FISCO BCOS是完全开源的联盟区块链底层技术平台,由金融区块链合作联盟(深圳)(简称金链盟)成立开源工作组通力打造.开源工作组成员包括博彦科技.华为.深证通.神州数码.四方精创.腾讯.微众银行. ...

  3. 2019年度CMMI V2.0性能报告

    2020年底,CMMI研究院发布<2019 CMMI V2.0 Performance Report Summary>,渠成团队进行了全文翻译并简单总结如下.(文末提供中英双版PDF下载) ...

  4. 怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块

     因为项目的需要,所以研究了一下自动生成测试代码.将经验记录下来,总会有用的.我个人认为,好记性不如多做笔记多反思总结. 1.    前提条件 开发环境已正确配置 工程已解决JUnit依赖关系(pom ...

  5. PCMM(人力资源能力成熟度模型)V2.0中英对照版发布

    PCMM中英版终于发布 时光荏苒,从当初的回眸到如今的回头,这才发现:坚守一份承诺是多么的不易! 一年多了,这份承载殷切期待的作品--<PCMM(人力资源能力成熟度模型)V2.0 (中英文对照版 ...

  6. 错误 : 资产文件“项目\obj\project.assets.json”没有“.NETCoreApp,Version=v2.0”的目标。确保已运行还原,且“netcoreapp2.0”已包含在项目的 TargetFrameworks 中。

    升级 vs201715.6.3之后发布出现 错误 : 资产文件“项目\obj\project.assets.json”没有“.NETCoreApp,Version=v2.0”的目标.确保已运行还原,且 ...

  7. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah

    paip.提升性能--多核编程中的java .net php c++最佳实践  v2.0 cah 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax ...

  8. Win7旗舰版中的IIS配置asp.net 完美通过版,附代码 以及出现的 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\8d57d

    先解决问题:“c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\8d57d 图: 其他的解决方案 ...

  9. 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。

    近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"?       解决方式:手 ...

随机推荐

  1. PAT——1039. 到底买不买

    小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...

  2. "strace -p"非常有用,它减少了很多猜测工作,也不需要重新启动应用。lsof -p process_id +iostat + sar -n DEV 1

    linux神器strace - youxin - 博客园https://www.cnblogs.com/youxin/p/8837771.html 某个进程突然占用了很多CPU? 或者某个进程看起来像 ...

  3. SwaggerUI用户手册

    SwaggerUI是一个非常好用的API文档工具,最关键的是他还能在工具内调试API,简直爽的不要不要的~网上针对开发者的文档非常多,但是给用户的手册却非常少.所以我来简单写个用户手册,供没有使用过s ...

  4. 安装Windows7步骤

    我初次装Linux系统的时候,查过一些资料,然后也有网友教过我,这里做一个总结,和大家分享一下(U盘安装).       事实上我们平时电脑开机的时候,是有个启动顺序的,他并非直接进入我们的操作系统, ...

  5. JS-instanceof 与typeof

    通常来讲,使用 instanceof 就是判断一个实例是否属于某种类型 而typeof  无论引用的是什么类型的对象,它都返回 "object" var arr=[1,2,3]; ...

  6. 【学时总结】 ◆学时 · I◆ A*算法

    [学时·I]A*算法 ■基本策略■ --A*(A Star)无非就是BFS的升级,当BFS都超时的时候-- 同样以队列为基础结构,BFS使用FIFO队列(queue),而A*则使用优先队列(prior ...

  7. activeMQ的高级特性:嵌入activemq

    activemq的高级特性之嵌入式activemq 1:编写activeMQ服务 import org.apache.activemq.broker.BrokerService; import org ...

  8. shell习题第4题:监控ip地址存活

    [题目要求] 设计一个脚本,监控远程的一台机器(ip为192.168.1.100)的存活状态,当发现宕机的时候发一份邮件给自己 [核心要点] ping -c10 192.168.1.100通过 pin ...

  9. 笔记:css中的position定位

    position的值可以是:static,relative,absolute,fixed. 默认值是 static.设置 left.top值无效. relative是相对定位,可以设置left.top ...

  10. java爬虫爬取网页内容前,对网页内容的编码格式进行判断的方式

    近日在做爬虫功能,爬取网页内容,然后对内容进行语义分析,最后对网页打标签,从而判断访问该网页的用户的属性. 在爬取内容时,遇到乱码问题.故需对网页内容编码格式做判断,方式大体分为三种:一.从heade ...