unity中我的unity steamvr plugin能运行但是vrtk不能运行是什么原因

柚子VR-VR虚拟现实门户网站,VR媒体平台。
当前您在:
> 内容正文
unity手柄事件(VRTK_ControllerEvents)参数
时间: 16:17
编辑: 时遇
来源:柚子VR
  Controller Events 脚本用于统一处理Vive手柄发送的事件.  Controller Events 脚本挂载在[CameraRig] 预置件下的Controller 子对象上,为手柄上每个按钮的触发提供事件监听 (包括menu按钮).  当手柄上某个按钮被按下, 脚本会发送一个事件, 通知其他脚本这个点击事件,而具体的点击逻辑并不需要写在Controller Events脚本里面. 当一个按钮被释放, 脚本同样会发送一个事件通知其他脚本这个按钮被释放了.  这个脚本也有各个按钮相应的public boolean属性以便其他脚本获取到所需按钮的当前状态,例如是否释放,是否点击等.Inspector可见参数  unity手柄事件(VRTK_ControllerEvents),在unity中,可以通过下拉列表,指定这些行为的对应按钮是什么?&·&Pointer Toggle Button: 这个按钮用于控制一束激光指示线开/关.&·&Pointer Set Button: 这个按钮用于设置指示线的目标标记.&·&Grab Toggle Button: 这个按钮用于控制抓取游戏中的物体.&·&Use Toggle Button: 这个按钮用于使用游戏中的物体.&·&UI Click Button: 这个按钮用于点击UI元素.&·&Menu Toggle Button:这个按钮用于点击弹出游戏内置按钮.&·&Axis Fidelity: 坐标变化的精度, 默认为1. 大于2的数字将会导致过于灵敏的结果.变量&·&public bool triggerPressed - 当trigger被扣下一半左右时为真.&·&public bool triggerTouched - 当trigger被扣下一点点时为真.&·&public bool triggerHairlinePressed - 当trigger比任何之前扣下的程度多时为真.&·&public bool triggerClicked - 当trigger完全扣下时为真.&·&public bool triggerAxisChanged - 当trigger位置改变时为真.&·&public bool applicationMenuPressed - 当application menu被按下时为真.&·&public bool touchpadPressed - 当touchpad被按下时为真.&·&public bool touchpadTouched - 当touchpad被触碰时为真.&·&public bool touchpadAxisChanged - 当touchpad触碰位置改变时为真.&·&public bool gripPressed - 当grip被按下时为真.&·&public bool pointerPressed - 当别名为pointer的按钮被按下时为真.&·&public bool grabPressed - 当别名为grab的按钮被按下时为真.&·&public bool usePressed - 当别名为use的按钮被按下时为真.&·&public bool uiClickPressed - 当别名为UI click的按钮被按下时为真.&·&public bool menuPressed - 当别名为menu的按钮被按下时为真.事件&·&TriggerPressed - 当trigger被扣下一半左右时发送事件.&·&TriggerReleased - 当Trigger从扣下一半的状态释放后发送事件.&·&TriggerTouchStart - 当trigger被扣下一点点时发送事件.&·&TriggerTouchEnd - 当trigger完全没有被扣下时发送事件.&·&TriggerHairlineStart - 当trigger扣下的程度超过了当前的hairline阈值时发送事件.&·&TriggerHairlineEnd - 当tringger释放程度超过了当前的hairline阈值时发送事件.&·&TriggerClicked - 当trigger在clicked之前扣下的过程中发送事件.&·&TriggerUnclicked - 当trigger不再一直处于clicked状态时发送事件.&·&TriggerAxisChanged - 当trigger扣下的量发生变化时发送事件.&·&ApplicationMenuPressed - 当application menu被按下时发送事件.&·&ApplicationMenuReleased - 当application menu被释放时发送事件.&·&GripPressed - 当grip被按下时发送事件.&·&GripReleased - 当grip被释放时发送事件.&·&TouchpadPressed - 当touchpad被按下的时候发送事件(比触摸的按压程度大).&·&TouchpadReleased - 当touchpad从被按下(非触碰)的状态下释放时发送事件.&·&TouchpadTouchStart - 当touchpad被触摸时发送事件 (不是点击或者摁下).&·&TouchpadTouchEnd - 当touchpad不再被触摸时发送事件.&·&TouchpadAxisChanged - 当touchpad被触摸的点改变时发送事件.&·&AliasPointerOn - 当pointer toggle(别名)被按下的时候发送事件.&·&AliasPointerOff - 当pointer toggle(别名)被释放的时候发送事件.&·&AliasPointerSet - 当pointer set(别名)被释放时发送事件.&·&AliasGrabOn - 当grab toggle(别名)被按下的时候发送事件.&·&AliasGrabOff - 当grab toggle(别名)被释放的时候发送事件.&·&AliasUseOn - 当use toggle(别名)被按下的时候发送事件.&·&AliasUseOff - 当use toggle(别名)被释放时发送事件.&·&AliasMenuOn - 当menu toggle(别名)被按下时发送事件.&·&AliasMenuOff - 当menu toggle(别名)被释放时发送事件.&·&AliasUIClickOn - 当UI click(别名)被按下时发送事件.&·&AliasUIClickOff - 当UI click(别名)被释放时发送事件.  事件和bool状态变量有着对应的关系,通常一个bool状态变量会对应至少两个按钮事件事件装载参数1234567public struct ControllerInteractionEventArgs{&&&&public uint controllerI&&&&public float buttonP&&&&public Vector2 touchpadA&&&&public float touchpadA}&·&uint controllerIndex - 当前使用设备的索引.&·&float buttonPressure - 按钮的按压数值. 0f 到 1f.&·&Vector2 touchpadAxis - touchpad被触摸的坐标. (0,0) 到 (1,1).&·&float touchpadAngle - touchpad触摸时滑动的角度, top为0, bottom为180,以此类推其他 . 0f 到 360f.委托类型1public delegate void ControllerInteractionEventHandler(object sender, ControllerInteractionEventArgs e);  声明一个委托类型,参数为object和ControllerInteractionEventArgs,绑定事件时一定要传入这两个参数,按钮被按下时会通过SetButtonEvent()方法来给ControllerInteractionEventArgs e分配值.按钮别名123456789101112public enum ButtonAlias&{&&&&&Trigger_Hairline,&&&&&Trigger_Touch,&&&&&Trigger_Press,&&&&&Trigger_Click,&&&&&Grip,&&&&&Touchpad_Touch,&&&&&Touchpad_Press,&&&&&Application_Menu,&&&&&Undefined&}  这个工具类给Vive手柄一些常用的操作取一些别名,和实际的按钮建立映射,例如:1public ButtonAlias menuToggleButton = ButtonAlias.Application_M  这个menuToggleButton与SteamVR中的1SteamVR_Controller.ButtonMask.ApplicationMenu  对应,当这个按钮被按下时,别名按钮对应的事件(如果有绑定)也会发送和SteamVR相关的全局变量12345678910private uint controllerIprivate SteamVR_TrackedObject trackedCprivate SteamVR_Controller.Dprivate Vector2 touchpadAxis = Vector2.private Vector2 triggerAxis = Vector2.private float hairTriggerDprivate Vector3 controllerVelocity = Vector3.private Vector3 controllerAngularVelocity = Vector3.&·&controllerIndex - 手柄的索引值,通过trackedController.index获取&·&trackedController - gameobject绑定的SteamVR_TrackedObject脚本&·&device - 设备类,通过此类获取实际中手柄的各种数据&·&touchpadAxis - 全局变量,touchpad的坐标&·&triggerAxis - 全局变量,trigger的坐标&·&hairTriggerDelta -&·&controllerVelocity - 手柄运动的速度&·&controllerAngularVelocity - 手柄旋转的角速度事件发送方法  以OnTriggerPressed方法为例,其他都和这个差不多1234567public virtual void OnTriggerPressed(ControllerInteractionEventArgs e){&&&&if (TriggerPressed != null)&&&&{&&&&&&&&TriggerPressed(this, e);//发送事件,通知绑定此事件的脚本,执行具体的逻辑,但是此处是真正最后调用的地方&&&&}}装载参数12345678910private ControllerInteractionEventArgs SetButtonEvent(ref bool buttonBool, bool value, float buttonPressure){&&&&buttonBool =&&&&ControllerInteractionEventA&&&&e.controllerIndex = controllerI&&&&e.buttonPressure = buttonP&&&&e.touchpadAxis = device.GetAxis();//调用SteamVR API获取当前的touchpad二维坐标&&&&e.touchpadAngle = CalculateTouchpadAxisAngle(e.touchpadAxis);//计算二维坐标在圆形表盘上对应的角度&&&&}  通过传入ref bool buttonBool,可以在对ControllerInteractionEventArgs进行装填的同时,把事件对应的按钮bool状态进行更新,  例如TriggerPressed和TriggerReleased事件对应的按钮bool状态是triggerPressed,当发送TriggerPressed事件时要同时更新triggerPressed为true;发送TriggerReleased事件时要同时更新triggerPressed为false初始化12345678910111213141516private void Awake(){&&&&trackedController = GetComponent();&&&&gameObject.layer = LayerMask.NameToLayer(&Ignore Raycast&);}private void Start(){&&&&//获取当前脚本attach的Controller的index&&&&controllerIndex = (uint)trackedController.&&&&if (controllerIndex & uint.MaxValue)&&&&{&&&&&&&&//获取设备&&&&&&&&device = SteamVR_Controller.Input((int)controllerIndex);&&&&}}  一般头显对应的index为0,两个手柄分别为0和1别名按钮事件发送12345678910111213141516private void EmitAlias(ButtonAlias type, bool touchDown, float buttonPressure, ref bool buttonBool)…&&&&&&&&if (pointerToggleButton == type)&&&&&&&&{&&&&&&&&&&&&if (touchDown)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&pointerPressed =&&&&&&&&&&&&&&&&OnAliasPointerOn(SetButtonEvent(ref buttonBool, true, buttonPressure));&&&&&&&&&&&&}&&&&&&&&&&&&else&&&&&&&&&&&&{&&&&&&&&&&&&&&&&pointerPressed =&&&&&&&&&&&&&&&&OnAliasPointerOff(SetButtonEvent(ref buttonBool, false, buttonPressure));&&&&&&&&&&&&}&&&&&&&&}…  根据type判断是哪个别名按钮,最后一个参数buttonBool对应的是非别名的按钮bool状态,例如这个pointerToggleButton,发送事件时要把touchpadPressed状态更新,而更新为true还是false要根据touchDown的值来判断,上面的OnAliasPointerOn等方法和OnTriggerPressed  值得注意的是,不同的别名对应的可能是相同的按钮,例如pointerToggleButton和pointerSetButton都是ButtonAlias.Touchpad_Press.禁用事件123456789101112131415161718192021222324252627282930313233343536private void OnDisable(){&&&&//在0.1s内调用DisableEvents(),禁用所有事件发送&&&&Invoke(&DisableEvents&, 0.1f);}////// 禁用,还原,但是保存touchpad和trigger的坐标等///private void DisableEvents(){&&&&if (triggerPressed)&&&&{&&&&&&&&OnTriggerReleased(SetButtonEvent(ref triggerPressed, false, 0f));&&&&&&&&EmitAlias(ButtonAlias.Trigger_Press, false, 0f, ref triggerPressed);&&&&}&&&&...&&&&triggerAxisChanged =&&&&touchpadAxisChanged =&&&&controllerIndex = (uint)trackedController.&&&&if (controllerIndex & uint.MaxValue)&&&&{&&&&&&&&device = SteamVR_Controller.Input((int)controllerIndex);&&&&&&&&Vector2 currentTriggerAxis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger);&&&&&&&&Vector2 currentTouchpadAxis = device.GetAxis();&&&&&&&&// 保存当前的touchpad和trigger的设置.&&&&&&&&touchpadAxis = new Vector2(currentTouchpadAxis.x, currentTouchpadAxis.y);&&&&&&&&triggerAxis = new Vector2(currentTriggerAxis.x, currentTriggerAxis.y);&&&&&&&&hairTriggerDelta = device.hairTriggerD&&&&}}  这个方法应该就是将所有事件对应的按钮bool状态置为false,同时保存touchpad和trigger上的坐标信息,但是为什么要重新获取一次device呢?Update()方法123456789101112131415161718192021222324252627282930313233private void Update(){&&&&controllerIndex = (uint)trackedController.&&&&//Only continue if the controller index has been set to a sensible number&&&&//SteamVR 在未找到Controller时会把index置为uint最大的值&&&&if (controllerIndex &= uint.MaxValue)&&&&{&&&&&&&&&&&&}&&&&device = SteamVR_Controller.Input((int)controllerIndex);&&&&Vector2 currentTriggerAxis = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Trigger);&&&&Vector2 currentTouchpadAxis = device.GetAxis();&&&&//Trigger Pressed&&&&if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))&&&&{&&&&&&&&//发送事件,设triggerPressed为true,同时发送Trigger_Press对应的别名按钮事件&&&&&&&&OnTriggerPressed(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x));&&&&&&&&EmitAlias(ButtonAlias.Trigger_Press, true, currentTriggerAxis.x, ref triggerPressed);&&&&}&&&&else if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))&&&&{&&&&&&&&OnTriggerReleased(SetButtonEvent(ref triggerPressed, false, 0f));&&&&&&&&EmitAlias(ButtonAlias.Trigger_Press, false, 0f, ref triggerPressed);&&&&}&&&&...&&&&// 保存当前trigger和touchpad状态.&&&&touchpadAxis = new Vector2(currentTouchpadAxis.x, currentTouchpadAxis.y);&&&&triggerAxis = new Vector2(currentTriggerAxis.x, currentTriggerAxis.y);&&&&hairTriggerDelta = device.hairTriggerD}使用实例  例如在VRTK_ControllerEvents_ListenerExample中123456GetComponent().TriggerPressed += new ControllerInteractionEventHandler(DoTriggerPressed);private void DoTriggerPressed(object sender, ControllerInteractionEventArgs e){&&&&DebugLogger(e.controllerIndex, &TRIGGER&, &pressed&, e);}  获取到当前Controller绑定的VRTK_ControllerEvents脚本,为它的TriggerPressed绑定DoTriggerPressed方法,在VRTK_ControllerEvents脚本中,每一帧会检测trigger是否被按下,如果按下,则发送事件1OnTriggerPressed(SetButtonEvent(ref triggerPressed, true, currentTriggerAxis.x));  然后在OnTriggerPressed方法里执行TriggerPressed(this, e);  此时DoTriggerPressed(this,e)被真正调用,而example脚本中无需在update中写代码,只需要在初始化的时候绑定事件就可以了.
关于我们进一步了解我们?
网站地图快速找到你想要的
微信扫一扫关注我们
柚子VR-浙ICP备号-1下载地址:
网页代码:
论坛代码:
版权信息:Copyright & 2007- All rights reserved. 一木禾网盘() 版权所有您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
1UnitySteamVR开发工具插件VRTK自带案例分析(第一部分).docx 15页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
1UnitySteamVR开发工具插件VRTK自带案例分析(第一部分)
你可能关注的文档:
··········
··········
1、Unity Steam_VR 开发工具插件 VRTK自带案例分析(第一部分)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手柄的输入事件002_Controller_Events封装成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所有按键的事件,和按键的参数信息。如下图的扳机键的按键事件。?事件的参数在VRTK_ControllerEvents中是:手柄的硬件编号、按钮的按下程度值(扳机键专有的属性)、触摸板的触摸位置和角度(触摸板专有的属性)?DEMO 003_Controller_SimplePointer?传送位置VRTK_Simple Pointer类。该脚本继承自VRTK_WorldPointer旧版新版功能的核心是将玩家的位置传送到激光所指落在的地方,该脚本应默认放在手柄的prefab上。其他的参数设置激活颜色、传送时是否显示玩家活动区域、激光有效触碰的层、激光的粗细等。?DEMO 004_CameraRig_BasicTeleportVRTK_BasicTeleport。该脚本配合继承自VRTK_WorldPointer的子类,如VRTK_Simple Pointer,添加此脚本后才可以位移传送。?参数1)传送时黑屏:模拟眨眼动画,过渡更自然
正在加载中,请稍后...}

我要回帖

更多关于 unity3d vrtk 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信