混合现实(Mixed Reality,简称MR)是这两年越来越火的技术方向。随着Apple Vision Pro的发布和Meta Quest系列的普及,MR/VR设备越来越多地进入消费者和企业市场,MR开发也成了一个热门的技术方向。
但MR开发和传统的软件开发不太一样,它涉及到3D渲染、空间感知、手势交互、眼动追踪、空间音频等很多特殊的技术,配置起来也比较复杂。很多初学者刚接触MR开发的时候,会被各种配置项搞得晕头转向。
这篇文章就来详细讲解MR混合现实开发的配置,从基础的环境搭建,到高级的功能配置,一步步带你入门MR开发。
什么是混合现实
在开始配置之前,先简单了解一下什么是混合现实。
混合现实(Mixed Reality)是虚拟现实(VR)和增强现实(AR)的结合,它把虚拟物体和真实世界融合在一起,让用户既能看到真实世界,又能看到叠加在真实世界上的虚拟物体,并且可以和这些虚拟物体进行交互。
和VR不同,VR是完全沉浸在虚拟世界里,看不到真实世界。和AR不同,AR是把虚拟信息叠加在真实世界上,但虚拟物体和真实世界没有深度交互,只是简单的叠加。MR则是虚拟物体和真实世界深度融合,虚拟物体可以和真实世界的物体发生遮挡、碰撞、交互,就像真实存在一样。
MR设备主要有两类:一类是透视式(Video See-through),比如Apple Vision Pro、Meta Quest 3,用摄像头捕捉真实世界,然后和虚拟画面合成后显示在屏幕上。另一类是光学透视式(Optical See-through),比如Microsoft HoloLens,用半透明的镜片,用户可以直接看到真实世界,虚拟物体通过光学系统投影到镜片上。
MR开发的主流平台是Unity和Unreal Engine,其中Unity用得更多,因为它对MR的支持更好,生态更完善,MRTK(Mixed Reality Toolkit)工具包就是Unity的。这篇文章主要讲基于Unity的MR开发配置。
基础配置:环境搭建
MR开发的第一步,是搭建开发环境。
硬件要求
MR开发对电脑的配置要求比较高,因为要处理3D渲染和实时视频合成。推荐配置:
CPU:Intel i7或AMD Ryzen 7以上,多核性能强的CPU。 显卡:NVIDIA GTX 1060以上,推荐RTX 3060以上,显存至少6GB。如果是开发Vision Pro,因为用的是Metal,Mac电脑也可以,但Mac的显卡性能一般,复杂场景可能会卡。 内存:至少16GB,推荐32GB。MR开发的Unity项目比较吃内存。 硬盘:至少256GB空闲空间,推荐SSD,Unity项目和构建产物很占空间。 系统:Windows 10/11(64位),或者macOS 13+(开发Vision Pro需要)。
除了开发电脑,还需要MR设备。如果是开发HoloLens,需要HoloLens 2设备。如果是开发Quest,需要Quest 2/3设备。如果是开发Vision Pro,需要Vision Pro设备,或者至少有一台Mac来做模拟器开发。
如果没有设备,也可以用模拟器开发,但模拟器的体验和真机差很多,很多功能(比如手势追踪、空间映射)在模拟器上无法测试,最终还是需要真机验证。
软件安装
需要安装的软件:
- Unity Hub和Unity编辑器。MR开发推荐用Unity 2022 LTS或者2021 LTS版本,不要用太新的版本,因为MRTK和各种插件可能还不支持。安装Unity的时候,要勾选对应的构建模块:
- 开发HoloLens:勾选Universal Windows Platform Build Support。 - 开发Quest:勾选Android Build Support(包括Android SDK & NDK Tools、OpenJDK)。 - 开发Vision Pro:需要Unity 2022.3.7以上版本,勾选visionOS Build Support(需要单独安装)。
- Visual Studio 2022。用来写C#脚本和调试UWP应用。安装的时候要勾选"使用Unity的游戏开发"工作负载,以及"通用Windows平台开发"工作负载(开发HoloLens需要)。
- 设备对应的SDK和工具:
- HoloLens:需要Windows 10/11 SDK,Visual Studio会自动安装。 - Quest:需要Meta Quest Developer Hub,用来管理设备、安装应用、调试。Android SDK和NDK在安装Unity的时候会一起安装。 - Vision Pro:需要Xcode 15+(Mac上),以及Apple Developer账号。
- 版本控制工具:Git,用来管理项目代码。
安装完这些基础软件之后,就可以开始创建MR项目了。
基础配置:创建Unity项目
打开Unity Hub,创建一个新的3D项目。注意不要用URP或者HDRP模板,MRTK对内置渲染管线的支持最好,URP支持也可以但配置更复杂,HDRP在MR设备上性能太差不推荐。
创建好项目之后,需要导入MRTK工具包。
MRTK(Mixed Reality Toolkit)是微软开源的MR开发工具包,提供了大量的预制件、脚本、交互组件,能大大简化MR开发。MRTK有两个版本:MRTK 2(稳定版,支持HoloLens、Quest等)和MRTK 3(新版,架构更现代,但还在快速迭代中)。初学者推荐用MRTK 2,文档更完善,教程更多,稳定性更好。
导入MRTK的方法:
- 在Unity的Package Manager里,添加MRTK的包。可以用Git URL添加,也可以下载Unity包手动导入。
- 导入MRTK Foundation、MRTK Standard Assets、MRTK Examples等核心包。
- 导入之后,Unity会弹出MRTK的配置窗口,引导你完成项目配置。
MRTK配置窗口会帮你做这些事情:
- 切换项目的构建平台(UWP/Android/visionOS)。
- 配置XR插件管理。
- 设置相机和输入系统。
- 配置空间感知、手势交互等功能。
按照配置窗口的引导,一步步完成配置。配置完成之后,项目就具备了MR开发的基础环境。
基础配置:相机和输入系统
MR项目中,相机和输入系统是最基础的配置。
相机配置
MR设备的相机和普通的3D相机不一样,它需要处理立体渲染(左右眼分别渲染)、头部追踪、透视合成等。MRTK会自动帮你配置好相机,但你需要了解一些关键参数。
MRTK的相机预制件是MixedRealityCameraParent,里面包含了相机、头部追踪、位移等组件。把这个预制件拖到场景里,替换掉默认的Main Camera。
相机的关键参数:
- 近裁剪面(Near Clip):MR设备的近裁剪面要设置得比较近,一般0.1米左右,这样虚拟物体离得近的时候不会被裁掉。
- 远裁剪面(Far Clip):根据场景需要设置,一般不要太远,否则影响性能。
- 清除标志(Clear Flags):透视式MR设备(Quest、Vision Pro)用Solid Color,背景设为黑色,这样真实世界的视频会透过来。光学透视式设备(HoloLens)也是黑色背景。
- 立体渲染模式:根据设备设置,Single Pass Instanced是性能最好的模式,推荐使用。
输入系统
MR设备的输入方式很多,包括手势追踪、手柄、眼动追踪、语音输入等。MRTK提供了统一的输入系统,能屏蔽不同设备的差异,用一套代码支持多种输入方式。
MRTK的输入系统配置:
- 输入提供者(Input Data Providers):在MRTK配置文件里,添加对应的输入提供者。比如HoloLens的手势输入、Quest的手柄输入、OpenXR的标准输入等。
- 手势配置:配置支持的手势类型,比如捏合(Pinch)、手掌(Palm)、握拳(Fist)等。MRTK提供了手势预制件,可以可视化手势。
- 指针配置:配置指针类型,比如手部射线指针(Hand Ray)、视线指针(Gaze Pointer)、鼠标指针等。指针是用户和UI交互的主要方式。
- 输入动作映射:把输入映射到具体的动作,比如选择、导航、菜单等。
配置好输入系统之后,就可以在场景里添加可交互的物体了。MRTK提供了很多交互组件,比如Button、Slider、Manipulator(可拖拽物体)、Bounding Box(物体边界框)等,这些组件都支持手势和手柄交互,不需要写太多代码。
基础配置:空间感知
空间感知(Spatial Awareness)是MR的核心功能之一,它让设备能够感知真实世界的环境,包括平面、网格、物体等,这样虚拟物体才能和真实世界正确地交互,比如放在桌面上、被墙挡住等。
MRTK的空间感知配置:
- 在MRTK配置文件里,启用Spatial Awareness功能。
- 配置空间感知提供者:根据设备选择对应的提供者,比如HoloLens的Spatial Mesh Observer、OpenXR的平面检测等。
- 配置观察参数:
- 观察范围(Observation Extents):设备周围多大范围内的空间会被感知,一般5米左右。 - 更新间隔(Update Interval):空间网格多久更新一次,更新太频繁影响性能,太慢则不够实时。 - 网格精度(Mesh LOD):空间网格的精度,高精度网格更准确但性能差,低精度网格性能好但不够准确。
- 配置平面检测:检测真实世界中的平面,比如地面、桌面、墙面,用来放置虚拟物体。可以配置平面的大小阈值、法线方向等。
- 配置网格显示:可以选择是否显示空间网格,调试的时候显示网格方便查看空间感知的效果,发布的时候一般隐藏网格。
配置好空间感知之后,就可以在场景里使用空间数据了。比如用平面检测找到桌面,然后把虚拟物体放在桌面上;用空间网格做碰撞检测,让虚拟物体不会穿过真实的墙。
基础配置:UI和交互
MR应用的UI和传统的2D UI不一样,它是3D空间中的UI,用户需要用手势或视线来交互。MRTK提供了一套完整的UI组件,能快速搭建MR界面。
常用的MRTK UI组件:
- Button(按钮):MRTK的按钮支持按压、悬停、选中状态,有3D按压效果。可以绑定点击事件,响应用户操作。按钮有很多样式,比如圆形按钮、方形按钮、图标按钮等。
- Slider(滑块):用来调节数值,比如音量、亮度等。支持手势拖拽。
- Toggle(开关):用来切换状态,比如开关某个功能。
- 面板(Panel):用来组织UI元素,可以是固定在空间中的面板,也可以是跟随用户的面板。MRTK提供了近距交互面板和远距交互面板。
- 手菜单(Hand Menu):跟随手掌的菜单,用户抬起手掌就能看到菜单,方便快捷操作。
- 跟随菜单(Follow Menu):始终跟随用户视线的菜单,用户转头它也跟着转,始终在用户视野内。
- 可交互物体(Manipulator):给3D物体添加交互组件,用户可以用手势拖拽、旋转、缩放物体。有Object Manipulator和Bounds Control两种常用组件。
- 语音输入(Speech Input):MRTK支持语音命令,用户可以用语音来操作应用。配置关键词和对应的动作,用户说出关键词就会触发对应的动作。
配置UI的注意事项:
- UI的大小和距离要合适,太远太小用户看不清,太近太大用户看不全。一般UI放在用户前方1-2米处,大小根据内容调整。
- 交互区域要足够大,方便用户点击,太小的按钮用户很难准确点击。
- 提供视觉反馈,按钮按下的时候要有效果,让用户知道操作成功了。
- 考虑单手操作和双手操作,尽量支持单手操作,方便用户使用。
高级配置:性能优化
MR应用对性能要求很高,因为要实时渲染左右眼两个画面,还要处理空间感知、手势追踪、视频合成等。性能不好的话,会出现卡顿、延迟,导致用户眩晕,体验很差。
MR应用的性能优化是一个大话题,这里讲几个关键的优化点。
渲染优化
- 控制Draw Call:Draw Call太多会导致CPU瓶颈。用批处理(Batching)减少Draw Call,静态物体用Static Batching,动态物体用GPU Instancing。合并材质,减少材质数量。
- 控制多边形数量:MR设备的GPU性能有限,场景的多边形总数要控制。一般建议每个眼睛的多边形不超过10万。用LOD(Level of Detail)技术,远处的物体用低精度模型。合并网格,减少物体数量。
- 控制纹理大小:纹理太大会占用显存和带宽。用合适大小的纹理,不要用比需要大的纹理。用纹理压缩,比如ASTC格式。开启mipmap,远处的物体用小纹理。
- 用简单的着色器:复杂的着色器(比如PBR、多光源)会增加GPU负担。MR应用推荐用简单的着色器,比如MRTK提供的标准着色器,支持光照但性能较好。尽量减少实时光源,用光照贴图(Lightmap)代替。
- 控制填充率:避免大量的透明物体重叠,导致过度绘制(Overdraw)。透明物体的渲染开销很大,尽量少用。
应用优化
- 控制帧率:MR应用的目标帧率是设备的刷新率,HoloLens是60fps,Quest是72/90/120fps,Vision Pro是90fps。帧率不够会导致眩晕。用固定帧率模式,不要用垂直同步。
- 优化脚本性能:避免在Update里做耗时操作,比如大量的计算、字符串拼接、GC分配。用对象池减少GC。用事件驱动代替轮询。
- 异步加载:场景切换、资源加载用异步方式,不要阻塞主线程,避免卡顿。
- 合理使用空间感知:空间网格的更新和渲染很耗性能,不需要的时候关闭空间感知,或者降低更新频率和网格精度。
- 优化物理:物理模拟很耗性能,尽量减少刚体和碰撞体的数量。不需要物理的物体不要加刚体。用层碰撞矩阵,减少不必要的碰撞检测。
特定设备优化
不同的MR设备,性能特点不一样,需要针对性优化。
HoloLens 2:性能相对较弱,特别要注意多边形数量和Draw Call。HoloLens是光学透视,黑色是透明的,所以尽量用深色背景,不要用大面积的白色,否则会显得很亮,不真实。
Quest 3:性能比HoloLens好,但还是要注意。Quest是透视式,用视频透视,需要处理摄像头视频。Quest的手柄追踪比手势追踪更稳定,优先支持手柄。
Vision Pro:性能最强,支持眼动追踪和手势追踪。Vision Pro的显示分辨率很高,要注意纹理质量。眼动追踪可以用来做注视点渲染(Foveated Rendering),只在用户注视的区域渲染高精度,其他区域低精度,大大提升性能。
高级配置:眼动追踪
眼动追踪(Eye Tracking)是高端MR设备的特色功能,HoloLens 2和Vision Pro都支持。眼动追踪可以知道用户在看什么,用来做交互和优化。
眼动追踪的配置:
- 在MRTK配置文件里,启用Eye Tracking功能。
- 配置眼动追踪数据提供者,根据设备选择对应的提供者。
- 在Player Settings里,启用眼动追踪权限。HoloLens需要在Package.appxmanifest里声明眼动追踪权限。Vision Pro需要在Info.plist里声明。
- 用户第一次使用的时候,需要做眼动校准,设备会引导用户完成校准。
眼动追踪的应用场景:
- 注视点交互:用户看着某个物体,然后用手势或语音确认,就可以选中这个物体。这种交互方式比用手射线更自然,更省力。
- 注视点渲染(Foveated Rendering):只在用户注视的中心区域渲染高精度,周边区域渲染低精度,大大提升渲染性能。这是高端MR设备常用的优化技术。
- 注意力分析:分析用户的注视点,知道用户对什么内容感兴趣,用来优化UI布局和内容设计。比如用户长时间看某个按钮,说明这个按钮可能有问题,或者用户感兴趣。
- 自动隐藏UI:用户看着UI的时候UI显示,不看的时候UI自动隐藏,减少干扰。
眼动追踪的注意事项:
- 眼动追踪有精度限制,不是100%准确,不要用来做精确的选择操作。
- 要考虑没有眼动追踪的设备,提供降级方案,比如用手射线代替。
- 注意隐私,眼动数据是敏感数据,要明确告知用户,不要未经允许收集和上传。
高级配置:空间音频
空间音频(Spatial Audio)是MR体验的重要组成部分,它让声音有空间感,用户能听出声音来自哪个方向、多远,大大增强沉浸感。
Unity的空间音频配置:
- 在Audio Settings里,把空间音频插件设置为设备对应的插件。HoloLens用MS HRTF,Quest用Oculus Spatializer,Vision Pro用Apple Spatial Audio。
- 给Audio Source组件启用Spatialize选项,把3D Sound Settings设置好,包括体积曲线、衰减模式、多普勒等级等。
- 用Audio Mixer管理音频,把不同类型的声音(语音、音效、背景音乐)分到不同的组,方便控制音量和效果。
空间音频的注意事项:
- 不是所有声音都需要空间音频,UI提示音、背景音乐可以用2D音频。
- 空间音频的计算有性能开销,不要同时播放太多空间音频。
- 不同设备的空间音频效果不一样,要在真机上测试调整。
高级配置:多平台支持
如果你的MR应用需要支持多个平台(HoloLens、Quest、Vision Pro),需要做一些配置来支持多平台。
多平台支持的策略:
- 用抽象层隔离平台差异:定义一套统一的接口,每个平台实现自己的版本。比如空间感知接口、手势接口、眼动追踪接口,不同平台有不同的实现,但上层代码调用统一的接口。
- 用条件编译:用C#的预处理指令,根据平台编译不同的代码。比如#if WINDOWSUWP里写HoloLens特有的代码,#if UNITYANDROID里写Quest特有的代码。
- 用Assembly Definition:把不同平台的代码分到不同的程序集里,根据平台引用对应的程序集,避免编译错误。
- 场景分离:不同平台的场景差异大的话,可以做多个场景,每个平台一个场景,共享核心逻辑。
- 构建配置:用Unity的Build Profiles或者CI/CD工具,自动化不同平台的构建流程。
多平台支持会增加开发和测试的复杂度,要根据实际需求决定是否需要。如果只是针对一个平台开发,就不需要做这些复杂的配置。
常见问题和坑
MR开发中,有一些常见的问题和坑,提前提醒一下。
第一个坑:性能问题导致眩晕。MR应用最忌讳的就是卡顿和延迟,会导致用户眩晕。一定要重视性能优化,在真机上测试帧率,确保达到目标帧率。不要只在编辑器里测试,编辑器的性能和真机差很多。
第二个坑:空间感知不准确。不同环境下,空间感知的效果不一样,光线暗、反光表面、空旷房间等情况下,空间感知可能不准确。要在各种环境下测试,做好容错处理,空间感知失败的时候要有降级方案。
第三个坑:手势识别不稳定。手势追踪受光线、手部遮挡、背景等因素影响,可能不稳定。不要设计需要精确手势的操作,提供手柄、语音等替代交互方式。给用户清晰的视觉反馈,让用户知道手势是否被识别。
第四个坑:UI位置和大小不合适。UI放得太远太小,用户看不清;放得太近太大,用户看不全;放的位置不对,用户找不到。要在真机上反复测试UI的位置和大小,确保用户能方便地看到和操作。
第五个坑:忽略用户舒适度。MR应用要考虑用户的舒适度,不要设计需要用户长时间抬头、低头、转身的操作,不要设计快速移动的画面(会导致眩晕),不要设计太亮太闪的画面。要让用户舒适地使用应用。
第六个坑:没有做好错误处理。MR设备的各种传感器可能会失效,比如追踪丢失、空间感知失败、手势识别失败。要做好错误处理,在传感器失效的时候给用户提示,提供恢复方法,不要让应用崩溃或者无响应。
写在最后
MR混合现实开发是一个很有前景的方向,随着设备的普及和性能的提升,MR应用会越来越多。但MR开发也确实比较复杂,涉及到很多特殊的技术和配置,需要花时间学习和实践。
这篇文章从基础的环境搭建,到高级的性能优化、眼动追踪、空间音频,讲解了MR开发的主要配置点。希望能帮你快速入门MR开发,少走弯路。
但MR技术发展很快,新的设备、新的工具、新的API不断出现,这篇文章里的内容可能会随着版本更新而变化。最重要的是掌握核心概念和方法,然后在实践中不断学习和更新。
如果你对MR开发感兴趣,建议先从一个简单的小项目开始,比如在场景里放一个可交互的3D物体,能拖拽、能点击,然后逐步增加功能。在实践中学习,比单纯看文档和教程效果好得多。
MR是一个充满想象力的领域,它能把数字世界和真实世界融合在一起,创造出很多全新的体验。希望这篇文章能帮你打开MR开发的大门,创造出有趣的MR应用。
有什么问题欢迎交流,一起学习进步。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录