2025-04-08 NO.4 Quest3 交互教程

文章目录

  • 1 环境准备
  • 2 新手指引:Building Blocks
    • 2.1 创建 OVR 相机
    • 2.2 创建交互功能
    • 2.3 创建交互物体
  • 3 老手开发:Interaction SDK
    • 3.1 创建交互功能
    • 3.2 创建交互物体
  • 4 UI 交互
    • 4.1 3D 按钮
    • 4.2 Unity UI

​ 新版 Meta SDK(v74)优化了 Quest 开发流程,使得原本复杂的开发设置变得简单了许多,这在旧版(v63)是不可想象的!

​ 特此记录。

配置环境:

  • Windows 11
  • Unity 6000.0.42f1
  • Meta SDK v74.0.2
  • Quest3

旧版链接:

  • 2024-04-03 NO.4 Quest3 手势追踪抓取物体(旧)_quest3 手势识别-CSDN博客

  • 2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互(旧)_quest3手势-CSDN博客

  • 2024-04-08 NO.6 Quest3 自定义交互事件(旧)_unity quest3快速配置模型交互-CSDN博客

Quest3 环境配置教程:

  • 2025-03-17 NO.1 Quest3 开发环境配置教程_quest3 unity 开发流程-CSDN博客

1 环境准备

​ 创建新场景 InteractionDemo,删除 Main Camera。

image-20250408050306272

2 新手指引:Building Blocks

​ Building Blocks 是 Meta 推出的 Unity 内置开发教程,通过拖拽的形式快速配置开发环境,并带有错误检查功能。下面我们来看看。

2.1 创建 OVR 相机

​ 选择菜单栏中的“Meta”,依次点击“Tools”->“Building Blocks”。

image-20250408050420020

​ 将 Camera Rig 块拖拽到 Hierarchy 窗口中。

image-20250408050738455

​ 即可创建出 OVR Camera Rig。其名称由 “[BuildingBlock]” 开头,表示由 Building Blocks 创建。

​ 点击该物体,在 Inspector 面板中可看到 BuildingBlock 的介绍,包括:

  • Version:版本
  • Dependencies:该块的依赖。
  • Used by:被 xxx 引用。

​ 此时佩戴 Quest3 运行 Unity,即可看到场景。

image-20250408050902840

2.2 创建交互功能

​ 打开 Building Blocks,选择 “Interaction” 分类,将 “Controller Interactions” 拖拽到 Hierarchy 窗口中。Building Blocks 会自动为我们创建 Interaction 模块,包括 OVRHmd 和 Controller Interactions。同时在 TrackingSpace 下创建对应的 Anchor。

image-20250408051707751

​ 此时运行 Unity,可以识别到手柄,但无法交互。接下来配置可交互物体。

2.3 创建交互物体

​ 将 “Grab Interaction” 拖拽到 Hierarchy 窗口中。可看到创建了一个 Cube,并自动为其创建了 HandGrab 子物体,该物体上挂载了 Grabbable、Hand Grab Interactable 和 Grab Interactable 脚本。在以往版本(v63)中,这些都需要一个个手动创建,而且还需要记住脚本间的相互引用,天呐!😢

​ 可以看到,已添加的块右下角图标和未添加的块有所区别(下图绿色标识)。

image-20250408052408732

​ 此时运行 Unity,即可直接用手抓 Cube 了!

​ 但建议将 Cube 先放在一个合适的位置,并且将 OVRCameraRig 下 CenterEyeAnchor 的相机背景改为 Skybox,否则容易看不到物块。

image-20250408053221044

​ 其他 Block 大家自行探索。

3 老手开发:Interaction SDK

​ 尽管 Building Blocks 很令人经验,但是其功能块有限,无法满足定制化的需求(例如 UI 交互)。

​ 但是,Meta 还是贴心地给出了方便的解决方案:右键 -> Interaction SDK。

​ 而在老版本(v63)中,右键出不来 Interaction SDK:😿

image-20250408060042766

​ 现在,我们将场景中所有物体删除,只保留 Directional Light,重新从零开始。

3.1 创建交互功能

​ 在 Hierarchy 窗口中右键,依次选择 Interaction SDK -> Add OVR Interaction Rig。

image-20250408053949743

