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)

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

YOLO11实战优化:长尾分布解决 | 引入Seesaw Loss配合YOLO11分类头,完美应对类别极其不平衡的现实业务场景

摘要: YOLO11在工业缺陷检测等长尾分布场景中面临尾部类别检测失效的问题,根源在于头部类别样本的负样本梯度压制了尾部类别的学习。传统方法如重采样、Focal Loss等效果有限。Seesaw Loss通过动态调整缓解因子和补偿因子,平衡类别间的梯度分布,结合YOLO11的解耦分类头、Anchor-Free设计和C2PSA/C3K2模块,显著提升尾部类别识别能力。文章详细解析了Seesaw Loss的数学原理,并提供了可直接集成到YOLO11的PyTorch实现代码,为长尾分布下的目标检测提供了实用解决方

2601_95807009的博客 252

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

AI人人懂 237

基于Spring Boot 3 + Vue 3 + UniApp的全栈高校社团管理小程序设计与实现

requestMatchers("/api/auth/**", "/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() // 公开接口。<u-search placeholder="搜索活动" v-model="searchKeyword" @search="loadActivities" :showAction="false"></u-search>R.success("活动创建成功") : R.error("活动创建失败");

2201_76125393的博客 368

从通用到定制:营销Agent如何跨越数据鸿沟,实现对话SOP的个性化飞跃

从通用到定制:营销Agent如何跨越数据鸿沟,实现对话SOP的个性化飞跃

丨汀、的博客 656

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1486

MediaPipe 教程:从安装到应用-全网最全

MediaPipe是Google推出的开源框架,专为构建机器学习管道设计,可以高效处理视频、音频等时间序列数据。本文教程从安装到应用逐步讲解: 安装步骤简单,只需通过pip安装mediapipe包并验证版本; 重点演示人体姿态检测功能,可识别33个身体关键点; 提供基础代码实现,包括视频捕获、关键点检测与可视化; 强调模块化开发,将功能封装成类以提高代码复用性。 教程适合初学者,通过清晰指引和实用代码示例,帮助快速实现计算机视觉应用。

FJN110的博客 1563

训练救星!EMA多尺度注意力让YOLOv11轻松攻克自定义数据集不涨点难题

在目标检测模型训练中,自定义数据集不涨点是阻碍算法落地的核心痛点之一。传统训练策略在数据分布特殊、样本量有限的场景下极易陷入收敛停滞,而 EMA(指数移动平均)结合多尺度注意力的方案,在自定义数据集上实现mAP 提升 6.5%,同时让训练曲线从“平缓停滞”转为“持续攀升”,彻底解决创新点在自有数据上的性能瓶颈。本教程将带你从原理到实践,通过 EMA 多尺度注意力为 YOLOv11 注入训练稳定性,让你的自定义数据集模型训练实现质的飞跃。EMA 衰减率:小样本数据集建议将decay。

FJN110的博客 160

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 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、付费专栏及课程。

余额充值