HTC Vive开发学习——VRTK(1)

unity HTC vive开发笔记二 今天来介绍 HTC vive开发之操作GUI 也就是实现手柄对物体的点击 Step 安装好我们需要的两个插件之后 阅读详情

本系列是基于Unity和HTC Vive开发虚拟现实应用的学习笔记。Unity环境下Vive开发必用的插件是SteamVR Plugin,除此之外,计划参考一些开源项目和免费的Asset Store插件,暂时涉及的包括:VRTK和Hover UI。

VRTK包括基于SteamVR Plugin实现的各种组件,除了提供一个Vive开发的辅助工具,更重要的是,它演示了如何使用SteamVR Plugin在Unity环境下开发Vive应用,具有很高的学习价值。我们的学习过程首先从VRTK的Demo开始。

(一)002_Controller_Events

该Demo提供了一个与Vive Controller(以下简称:手柄)交互的基础脚本VRTK_ControllerEvents,以及一个演示脚本(VRTK_ControllerEvents_ListenerExample)。演示了如何编写与控制器交互的脚本程序。

1. VRTK_ControllerEvents脚本

该脚本基于.NET事件模式,对于手柄的几乎全部交互操作,封装了一个事件发布者类脚本,并挂载在[CameraRig]对象下使用。首先,我通过该脚本再一次系统地学习了如何开发.NET事件模式程序。概念上,事件等同于一个多播委托,代码上则包含一个固定的模式,我将它归纳为:

(1)事件消息类型定义:事件发布者需要进行更改并通知所有订阅者的数据,即数据源类型。通常要继承EventArgs,但新的.NET框架可以不必(VRTK的代码属于后者)。

(2)事件委托定义:起到了定义该事件委托格式的作用,几个约束包括,返回值一定是void、第一个参数一定为object类型、第二个参数为(1)步骤中定义的消息类型。事实上,这步代码真正的作用就是给该事件绑定(1)中定义的用户消息类型。

(3)定义事件:通过event关键字,给(2)中的事件委托起一个名称,实质上这个步骤起到的是命名作用。

(4)发布者方法:发布者最后需要决定的,即是在什么时候发布消息、以及如何发布消息。对于该案例脚本,在MonoBehaviour的Update函数中进行更新是合理的策略,该脚本提供了一个EmitAlias统一各种手柄交互事件的发布形式。

(5)订阅者:订阅者不需要知道事件的实现细节,它们只需要对该事件类的事件成员(通常设为public)进行操作即可,包括添加和删除自己定义的委托方法。

其次,VRTK是基于SteamVR Plugin实现的,必然要用到其中的接口。该脚本实现的核心在于SteamVR_Controller.Device(以下简称Device类型)类型。该类型代表了一个Vive设备,目前Vive还只包括两个手柄和一个头盔,从SteamVR的代码上看,Vive是有增加追踪设备的计划的。这里,VRTK_ControllerEvents脚本被挂载到[CameraRig]下的一个[Controller](left/right)子物体下,那么Device类型成员就被赋值为该手柄。Device类的接口为我们提供了通过手柄来交互的方式。手柄都包括哪些交互元素呢?在SteamVR Plugin中又提供了哪些接口呢?


通过阅读Device类的代码,我们可以将手柄交互元素和接口总结为以下几个方面:

(1)位置和速度:手柄运动的线速度和角速度,接口:velocity和angularVelocity。位置,接口:transform。

(2)按键操作:各种GetPressXX/GetTouchXX

(3)按键内容:对于触摸板(TouchPad),可以获取Axis、Angle等信息;对于扳机,可以获取勾动扳机的幅度,比如可以用来判断误操作。接口:GetAxis等。

2. VRTK_ControllerEvents_ListenerExample脚本

这个是订阅者脚本,这里给事件绑定的响应是一系列的控制台打印操作。在后续的开发中,我们可以从这个Demo的执行效果来观察,Vive手柄各种交互操作的输出结果是什么,并以此来设计具体应用中的交互逻辑。

(二)003_Controller_SimplePointer

这个案例中,按Grip键应该能弹出一个射线,碰到物体会出现一个指针。但貌似几个脚本都没有检测Grip按键,因此效果看不出来。通过仔细阅读VRTK_ControllerEvents脚本,我发现错误在于下面这行代码:

if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Grip))