​ 弹出提示面板,提示我们需添加 OVR Camera Rig。点击 Fix All,再点击 Create 创建 OVR Interaction Rig。

image-20250406221430285

​ 可以看到创建了 OVRCameraRig,其子物体包括:

image-20250408054221406
  • TrackingSpace:用于跟踪与获取设备数据。
  • OVRInteractionComprehensive:字面意思是全面的 Interaction,确实可以看到,什么交互功能都有(懒人必备)。
image-20250408054439340

​ 展开 OVRCameraRig,找到其子物体 PlayerController,将 “First Person Locomotor.cs” 脚本上 Gravity Factor 改为 0,避免进入场景玩家立即下坠。

image-20250408061347180

3.2 创建交互物体

​ 在 Hierarchy 窗口中右键,依次选择 3D Object -> Cube。创建一个 Cube,用于抓取(可以顺便改一下位置和缩放,方便后续好抓)。

image-20250408054601537

​ 选中 Cube,右键,还是选择 Interaction SDK。此时由于选中了物体,比上次多了 6 个选项,其中第 3-6 个是用于 3D 物体交互的,分别为:

  • Add Grab Interaction:添加抓取交互(手柄 + 手势均支持)。
  • Add Ray Interaction:添加射线交互(手柄 + 手势均支持)。
  • Add Distance Grab Interaction:添加远距离抓取交互(手柄 + 手势均支持)。
  • Add Teleport Interaction:添加传送交互(手柄支持)。

​ 这里以第一个为例,选择 Add Grab Interaction。

image-20250408054824967

​ 弹出了提示窗口,提醒说必须为 Cube 添加 Rigidbody 组件才能 Grab。点击 Fix,然后 Create。

image-20250406222014763

​ 可以看到为 Cube 创建了 ISDK_HandGrabInteraction 子物体,该物体上挂载了 Grabbable、Hand Grab Interactable 和 Grab Interactable 脚本。

  1. Grabbable:该物体允许被抓取(必需)。
  2. Hand Grab Interactable:支持手势抓取(可选)。
  3. Grab Interactable:支持手柄抓取(可选)。
image-20250408055406711

​ 此时运行 Unity,即可使用手柄或手势抓取 Cube!

4 UI 交互

​ 新版 SDK 中,配置 UI 交互也变得非常简单。这里我将其分为以下 2 类。

4.1 3D 按钮

​ 叫 3D 按钮,是因为这是 3D 交互,且仅支持按钮交互hh。在 Building Blocks 里面找到 Poke Interaction,拖进来。

image-20250408060506744

​ 将额外添加的 [BuildingBlock] Hand Interactions 删去,咱有 OVRInteractionComprehensive 了。

image-20250408062717285

​ Poke Interaction 的层级结构如下:

  • Poke Interaction(Poke Interactable 脚本使得其能够被点击)
    • Model(Surface 的父物体,无特殊功能)
      • Surface(定义按到底的平面)
    • Visuals(ButtonVisual 的父物体,会比 Surface 突出一些,营造 3D 立体感)
      • ButtonVisual(渲染按钮部分)

​ 该 3D 交互的原理是,手将 Visuals 向前推,推到与 Surface 重合时便停止不动,给人一种真实按下的感觉。

​ 此时运行 Unity,可以按下该 Button,但什么都不会发生。要使得按下能够出发相应事件,需要在 Poke Interaction 物体上挂载 Interactable Unity Event Wrapper 脚本。并执行以下操作:

  1. 关联哪个 Interactable 被监听。这里将 Poke Interactable 拖拽到 Interactable View 中进行关联(下图红色标注)。
  2. 脚本中依据事件名称关联相应的方法。例如,这里我在 Select 中关联了 Cube 的 SetActive 方法,并传入 false(未勾选下方按钮)。
image-20250408062802104

​ 此时,运行 Unity,按下 Button 后,Cube 将消失。

4.2 Unity UI

​ 如果想和 Unity 中的 2D UI 交互,只需要一步操作即可。

​ 这种方法支持 Unity 中的大部分 UI,例如 Button、Toggle、Slider 等。交互功能没有问题,但给人感觉体验不如 3D Button。

​ 首先右键选择 UI -> Button - TextMeshPro,创建 Unity Button。

