Unity Meta Quest MR 开发(四):使用 Scene API 和 Depth API 实现深度识别和环境遮挡

news2024/10/6 10:25:59

文章目录

  • 📕教程说明
  • 📕Scene API 实现遮挡
  • 📕Scene API 实现遮挡的缺点
  • 📕Depth API 实现遮挡
    • ⭐导入 Depth API
    • ⭐修改环境配置
    • ⭐添加 EnvironmentDepthOcclusion 预制体
    • ⭐给物体替换遮挡 Shader
    • ⭐取消现实手部的遮挡效果

此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。

社区链接:
Spatial XR 高级社区(知识星球)
Spatial XR 高级社区(爱发电)

在这里插入图片描述


📕教程说明

这期教程我将会介绍如何在 Unity 中,分别利用 Meta XR SDK 中的 Scene API 和 Depth API,来实现现实物体遮挡位于后方的虚拟物体的效果。

配套的视频链接:
https://www.bilibili.com/video/BV1GH4y1h7Py

一体机开发环境配置可参考:https://blog.csdn.net/qq_46044366/article/details/133967343

配置一个基本的玩家物体可以参考前几期教程:https://blog.csdn.net/qq_46044366/article/details/134097455

MR 透视配置可参考:
https://blog.csdn.net/qq_46044366/article/details/135612769

Scene API 配置可参考:
https://blog.csdn.net/qq_46044366/article/details/135930423

系列教程专栏:https://blog.csdn.net/qq_46044366/category_12118293.html

​电脑操作系统:Windows 11

使用的 VR 设备:Meta Quest 3(Quest 系列都适用,但是 Depth API 的部分目前只适用于 Quest 3)

使用的 Unity 版本:2022.3.15 f1c1 LTS

Meta XR SDK 版本:v60

Meta Quest 系统需要是 v40 及以上

官方文档:https://developer.oculus.com/documentation/unity/unity-gs-overview/

Depth API 官方文档:https://developer.oculus.com/documentation/unity/unity-depthapi/

Depth API 官方 Github 项目链接:https://github.com/oculus-samples/Unity-DepthAPI

最终效果:

在这里插入图片描述
在这里插入图片描述


📕Scene API 实现遮挡

在上一期配置 Scene API 实现虚拟与现实物体之间碰撞的教程中,我们可以在 Project 窗口的搜索栏中搜索 SelectivePassthrough,在 Packages 文件夹下找到这个材质。

在这里插入图片描述

然后我们自己创建了一个和这个官方透视材质一模一样的材质,这样后续可以对材质做一些自定义的设置。我们在 Assets 文件夹下的任意一个文件夹中创建了一个材质,叫做 CustomSelectivePassthrough,然后把 Shader 改成 Oculus/SelectivePassthrough。但是如果我们按照上一期教程的步骤把材质的 Render Queue 设为 5000,那么我们运行程序后,如果把一个虚拟小球放在具有透视材质的现实物体之后,我们还是可以看到墙之后的小球的。

在这里插入图片描述

如果想要让具有透视材质的现实物体遮挡虚拟小球,可以把透视材质的 Blend Color 由原来的 ReverseSubstract 改为 Substract 。此外,我在弹球 Demo 中给球加了个高亮材质,当手对准球的时候,显示球的高亮材质。如果我们想要看到球的高亮材质,还需要让透视材质的 Render Queue 小于球的高亮材质,且大于小球本身的材质。(如下图所示)

在这里插入图片描述

Render Queue 依据什么修改?首先 Render Queue 越大,材质越透明,并且在渲染顺序中越后渲染。

在这里插入图片描述

我们看高亮材质的 Render Queue,它是 3110:

在这里插入图片描述

如果透视材质的 Render Queue 按照上期教程设为了 5000,那么它比 3110 大,因此透视材质后渲染,并且这两个材质都是透明的材质。经过 Substract 混合一下会导致高亮材质看不到了,相当于透视材质盖住了高亮材质。

如果透视材质的 Render Queue 小于高亮材质,那么透视材质先渲染,高亮材质后渲染,这种情况下就能正常显示高亮材质。