Device接口有两种,GetPressXX或者GetTouchXX,从语义上也比较好理解Press即是按下而Touch是触摸。后者仅仅对支持触摸方式的交互元素有效(触摸板和扳机),而对于Grip按键,显然只支持Press操作,因此这行代码无法检测Grip按键(事实上,ApplicationMenu按键的处理也存在这个问题。Trigger按键的Press操作并没有处理,可以根据后续需求按照VRTK_ControllerEvents脚本的实现方式,添加对应的事件实现交互操作。)为了解决这个问题,我又仔细看了一下VRTK_ControllerEvents这个脚本,它在VRTK中的地位十分重要,是后面所有基本功能的基础。因此我给代码加了一些必要注释,方便后面回顾。

namespace VRTK
{
    using UnityEngine;
    using System.Collections;

    //定义事件消息格式
    public struct ControllerInteractionEventArgs
    {
        public uint controllerIndex; //控制器索引
        public float buttonPressure; //按键幅度
        public Vector2 touchpadAxis; //触摸板Axis
        public float touchpadAngle;  //触摸板Angle
    }

    //定义事件委托
    public delegate void ControllerInteractionEventHandler(object sender, ControllerInteractionEventArgs e);

    public class VRTK_ControllerEvents : MonoBehaviour
    {
        public enum ButtonAlias //给按钮起一些别名
        {
            Trigger,
            Grip,
            Touchpad_Touch,
            Touchpad_Press,
            Application_Menu
        }