image-20250408063141002

​ 将 Canvas 的 Render Mode 设置为 World Space,并更改其位置和长宽(之前的太大了)。Button 也更改小一点。

image-20250408063329750

​ 选中 Canvas,右键依次选择 Interaction SDK -> Add Poke Interaction Canvas。

image-20250408063613843

​ 弹出提示界面,需要在 EventSystem 中添加 Pointable Canvas Module 脚本以支持 UI 的 Point 交互。点击 Fix,再点击 Create。

image-20250408063729816

​ 可以看见为 Canvas 创建了 ISDK_PokeInteraction 子物体,其挂载了:

  • Poke Interactable:可被点击。
  • Pointable Canvas:使 Canvas 下的所有 UI 支持点击操作。
image-20250408063928013

​ 之后,就可以像往常 Unity 开发一样,在 UI 中添加对应的事件了。

image-20250408064205330

​ 此时运行 Unity,点击按钮,即可将 Cube 隐藏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践

以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…

Scala 异常处理

Scala 异常处理 引言 Scala 是一门多范式编程语言,它结合了面向对象和函数式编程的特性。在软件开发过程中,异常处理是保证程序稳定性和可靠性的重要环节。本文将深入探讨 Scala 中的异常处理机制,包括异常的抛出、捕获和处理策略。 异常概述 什么是异常? 在计算机编程…

PyTorch:解锁AI新时代的钥匙