总结一下,如果透视材质的 Blend Color 设为了 Substract,如果在场景中看不到某个其他的透明材质(比如球的高亮材质),可以让透视材质的 Render Queue 小于该透明材质,这样就能够看到该透明材质。

最终效果:

在这里插入图片描述


📕Scene API 实现遮挡的缺点

Scene API 实现的遮挡主要有两个缺点:

  1. 任何形状的物体都被当成了 2D 平面或者 3D 立方体。比如下方这张图,现实中桌子的下方是空的,但是它被系统当作了一个完整的立方体,因此桌子下方空的部分也会遮挡住小动物的一部分身体。

在这里插入图片描述

  1. Scene API 只能实现静态物体的遮挡。如果在空间设置完毕之后将一个现实物体进行移动,那么它所对应的场景模型中的虚拟物体并不会改变位置。假如我们想实现现实中双手与虚拟物体的遮挡,就不能用 Scene API 来实现。因为手可能会在不断运动。

📕Depth API 实现遮挡

Depth API 是 Quest 3 特有的功能,因为 Quest 3 有一个深度传感器,能够获取现实物体与相机之间的深度信息,因此能够判断现实物体和虚拟物体到相机的距离,来处理现实物体和虚拟物体之间的前后遮挡关系。而像 Quest 2 和 Quest Pro 就没有深度传感器,因此无法使用 Depth API。

Depth API 主要解决的是动态遮挡的需求,比如现实的手放在虚拟的物体前能呈现出正确的前后遮挡关系。

使用 Depth API 目前有几个注意事项:

  1. Depth API 目前是一个实验性的功能(在未来应该会成为正式的功能),这意味着目前使用 Depth API 的应用是无法上架到 Quest 商店的。但是开发者可以先拿来测试。
  2. Unity的编辑器版本需要是 2022.3.1及以上或 2023.2 及以上
  3. Meta XR SDK 的版本需要是 v60 及以上

Depth API 官方文档说明:https://developer.oculus.com/documentation/unity/unity-depthapi/(相关要求和配置过程可能会发生改变,一切以官方文档为主)

⭐导入 Depth API

目前导入 Depth API 需要从 Git URL 导入。我们可以打开 Depth API 官方 Github 样例项目网址:https://github.com/oculus-samples/Unity-DepthAPI

里面有两个 Git 链接,分别适用于不同的渲染管线。

普通渲染管线:https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi
URP 渲染管线:https://github.com/oculus-samples/Unity-DepthAPI.git?path=/Packages/com.meta.xr.depthapi.urp

根据自己的项目选择用哪一种,因为我的项目是默认的普通渲染管线,所以我先把第一个链接复制一下,然后如下图所示,打开 Unity 的 Window > Package Manager,点击界面左上角的 “+” 号,选择 Add package from git URL,将复制的 Git 链接导入。

在这里插入图片描述

导入之后可以在 Package Manager 当中的 In Project 里看到 Depth API,同时 Oculus XR Plugin 这个包的版本会转换为 4.2.0-exp-env-depth.2

在这里插入图片描述

⭐修改环境配置

打开 Unity 的 Edit > Project Settings > Oculus,点击安卓端和 PC 端的 Fix All 和 Apply All,直到列表的所有选项变绿为止。

在这里插入图片描述

这个自动修复工具确保了这几件事:

  1. Graphics API 设为了 Vulkan
  2. Rendering Mode 设为了 Multiview
  3. 透视功能是已经开启的
  4. Quest Features 中的 Scene Support 设为了 Required
    在这里插入图片描述

⭐添加 EnvironmentDepthOcclusion 预制体

我们在 Project 窗口中搜索 EnvironmentDepthOcclusion,将搜索选项设为 All 或 In Package,可以找到这个预制体 Prefab:

在这里插入图片描述

然后把这个预制体拖到场景中,找到它身上的 Environment Depth Occusion Controller 脚本的 Occlusion Type 参数,可以把它改为 Soft Occlusion:

在这里插入图片描述
Hard Occlusion:对现实物理的遮挡效果会比较粗糙,但是节约性能
Soft Occlusion:对遮挡效果进行了平滑处理,但是需要更大的 GPU 性能。需要注意的是 Depth API 是在实时进行处理的,所以它本身会消耗更多的算力。