        public ButtonAlias pointerToggleButton = ButtonAlias.Grip;
        public ButtonAlias grabToggleButton = ButtonAlias.Trigger;
        public ButtonAlias useToggleButton = ButtonAlias.Trigger;
        public ButtonAli
Unity开发之SteamVR---VRTK简介 另外,对于其它的交互事件,也会提供相应的unity事件处理,比如VRTK_BasicTeleport_UnityEvents(瞬移事件处理)、VRTK_InteractGrab_UnityEvents(抓取事件处理)、VRTK_InteractTouch_UnityEvents(触摸事件处理),对于各事件发生的不同阶段,都会有对应的处理接口,类似于uGUI中Button的OnClick事件处理形式。此外,它表明如果用户踏入不在对象上的游戏区域的一部分,则用户将落到最近的对象。该对象成为控制器的扩展。 阅读详情

相关推荐

【Unity】虚拟现实 VRTK插件使用教程(一)插件基本配置

文章目录如何下载 如何下载 在Project中输入“VRTK”。 选择从Asset Store中搜索。 选择 VRTK - SteamVR Unity Toolkit。 导入包或点击下载(不同版本情况不同)。 更多内容请查看总目录【Unity】Unity学习笔记目录整理 ...

一个普普通通的游戏开发者 1万+

HTC Vive开发学习——VRTK + SteamVR Plugin + Hover UI Kit配置

我们基于HTCVive这款VR设备来开发虚拟现实应用。VRTK和Hover UI Kit是查到的两个比较不错的VR开源项目,前者提供了实现VR游戏环境中一些基本交互功能的组件(主要是脚本),后者则提供了一种VR环境下非常友好的UI系统。这里我们讨论如何配置这一套开发环境,并演示一些范例。1.VRTK和SteamVR Plugin配置这个插件的配置方法可参考的资料非常多,除了Github和官网,一些...

fcauto2012的博客 2403

HTC VIVE开发教程(五)

前面几节我们了解了SteamVR的基本原理,现在可以进行实战开发了。但在进行VR开发前,我还要先介绍一套强大的VR开发工具——VRTK在进行VIVE开发时,我们经常要用手柄进行一些操作,比如监听按键响应,通过手柄触摸板进行移动,抓取物体等等。这些交互功能实现起来其实不复杂,但是如果我们自己一个个去写又比较麻烦,为了避免重复造轮子,github上便有了vrtk这套SteamVR开发的工具集。获取vrt

子者不语的专栏 7579

HTC Vive开发学习——VRTK(2)

上一节主要剖析了VRTK_ControllerEvents脚本,这一节我们继续通过Demo来学习VRTK。(二)003_Controller_SimplePointer上一节关于这个Demo的学习主要还是深入剖析VRTK_ControllerEvents脚本。这一节我们正式开始学习这个脚本,它的继承包括两个层次,父类:VRTK_WorldPointer,祖类:VRTK_DestinationMar...

fcauto2012的博客 829

[HTC Vive + Unity开发]——VRTK的研究——用手柄旋转物体(使用VRTK_Knob脚本)

使用VRTK包中的VRTK_Knob脚本 该脚本的作用是: Attaching the script to a game object willallow the user to interact with it as if it were a radial knob. The directioncan be freely set. 也就是说把该脚本挂在一个物体上,就可以用手柄旋转这个物体,

WoW的博客 4661

HTC Vive Cosmos开发——手柄按钮事件

1.环境配置 htc vive cosmos的环境配置

qq_14942529的博客 5075

HTC Vive开发学习——VRTK(3)更新到新版本SDK!

上两节中,我们主要对SteamVR_Unity_Toolkit(简称旧版VRTK)中的一些基础控制器脚本进行了学习,包括VRTK_ControllerEvents(以下简写会经常省略VRTK_前缀)、SimplePointer和BasicTeleport三个主要脚本。但是最近查资料的时候发现其实VRTK早已更新了功能更强大的版本。在新的VRTK中,不仅更多的VR环境被支持,而且相比旧版本还扩展了更...

fcauto2012的博客 1640

HTC Vive SDK:多人VR应用开发教程_2024-07-26_09-50-20.Tex

Unity引擎提供了强大的网络功能,支持多人游戏和VR应用的开发。UNet:Unity的旧网络系统,提供基本的网络功能,如网络连接、数据传输和同步。Transport:用于自定义网络传输协议,可以实现更高效的数据传输。Networking:新的网络系统,提供了更高级的网络功能,如网络同步、网络身份验证和网络优化。

777

Untiy HTC Vive VRTK 开发记录

此篇记录在开发过程中所使用到的VR功能,不针对VRTK或SteamVR的插件进行解释,或导入等等基础内容的说明,如正在开发VR项目或许可以借鉴本篇中解释的相关功能~

qq_578147153的博客 1793

HTC-VIVE基础开发文档(Unity3D)

HTC-VIVE基础开发文档(Unity3D)HTC-VIVE基础开发文档(Unity3D)

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 552

库卡C4控制柜首次上电

本文详细介绍了如何使新购的库卡机器人(以KRC4为例)达到正常运行状态。首先,必须正确连接机器人尾部和控制柜底部的各种线缆,包括动力线缆、编码器线、SmartPad线和安全回路线缆等。特别强调,电源线和蓄电池线的正确连接至关重要,避免硬插以防损坏。此外,机器人与控制柜之间需连接地线以防止漏电。文章还提到,开机前需检查电机保护器开关,并确保所有线路连接正确。开机后,需提升用户权限至安全维护员级别,通过系统配置激活安全相关通讯参数。最后,文章详细解释了X11安全回路的接线方式,强调双通道信号的重要性,并提醒不同

2202_75959322的博客 1838

SpaceMesh Mining 教程

當參與Spacemesh的用戶在完成P盤工作後需要完成兩個部分工作:PoET+PoST,這兩部分均是在不同的規定時間完成,具體可參考後續的時間表。註意!只有PoET和PoST均完成的用戶才可以獲得收益。Spacemesh相關P盤教程:說明:1.Spacemesh每個紀元epoch周期為14天,在8月7日完成PoET的將在8月20日完成PoST,收益將在8月25日後發放(之後用戶收益將每隔14天發放一次) 後續PoET時間為8月7日+N14 **後續PoST時間為8月20日+N。

Yc Chan 的个人博客 1043

AI:Coze、Dify、n8n:三款低代码工具如何选?

Coze、Dify、n8n:三款低代码工具如何选?

Kant2048的博客 2806

Bev算法在J5平台的部署

支持多种形式的Bev算法:ipmlss时序,以及基于transformer的gkt。

@bangbang的博客 846

【Unity小游戏】整整一个周末写一款《皇室战争 玩法》 的 即时战斗类 游戏Demo。两万多字游戏制作过程+解析

Unity游戏制作,本篇文章介绍了复刻皇室战争玩法的一个自制小游戏,共有该游戏的两万字教程加制作过程,欢迎品尝! 世界上没有绝对的公平,如果我们起点就比别人第一步,那就更需要比别人努力了。

努力前行,总会成为自己心中的那道光 12万+

9 硬件工程师笔面试高频知识考点真题解析——运算放大器

运算放大器(运放)摘要 运放是一种高增益、差分输入的模拟集成电路,具有虚短(线性区输入电压相等)和虚断(输入电流为零)特性,支持负反馈(线性放大)和开环/正反馈(饱和区比较)两种工作模式。关键特性包括高输入阻抗、低输出阻抗,理想运放参数(如无限增益)与实际参数(如有限带宽)的差异。 选型要点: 信号特性:直流/低频信号关注失调电压(Vos)、温漂;高频信号侧重带宽(GBW)和压摆率(SR)。 电源条件:单/双电源供电、电压范围及功耗需求(如电池设备需低静态电流)。 精度与噪声:微弱信号需低噪声运放,高精度场

XU157303764的博客 1675

YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

know_F0727的博客 190

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Unity多线程
下一篇: HTC Vive开发学习——VRTK(2)
fcauto2012
博客等级 码龄11年 59粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值