(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 揭开PyTorch面纱 对于许多刚开始接触人工智能领域的朋友来说,PyTorch这个名字或许既熟悉又陌生。…

React-06React中refs属性(字符串refs,回调形式,React.createRef() )

1.React中refs属性 绑定到render输出的任何组件上&#xff0c;通过this.ref.绑定名直接操作DOM元素或获取子组件的实例。 2.绑定refs实例 2.1 字符串refs(已经过时参考官网API) 字符串(string)的ref存在一定的效率问题 <input refinput1 type"text" placehole…

五子棋游戏开发:静态资源的重要性与设计思路

以下是以CSDN博客的形式整理的关于五子棋游戏静态资源需求的文章&#xff0c;基于我们之前的讨论&#xff0c;内容结构清晰&#xff0c;适合开发者阅读和参考。我尽量保持技术性、实用性&#xff0c;同时加入一些吸引读者的亮点。 五子棋游戏开发&#xff1a;静态资源的重要性与…

c编译和c++编译有什么区别?

文章目录 c编译和c编译有什么区别多态函数重载虚函数表 vtable 输入输出同步类型检查模板和特化链接 C 标准库 C 能编译 C 的代码吗&#xff1f; c编译和c编译有什么区别 多态 函数重载 C 支持多个同名函数&#xff08;参数不同&#xff09;&#xff0c;这是编译期多态 编译…

无缝集成Docker与Maven:docker-maven-plugin实战指南

关于 docker-maven-plugin 的详细介绍和使用指南&#xff0c;帮助你在 Maven 项目中实现 Docker 镜像的自动化构建、推送和管理。 1. 插件的作用 docker-maven-plugin 是一个 Maven 插件&#xff0c;允许在 Maven 构建生命周期中直接集成 Docker 操作&#xff0c;例如&#xf…

智能仓储数字孪生Demo(Unity实现)

一、项目背景与行业痛点 医药流通行业仓储管理面临三大核心挑战&#xff1a; 合规性风险&#xff1a;GSP&#xff08;药品经营质量管理规范&#xff09;对温湿度、药品批次追溯的严苛要求&#xff0c;传统人工记录易出错效率瓶颈&#xff1a;库区布局复杂&#xff0c;人工巡检…

详解 Go 的常见环境变量及其在 zshrc 中的配置

Go 语言作为一门现代化的编程语言&#xff0c;其编译、构建和包管理等环节都依赖于一系列环境变量的配置。正确理解和设置这些环境变量&#xff0c;对于 Go 开发至关重要。本文将详细介绍 Go 的常见环境变量&#xff0c;并解释如何将其配置到 zshrc 文件中&#xff0c;以方便日…

【NLP 55、强化学习与NLP】

万事开头难&#xff0c;苦尽便是甜 —— 25.4.8 一、什么是强化学习 强化学习和有监督学习是机器学习中的两种不同的学习范式 强化学习&#xff1a;目标是让智能体通过与环境的交互&#xff0c;学习到一个最优策略以最大化长期累积奖励。 不告诉具体路线&#xff0c;首先去做…

Java 面试系列:Java 中的运算符和流程控制 + 面试题

算术运算符 Java 中的算术运算符&#xff0c;包括以下几种&#xff1a; 算术运算符名称举例加法123-减法2-11*乘法2*36/除法24/83%求余24%73自增1int i1;i--自减1int i1;i-- 我们本讲要重点讲的是 “” 和 “--”&#xff0c;其他的算术运算符相对比较简单直观&#xff0c;本讲…

硅谷甄选项目笔记

硅谷甄选运营平台 此次教学课程为硅谷甄选运营平台项目,包含运营平台项目模板从0到1开发&#xff0c;以及数据大屏幕、权限等业务。 此次教学课程涉及到技术栈包含***:vue3TypeScriptvue-routerpiniaelement-plusaxiosecharts***等技术栈。 一、vue3组件通信方式 通信仓库地…

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式&#xff1a;服务端主动将更新的数据发送给所有订阅的客户端。 拉模式&#xff1a;客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…

大坑!GaussDB数据库批量插入数据变只读

大坑!GaussDB数据库批量插入数据变只读 GaussDB插入数据时变只读df和du为什么不一致GaussDB磁盘空间使用阈值GaussDB变只读怎么办正确删除表的姿势GaussDB插入数据时变只读 涉及的数据库版本为:GaussDB Kernel 505.1.0 build da28c417。 GuassDB TPCC灌数报错DML失败,数据…

动态规划算法深度解析:0-1背包问题(含完整流程)

简介&#xff1a; 0-1背包问题是经典的组合优化问题&#xff1a;给定一组物品&#xff08;每个物品有重量和价值&#xff09;&#xff0c;在背包容量限制下选择物品装入背包&#xff0c;要求总价值最大化且每个物品不可重复选取。 动态规划核心思想 通过构建二维状态表dp[i]…

ABAP,PDF,ADS,FORM,PRINT

ABAP怎么直接打印PDF文件? https://faskomyabap.blogspot.com/2017/10/how-to-print-pdf-file-content-from-abap.html 里面的程序可以直接将本地文件打印出来,读一下过程,这个程序是把本地PDF文件使用upload函数到ABAP中,先是二进制,然后转成XSTRING,然后使用 连招 ADS…

C++Cherno 学习笔记day17 [66]-[70] 类型双关、联合体、虚析构函数、类型转换、条件与操作断点

b站Cherno的课[66]-[70] 一、C的类型双关二、C的union&#xff08;联合体、共用体&#xff09;三、C的虚析构函数四、C的类型转换五、条件与操作断点——VisualStudio小技巧 一、C的类型双关 作用&#xff1a;在C中绕过类型系统 C是强类型语言 有一个类型系统&#xff0c;不…

011_异常、泛型和集合框架

异常、泛型和集合框架 异常Java的异常体系异常的作用 自定义异常异常的处理方案异常的两种处理方式 泛型泛型类泛型接口泛型方法、通配符和上下限泛型支持的类型 集合框架集合体系结构Collection Collection集合Collection的遍历方式认识并发修改异常问题解决并发修改异常问题的…

Kubernetes 集群搭建(三):使用dashboard用户界面(需要访问外网获取yaml)

&#xff08;一&#xff09;简介 K8s Dashboard是Kubernetes提供的一种基于Web的用户界面工具&#xff0c;用于可视化地管理和监控Kubernetes集群 主要功能&#xff1a; 资源查看与管理&#xff1a; 查看Kubernetes集群中的各种资源&#xff0c;如节点、Pod、服务、部署等。 对…

【数据挖掘】岭回归(Ridge Regression)和线性回归(Linear Regression)对比实验

这是一个非常实用的 岭回归&#xff08;Ridge Regression&#xff09;和线性回归&#xff08;Linear Regression&#xff09;对比实验&#xff0c;使用了 scikit-learn 中的 California Housing 数据集 来预测房价。 &#x1f4e6; 第一步&#xff1a;导入必要的库 import num…