⭐给物体替换遮挡 Shader

找到虚拟物体的材质,比如我这个小球的材质的 Shader 原本是 Standard,现在需要替换成 Meta/Depth/BiRP/Occlusion Standard:

在这里插入图片描述

替换成什么 Shader 可参考下方的表格(前缀是Meta/Depth/BiRP/)。
BiRP(普通渲染管线):

在这里插入图片描述

URP:
在这里插入图片描述

现在运行程序,就可以实现当现实中的物体遮挡住后方的虚拟物体时,能看到虚拟物体前的现实物体。

⭐取消现实手部的遮挡效果

当我们用现实中的手抓取一个虚拟物体的时候,Depth API 会把虚拟物体的大部分表面遮挡掉,但是现实中的手本身是没有真正抓取一个物体的,就会导致手和虚拟物体穿模,出现很奇怪的视觉效果。我的优化思路是,当现实的手与虚拟物体进行交互时,显示虚拟手部模型,并且取消现实的手对虚拟物体的遮挡效果。如果给虚拟物体录制了抓取手势,因为 Synthetic Hand 对虚拟手部姿态的限制,所以在抓取物体的时候虚拟手部模型就会贴在虚拟物体的表面上,更有抓取的感觉。

Depth API 提供了一个方法,可以取消手腕以上手的部分对虚拟物体的遮挡效果。在 EnvironmentDepthTextureProvider 脚本中有一个 RemoveHands 方法可以实现这个功能。

在这里插入图片描述
在这里插入图片描述
传入 true 参数,可以取消手部对现实物体的遮挡效果。

和 Event Wrapper 搭配的样例:

在这里插入图片描述

最终效果:

在这里插入图片描述

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

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

相关文章

如何入门AI Agent?

随着chatgpt问世,大模型已经在加速各行各业的变革,这是我之前对AI Agent行业的粗浅判断。 下面给大家介绍一下如何制作AI Agent,我会用我开发的全赞AI为例子进行简要的介绍,下面是一种工具型AI Agent的框架图 这是一个大量使用工具…

vue中watch和computed的不同

第076个 查看专栏目录: VUE ------ element UI Vue.js 中的 watch 和 computed 都是用于监听数据变化并执行相应操作的选项,但它们的使用场景和优劣势有所不同。 两者区别 watch 用于监听一个或多个数据属性的变化,并在变化时执行相应的处理函数。 它…

unity学习案例总结

动态标签 GitHub - SarahMit/DynamicLabel3D: Simple dynamic labels for a 3D Unity scene

Jumpserver教程01:部署jumpserver

Jumpserver教程 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com 转发本文请备注原文链接,本文内容整理日期:2024-02-11 csdn 博客名称:五维空间-影子,欢迎关注 简要说明…

单片机学习笔记---AT24C02(I2C总线)

目录 有关储存器的介绍 存储器的简介 存储器简化模型 AT24C02介绍 AT24C02引脚及应用电路 I2C总线介绍 I2C电路规范 开漏输出模式和弱上拉模式 其中一个设备的内部结构 I2C通信是怎么实现的 I2C时序结构 起始条件和终止条件 发送一个字节 接收一个字节 发送应答…

【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目

作者推荐 视频算法专题 本博文涉及知识点 深度优先搜索 树 图论 分类讨论 LeetCode2973. 树中每个节点放置的金币数目 给你一棵 n 个节点的 无向 树,节点编号为 0 到 n - 1 ,树的根节点在节点 0 处。同时给你一个长度为 n - 1 的二维整数数组 edges…

计网day1

RTT:往返传播时延(越大,游戏延迟) 一.算机网络概念 网络:网样的东西,网状系统 计算机网络:是一个将分散得、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功…

课堂秩序要求有哪些内容

你是否曾经疑惑,为什么有些课堂总是秩序井然,而有些则混乱不堪?作为一位经验丰富的老师,我想告诉你,课堂秩序不仅仅是学生安静听讲那么简单,它背后涉及到许多关键因素,直接影响着教学质量和学习…

Unity学习笔记(零基础到就业)|Chapter04:C#篇补充到Unity篇过渡

