
本书是 VR 自学爱好者的一本入门书,全书共 16 章,全面讲述了在制作 VR 应用程序的过程中所必备的软/硬件知识。硬件层面以 HTC VIVE 为主要硬件平台,同时介绍了两款配合其使用的外部设备—— VIVE 追踪器和 Leap Motion;软件层面以制作 VR 应用程序的核心工作流程为主线,以 Unity 为游戏引擎,从 VR 交互原则、材质、UI、编程开发、调试优化等方面逐步展开介绍各工作环节的主要内容。同时,本书辅以丰富的案例项目,重点介绍了 SteamVR、InteractionSystem、VRTK 等必备插件在实际项目中的使用方法,帮助读者快速上手制作属于自己的 VR 应用程序。本书适合对制作 VR 应用程序感兴趣的人员,以及有志于从事 VR 软件开发工作的人员阅读,同时也适合院校及培训虚拟现实机构相关专业的师生参考。
虚拟现实行业由初期的概念炒作发展到了稳步增长阶段。纵观整个行业的发展历程,当前的硬件设备水平已经有了长足的进步,分辨率更高的屏幕、视野更加广阔的头部显示器、携带更加方便的设备,未来的 5G 与人工智能技术也将会给虚拟现实行业带来前所未有的发展机遇。 2018 年 9 月 14 日,教育部正式宣布在《普通高等学校高等职业教育(专科)专业目录》中增设“虚拟现实应用技术”专业。2019 年,全国将有 71 所高职院校首次开设虚拟现实应用技术专业,人才缺口随着行业的发展也日益凸显。 VR 内容(应用程序、视频等)始终是基础设置上的重要一环,也是各种政策及大环境下需要催生孵化出的结果。从宏观发展角度看,虚拟现实行业目前还处于初级发展阶段,但在未来必定会蓬勃发展,所以当前是进行技术知识储备的关键时期。 Unity 是当前业界领先的 VR/AR 内容制作工具,全球 60%以上的 VR/AR 内容都是基于 Unity引擎进行制作的,Unity 为制作优质的 VR 内容提供了一系列先进的解决方案,无论是 VR、AR还是 MR,都可以使用 Unity 高度优化的渲染流水线以及编辑器的快速迭代功能,使项目需求得以完美实现。基于跨平台的优势,Unity 支持所有新型的主流平台,原生支持 Oculus Rift、SteamVR/VIVE、Playstation VR、Gear VR、Microsoft HoloLens 以及 Google 的 Daydream 等。本书也将以 Unity 为核心,讲解制作 VR 应用程序的方方面面,希望能够帮助读者做出属于自己的 VR应用程序。 本书主要内容 第 1 章:对 VR 行业进行了概述,介绍了该技术在其他行业中的应用案例,以及目前 VR 行业面临的挑战。 第 2 章:对 Unity 编辑器进行了介绍。 第 3 章:对主流硬件设备及分类进行了介绍,使读者对当前主流 VR 硬件平台有了初步认知。 第 4 章:介绍了 VR 应用程序制作的基本工作流程和一些常用的开发工具。 第 5 章:介绍了在 VR 应用程序中需要遵循的交互原则。 第 6 章:介绍了 HTC VIVE 硬件的基本结构、安装步骤、实现位置追踪的原理,并对作为主要交互设备的控制器的按键进行了说明。 第 7 章:介绍了 VR 中的 UI 技术,讲解了在 Unity 中如何将 UI 元素设置为能够在 VR 环境中呈现的方法。 第 8 章:笔者从接触的学员作品来看,大部分 VR 应用程序只聚焦于交互的实现,忽视了作品的呈现品质,而这恰是 VR 应用程序给用户的第一印象。本章介绍了基于物理的渲染理论(PBR),以及常用的 PBR 材质制作软件,通过实例介绍了 Substance Painter 的使用方法,目的是为了强调写实材质在 VR 应用程序中的关键地位。 第 9 章:SteamVR 是进行PC 平台 VR 应用程序开发的重要工具,本章通过实例介绍了 SteamVR以及基于其上的 InteractionSystem 的核心模块和基本使用方法。 第 10 章:VRTK 是基于 SteamVR 进行 VR 应用程序开发的重要插件,本章详细介绍了 VRTK的使用方法,通过一系列实例,讲解了该插件在 VR 交互开发工作中的高效性。 第 11 章:VR 平台与 PC、移动平台最大的区别在于交互方式的不同,本章通过演示将 PC平台上的一款游戏移植到 VR 平台的过程,展示交互开发在 VR 平台上的重要性。 第 12 章:介绍了手势识别设备 — Leap Motion 在 VR 中的应用,通过一个器械装配实例,讲解了如何在 VR 中通过手势实现与物体的交互。 第 13 章:介绍了 VIVE 追踪器(Tracker)的基本使用方法,通过实例讲解了如何实现在 VR环境中将追踪器与现实世界物体进行绑定并跟踪其位置。 第 14 章:演示了类似 VR 游戏《水果忍者 VR》的原型项目开发,包括游戏逻辑、水果生成、切割效果、计分 UI 呈现等功能模块。 第 15 章:演示了类似 VR 应用程序 Tilt Brush 的原型项目开发,包括在 VR 环境中使用控制器绘制线条、修改画笔颜色等功能模块。 第 16 章:介绍了 Unity 编辑器内置的性能分析工具,同时针对 Unity 讲解了几种应用程序的优化原则。 附录 A:收录了 VR/AR 行业常见的技术概念并做出解释,使读者在以后的工作和学习中能够有效地阅读 VR/AR 相关的文献资料。 附录 B:由于本书重点不是介绍 Unity 编辑器的基本使用方法,所以在本部分为初学者提供了关于使用 Unity 的基础小贴士,以便读者更加熟练地使用 Unity。 科技日新月异,Unity 及相关的软件也在飞速发展,本书介绍的技术也会随着时间的推进而不再适用,甚至一个插件的版本号的更新也会导致之前的应用程序运行出现问题。鉴于此,读者可在公众号“XR 技术研习社”阅读和查看关于 VR 技术的文章和资源,如果对本书内容存有疑问,也可在后台留言。 致谢 2016 年 5 月,淄博创客空间创始人于方军老师介绍李晔老师给我认识,并带我们参加了在上海举办的 CES Asia 2016 中美创客大赛,我和李晔老师分别获奖。我们也因此成了朋友,在以后的日子里时常交流工作中的经历和想法。上海之行后,李晔老师将我介绍给蛮牛教育,录制了我的首套 VR 视频教程 — “HTC VIVE 房产项目实战教程”,由于运气成分占多,当时国内在VR 开发方面的资料相对较少,加之游戏蛮牛的影响力,这套教程在当时受到了一定程度的关注。后来,李晔老师又将我推荐给电子工业出版社,于是便有了这本书的出版,在这里一并向李晔老师表示感谢,同时也感谢于方军老师促成的这段机缘。 感谢本书的责任编辑孔祥飞先生,在整个写作周期里始终保持着耐心和专业的态度,也感谢其团队对书稿进行的专业审稿和排版工作。 感谢我的家人——邵昌文先生、张淑美女士、李木子女士在写作期间分担的家庭责任。
第 1 章 VR 行业概述 /1 1.1 VR 介绍 /1 1.2 VR 技术应用案例 /1 1.3 VR 技术当前面临的挑战 / 5 1.3.1 硬件价格 / 5 1.3.2 运算及显示能力 /5 1.3.3 交互 / 5 1.3.4 移动性 /6 1.3.5 内容 / 7 1.3.6 小结 / 7 第 2 章 Unity VR 概述 / 8 2.1 Unity VR / 8 2.1.1 图形渲染 /8 2.1.2 真实物理引擎 / 9 2.1.3 多 VR 平台原生支持 /9 2.1.4 丰富的资源 /10 2.1.5 对开发者友好 /10 2.1.6 不断更新的 Unity 版本 / 11 2.2 使用 C#脚本进行 VR 交互开发 /12 第 3 章 当前主流 VR 硬件 / 13 3.1 HTC VIVE / 13 3.2 Oculus Rift / 13 3.3 Gear VR / 14 3.4 Cardboard /14 3.5 Daydream 平台 15 3.6 逐渐崛起的 VR 一体机 / 16 3.6.1 Oculus Go 和小米 VR 一体机 /17 3.6.2 HTC VIVE Focus /18 3.7 未来展望 /18 第 4 章 VR 应用程序开发工作流程 /20 4.1 资源准备 /20 4.2 模型优化及重拓扑 /23 4.3 展 UV 的过程 / 24 4.4 材质贴图制作 /25 4.5 将资源导入 Unity / 25 4.6 导入开发工具包 /26 4.7 场景搭建 /26 4.8 设置光照环境 /27 4.9 交互开发 /28 4.10 测试优化 / 28 4.11 发布应用程序 / 28 4.12 常用开发工具 /29 第 5 章 VR 交互设计原则 / 36 5.1 设计必要的新手引导 /36 5.2 使用十字线(准星)/36 5.3 避免界面深度引起的疲劳感 /37 5.4 使用恒定的速度 /37 5.5 保持用户在地面上 /38 5.6 保持头部的跟踪 /38 5.7 用光来引导用户的注意力 /39 5.8 借助比例 /39 5.9 使用空间音频 /40 5.10 充分使用反馈 /40 第 6 章 HTC VIVE 硬件 / 41 6.1 简介 /41 6.2 产品特点 /41 6.3 VIVE PRO / 43 6.4 HTC VIVE 硬件拆解结构 / 44 6.4.1 头显 /44 6.4.2 控制器 /45 6.5 HTC VIVE 控制器按键名称 / 46 6.6 HTC VIVE 定位原理/ 47 6.7 Inside-Out 与 Out-Inside 位置跟踪技术 / 47 6.7.1 Outside-In 跟踪技术 /48 6.7.2 Inside-Out 跟踪技术 / 48 6.8 HTC VIVE 的安装 / 49 第 7 章 VR 中的 UI ./51 7.1 概述 /51 7.2 将 UI 容器转换为世界空间坐标 / 52 7.3 VR 中的 UI 交互 /53 第 8 章 Unity VR 写实材质 . 55 8.1 Unity 材质基础 / 55 8.2 基于物理的渲染理论 /56 8.3 PBR 材质的优势 / 57 8.3.1 高品质写实级别材质表现 /58 8.3.2 为实时渲染而生 / 58 8.3.3 标准的材质制作流程 /59 8.4 PBR 材质主要贴图类型 /59 8.4.1 颜色贴图(Albedo/Basecolor Map)/59 8.4.2 金属贴图(Metallic Map) /60 8.4.3 光滑度贴图(Roughness Map) /60 8.5 PBR 材质制作软件 / 61 8.5.1 Substance Designer /61 8.5.2 Substance Painter /65 8.5.3 Quixel Suite /66 8.5.4 Marmoset Toolbag /66 8.6 制作 PBR 椅子材质 /67 8.6.1 在 Substance Painter 中制作贴图 /67 8.6.2 导出贴图到 Unity /74 8.7 Substance in Unity 的使用 / 76 第 9 章 SteamVR /81 9.1 SteamVR 简介 /81 9.1.1 SteamVR Runtime /81 9.1.2 SteamVR Plugin / 81 9.1.3 获取控制器引用及按键输入 /83 9.2 使用SteamVR Plugin实现与物体的交互 /84 9.3 InteractionSystem /89 9.3.1 InteractionSystem 核心模块 / 89 9.3.2 使用 InteractionSystem 实现传送 / 91 9.3.3 使用 InteractionSystem 实现与物体的交互 / 93 9.3.4 使用 InteractionSystem 实现与 UI 的交互 /95 9.4 需要注意的问题 . 96 第 10 章 使用 VRTK 进行交互开发 /99 10.1 VRTK 简介 /99 10.1.1 什么是 VRTK / 99 10.1.2 VRTK 能做什么 /99 10.1.3 为什么选择 VRTK /100 10.1.4 未来版本 103 10.2 SteamVR Plugin、InteractionSystem 与 VRTK 的关系 /103 10.3 配置 VRTK /103 10.3.1 一般配置过程 /104 10.3.2 快速配置 VRTK/108 10.4 VRTK 中的指针 / 109 10.4.1 指针 /109 10.4.2 指针渲染器 /113 10.5 在 VRTK 中实现传送 /115 10.5.1 VRTK 中的传送类型 /115 10.5.2 限定传送区域 /118 10.5.3 在 VR 场景中实现传送 /119 10.6 使用 VRTK 实现与物体的交互 /121 10.6.1 概述 / 121 10.6.2 配置方法 / 122 10.6.3 VRTK 的抓取机制 / 127 10.7 VRTK 中的控制器高亮和振动 /129 10.7.1 控制器高亮 /129 10.7.2 控制器振动 /131 10.8 VRTK 中与 UI 的交互 / 132 10.9 实例:开枪射击效果/ 134 10.10 实例:攀爬效果 / 140 10.11 实例:实现释放自动吸附功能 / 143 第 11 章 将基于 PC 平台的应用移植到 VR 平台 / 148 11.1 项目移植分析 /148 11.2 初始化 VR 交互 /149 11.3 Player 的移植 / 150 11.4 设置道具为可交互对象 / 152 11.5 实现控制器与道具的交互逻辑 /154 11.6 修改 UI 渲染模式为 World Space / 156 11.7 玩家伤害闪屏效果 /157 11.8 根据报错信息调整代码 /158 11.9 游戏结束及重新开始 / 159 第 12 章 Leap Motion for VR /162 12.1 概述 /162 12.2 硬件准备 /163 12.3 软件环境 /164 12.4 Leap Motion VR 初始开发环境 /164 12.5 替换 Leap Motion 在 VR 环境中的手部模型 /165 X Unity VR 虚拟现实完全自学教程 12.6 实现与 3D 物体的交互 / 167 12.7 实例:使用 Leap Motion 实现枪械的组装 /171 第 13 章 VIVE Tracker 的使用 / 175 13.1 外观结构 /175 13.2 使用场景 /176 13.3 初次使用 Tracker /177 13.4 使用 Tracker 作为控制器 / 178 13.5 使用 Tracker 与现实世界物体进行绑定 179 13.6 小结 /181 第 14 章 Unity VR 游戏案例——《水果忍者 VR》原型开发 /182 14.1 项目简介 /182 14.2 初始化项目 / 182 14.3 配置武士刀 / 183 14.4 编写水果生成逻辑 /185 14.5 实现切割水果的效果 /187 14.6 制作分数和游戏结束 UI /189 14.7 编写计分、计时和游戏结束等逻辑 / 190 第 15 章 Unity VR 案例—— Tilt Brush 原型开发 / 194 15.1 项目分析 /194 15.2 初始化项目并编写脚本 /195 15.3 实现修改笔刷颜色功能 /197 15.4 扩展内容:将绘制交互修改为 VRTK 版本 / 201 15.5 异常处理 /202 第16 章 Unity VR 性能优化工具和方法 / 204 16.1 Unity Profiler / 204 16.2 Memory Profiler / 205 16.3 Frame Debugger / 205 16.4 优化原则和措施 /206 16.4.1 LOD 技术 /206 16.4.2 较少 Draw Call 数量 / 207 16.4.3 使用单通道立体渲染 / 208 16.4.4 使用 The Lab Renderer / 209 16.4.5 小结 / 210 附录A XR 技术词汇解释/ 211 附录B Unity 编辑器基础小贴士/ 217