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

文章目录

  • 📕教程说明
  • 📕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.mzph.cn/news/678702.shtml

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

相关文章

从Unity到Three.js(模型文件加载)

模型加载功能探索,用blender导出了个glb格式的cube进行的测试。 初接触js语法,回调注册的地方直接使用匿名函数总感觉脑子跟不上,反应不过来,就把加载后的回调简单封装了下, 官方文档是直接使用的匿名函数。 另外看官方…

带你了解软件系统架构的演变详解

在这个数字时代,我们身边无处不在的软件系统扮演着无比重要的角色。你曾想过背后那复杂的系统是如何演变而来的吗?本文将深入浅出,以小白的视角,描绘软件系统架构的绚丽蜕变历程,让我们一同踏上这场感性而技术的冒险之…

Peter算法小课堂—背包问题

我们已经学过好久好久的动态规划了,动态规划_Peter Pan was right的博客-CSDN博客 那么,我用一张图片来概括一下背包问题。 大家有可能比较疑惑,优化决策怎么优化呢?答案是,滚动数组,一个神秘而简单的东西…

刘谦龙年春晚魔术模拟

守岁共此时 代码 直接贴代码了,异常处理有点问题,正常流程能跑通 package com.yuhan.snginx.util.chunwan;import java.util.*;/*** author yuhan* since 2024/02/10*/ public class CWMS {static String[] num {"A", "2", &quo…

更换商品图片日期JSON格式报错 - 序列化与反序列化日期格式设置

报错信息 msg: “服务端异常,请联系管理员JSON parse error: Cannot deserialize value of type java.util.Date from String “2023-11-13 13:13:35”: not a valid representation (error: Failed to parse Date value ‘2023-11-13 13:13:35’: Cannot parse da…

点云标注工具

目录 3d手势识别 c 3d关键点,Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点,Bou…

bcdedit /store 填什么,Windows11的BCD文件在哪里?

Windows11为EFI引导,bcd文件在 EFI分区的 \EFI\Microsoft\Boot\BCD 可以选择挂载EFI分区,或者使用如下方式,该路径可充当盘符使用。 例 bcdedit /store Z:\EFI\Microsoft\Boot\BCD /enum /v

【LeetCode每日一题】二维前缀和基本概念与案例

二维前缀和 根据某个块块 的 左上角坐标,和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(matrix) {let row matrix.length;let col matrix[0].length;// 初始化一个二维数组&am…

2024/2/11

运算符 1、选择题 1.1、若有以下程序 main() { char a1,b2; printf("%c,",b); printf("%d\n",b-a); } 程序运行后的输出结果是 C A)3,2 B)50,2 C)2,2 D)2,50 1.2、有以下程序 main() { int a,…

项目02《游戏-13-开发》Unity3D

基于 项目02《游戏-12-开发》Unity3D , 任务 :宠物系统 及 人物头像血条 首先在主面板MainPanel预制体中新建一个Panel, 命名为PlayerInfo 新建Image,作为头像 新建Slider,作为血条 对Panel组件添加一个水…

Day40- 动态规划part08

一、单词拆分 题目一:139. 单词拆分 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以…

基于布隆过滤器的跨平台USB存储设备管控方案

1、前言 U盘作为移动存储设备之一,是我们日常生活中接触最多和最常用的存储介质。正因如此,针对U盘内容的管理也因为使用场景的多样和复杂性,变得难以实现。 我们的设计思路是先通过某些手段对U盘进行病毒,并在查杀完成后对U盘进…

PE 特征码定位修改程序清单 uiAccess

requestedExecutionLevel level"asInvoker" uiAccess"false" 可以修改这一行来启用禁用原程序的盾牌图标,似乎作用不大。以前没事写的一个小玩意,记录一下。 等同于这里的设置: 截图 代码如下: #include …

谷粒商城【成神路】-【7】——库存系统

目录 🧈1.仓库维护 🍟🍟1.1配置网关陆游规则 🍟🍟1.2修改模糊查询 🥞2.仓库库存 🍿3.采购需需求 🍟🍟3.1采购的模糊检索 🍟🍟3.2合并…

system V——进程间通信

上一篇博客中我介绍了system V进程间通信中的内存共享,但是其中还有两 种通信方式:消息队列、和信号量,接下来我将简单介绍一下,消息队列和 信号量以及操作系统是如何看待system V进程间通信的。1. 消息队列 a. 大致介绍 消息队…

4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线?通用型-4核8G-180G-2000G,2000GB月流量,系统盘为180GB SSD盘,12M公网带宽,下载速度峰值为1536KB/s,即1.5M/秒,假设网站内页平均大小为60KB…

职业发展 - 一个专注于嵌入式物联网架构设计的攻城狮(转载)

1 关于我 很高兴大家都关注到我,从而看到这篇简要的介绍,下面有更多的关于我。 我是一个嵌入式架构师,早前从事过智能电网相关的电力设备开发,金融POS机开发,以及eSIM相关的软件开发,现在主要在做嵌入式I…

Linux文本三剑客(1)

文章目录 一、通配符二、find文件查找查找条件处理动作 三、正则表达式四、Linux三剑客之grep实例正则表达式(基于grep)基础正则表达式扩展正则 最常用 五、Linux三剑客之sed语法动作说明实例以行为单位的新增/删除以行为单位的替换与显示数据的搜寻并显…

云原生容器化-3 Dockerfile

1.Dockerfile作用 用户可以使用两种方式构建Docker镜像: 手动方式和Dockerfile自动方式。 [1] 手动方式 运行基础镜像为容器后,根据业务需要进行定制化操作,然后手动通过docker commit命令将容器保存为镜像。 [2] Dockerfile 将依赖的基础镜像和定制化操…

CVE-2012-1823 漏洞复现

CVE-2012-1823 PHP SAPI 与运行模式 首先,介绍一下PHP的运行模式。 下载PHP源码,可以看到其中有个目录叫sapi。sapi在PHP中的作用,类似于一个消息的“传递者”,比如在《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 &…