Unity学习笔记(零基础到就业)|Chapter02:C#篇补充到Unity篇过渡 前言C#总结补充1.值类型和引用类型有什么区别,他们在值的传递上分别有怎样的特性2.string是引用类型,但是他对外表现出值类型的特性,为什么&…

【BIAI】Lecture 14 - Sleep and Dreaming

Sleep and Dreaming 专业词汇 pons 延髓 parietal cortex 顶叶皮层 limbic system 边缘系统 temporal cortex 颞叶皮层 dorsolateral prefrontal cortex 背外侧前额叶皮层 pineal gland 松果体 Suprachiasmatic Nucleus 视交叉上核 课程大纲 Sleep stages awake无眼动睡眠&am…

Java异常处理 throw和throws

目录 throwthrows实例制造异常 在Java中,throw和throws关键字都与异常处理有关,但它们的使用方式和目的有所不同。 throw throw关键字: * throw用于在代码中显式地抛出一个异常。你可以使用它来触发一个异常,并指定异常的类型。…

Google刚刚推出了图神经网络Tensorflow-GNN

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Hadoop-Yarn-ResourceManagerHA

在这里先给屏幕面前的你送上祝福,祝你在未来一年:技术步步高升、薪资节节攀升,身体健健康康,家庭和和美美。 一、介绍 在Hadoop2.4之前,ResourceManager是YARN集群中的单点故障 ResourceManager HA是通过 Active/St…

[职场] 公安管理学就业方向及前景 #媒体#笔记#笔记

公安管理学就业方向及前景 公安管理学是中国普通高等学校本科专业。本专业文理兼收,学制4年,授予法学学士学位。本专业培养掌握马克思主义基本原理,政治坚定,坚持党和国家的路线、方针、政策,具有良好职业素养、科学素…

Makefile编译原理 make 中的路径搜索_1

一.make中的路径搜索 问题:在实际的工程项目中,所有的源文件和头文件都放在同一个文件夹中吗? 实验1 : VPATH 引子 mhrubuntu:~/work/makefile1/17$ ll total 28 drwxrwxr-x 4 mhr mhr 4096 Apr 22 00:46 ./ drwxrwxr-x 7 mhr m…

双指针-two pointers的应用

1.枚举输出解法&#xff1a; #include <iostream> using namespace std; int num[1000]; int main(){int result,n;cin>>result>>n;for(int i0;i<n;i)cin>>num[i];for(int i0;i<n;i)for(int ji1;j<n;j)if(num[i]num[j]result)cout<<nu…

操作系统——内存管理(附带Leetcode算法题LRU)

1.内存管理主要用来干什么&#xff1f; 操作系统的内存管理主要负责内存的分配与回收、内存扩充(虚拟技术)、地址转换(逻辑-物理)、内存保护(保证各进程在自己的内存空间运行&#xff0c;不会越界访问)..... 2.什么是内存碎片&#xff1f; 内存碎片是内存的申请和释放产生的…

SpringBoot3整合Knife4j

前置&#xff1a; 官网&#xff1a;快速开始 | Knife4j gitee&#xff1a;swagger-bootstrap-ui-demo: knife4j 以及swagger-bootstrap-ui 集成框架示例项目 - Gitee.com 1.依赖引入&#xff1a; ps&#xff1a;json处理需要引入相关包 <dependency><groupId>c…

【GAMES101】Lecture 21 动画

目录 关键帧&#xff08;Keyframe animation&#xff09; 物理仿真&#xff08;Physical simulation&#xff09; 质点弹簧系统 粒子系统 运动学&#xff08;Kinematics&#xff09; 正运动学&#xff08;Forward Kinematics&#xff09; 逆运动学&#xff08;Inverse K…

【MySQL】-18 MySQL综合-4(MySQL储存引擎精讲+MySQL数据类型简介+MySQL整数类型+MySQL小数类型)

MySQL储存引擎精讲MySQL数据类型简介MySQL整数类型MySQL小数类型 十一 MySQL存储引擎精讲11.1 什么是存储引擎11.2 MySQL 5.7 支持的存储引擎11.3 如何选择 MySQL 存储引擎11.4 MySQL 默认存储引擎 十二 MySQL数据类型简介12.1 MySQL 常见数据类型1) 整数类型2) 日期/时间类型3…