
本书由在虚拟现实领域具有丰富实战经验的技术专家编写,虽然在方兴未艾的虚拟现实领域,新产品、新技术日新月异、层出不穷,但是万变不离其宗。本书既包含了虚拟现实领域近百年的发展概况,又立足开发实战,对必要的理论知识进行了简单的介绍,特别是书中大篇幅的实战干货,为广大对虚拟现实有兴趣的开发人员提供了绝佳的学习资料。由于书中对开发工具Unity、设计建议、数学知识等内容都有相关介绍,所以只要有基础的开发人员,都可以通过阅读本书熟悉虚拟现实开发技术。本书不但对Cardboard、Oculus VR、HTC Vive 均有相应教程,还以Vive 开发为例深入介绍了各类型虚拟现实产品开发的实战案例,从观赏应用到虚拟现实单机游戏,再到联机游戏,涵盖了虚拟现实开发领域所需要的大部分开发技术。实战部分还在一定程度上深入各平台的SDK 内部,同时也为开发人员继续了解各平台SDK 提供了入门指南。
推荐序二 创造一个世界或许是人类最具有雄心,也最富创造力的精神追求。而人类用于创造世 界的方法也在不断进化,我们用瑰丽的文字来描述一个个栩栩如生的想象世界;我们用影 视来呈现看得见、听得见的感官世界;我们用游戏来创造可以与之交互,甚至由玩家来塑 造的自由世界;有了VR 之后,我们才第一次真正“进入”这个由我们自己创造的世界中, 以沉浸式的视角来感受这个世界。 奥秘游戏团队成员是一群喜欢“做梦”的人。我们用自己喜欢的元素去构建一个世界, 为这个世界填充上动人的故事,创造出有血有肉有感情的人物,并为之设计好玩的内容。 2015 年,当我们接触到成熟的VR 硬件时,激动的心情不言而喻,对于我们而言,VR 是 最接近“创造世界”这个梦想的实现方法的,更是未来游戏产业发展趋势的代表。因此, 我们毫不犹豫地转向VR 内容开发领域。 《画境》是我们开发的一款VR 冒险解谜游戏,通过三幅画中的场景讲述了一对父子 之间的温馨回忆。限于极短的开发周期,这款游戏也留下了诸多遗憾。目前我们还有一款 科幻背景的解谜游戏和一款多人联机RPG 游戏正在开发中。 在开发过程中我们踩了不少坑,在硬件选择、引擎使用、交互设计、内容类型等方面 都获得了不少经验教训,例如,如何设计才能在最大程度上减少体验者的晕动症,如何在 VR 环境中讲述一个故事,如何更高效地进行开发,等等。 VR 行业从早前的硬件驱动,转向目前的内容驱动,行业急需更丰富、更优质、更“爆 款”的内容来促进市场普及。这本书较为全面地介绍了VR 内容开发入门的理论知识,并 辅以翔实的案例说明,我们希望这些经验教训能帮助更多的内容开发者,尤其是刚刚进入 VR 领域的开发者,减少开发过程中“踩坑”,创造出更优秀的VR 内容。 陈振 奥秘游戏联合创始人 作者序 大概每个人都幻想过生活在虚拟世界中,在里面体验不曾体验的生活,经历现实世界 可能永远无法经历的事情。最近大火的美剧《西部世界》所描绘的游戏世界更像是虚拟现 实的升级版本。当然现在可能通过传统的PC 网络游戏或手机游戏可以得到一部分类似的 体验,但它的体验相比虚拟现实的体验差远了。 2016 年虚拟现实真正做到了消费级别,让每个人都可以真正在虚拟世界中有神奇的 经历,前两天有两个做手游很成功的朋友来我们公司考察,他们之前没有体验过全沉浸的 虚拟现实产品,当他们在游戏中体验了打僵尸、斗机器人后,惊叹之情溢于言表。他们完 全没想到虚拟现实可以做到这种程度。虽然只是简单的两块屏幕加上精确定位技术和更自 然的交互手柄,但营造出的沉浸感完全无法用语言准确表达,只有真正体验过,才知道身 临其境的体验是什么样的。 我们进入虚拟现实领域非常偶然。之前我们在金融行业积累了技术经验,加入奥秘团 队后才开始接触AR/VR。当我们公司发现虚拟现实设备可以营造如此逼真的体验时,大 家义无反顾地投身于其中,因为我们知道,这是划时代的产品,等同于过去的从电影到电 视,电视到电脑,电脑到手机,现在是手机到虚拟现实,由于是信息输出方式和输入方式 的极大变化,这个变化足以为人们带来更多的机会。 2016 年初参加HTC Vive 的技术大会,开始对Vive 有了更深入的了解,并在极短的 时间内创造出《画境》这款游戏,现在看来它虽然非常粗糙,但在当时的时间限制下做出 这样的作品,我们还是非常自豪的。后来又接着进行其它虚拟现实游戏设计开发,开始更 深入地理解虚拟现实的一些设计要点和技术原理。这本书就是我们团队经验的总结,阅读 本书足以让一个普通开发者完成从对虚拟现实一无所知到可以开发出不错的虚拟现实体 验程序的飞跃。 本书第一部分参考了国内外一些技术资料,对虚拟现实的产品和技术发展进行了简短 的回顾,并对近几年圈内的大事进行了介绍,特别是对现在各个方向产品都有一个简单介 绍,文字虽然不多,但是足以开阔眼界。第二部分主要介绍了虚拟现实的核心技术点和产 品设计上需要注意的事项,让大家掌握了理论基础,至少不会做出“反人类”的体验—— 让人晕到想吐出胆汁。这部分虽然篇幅不多,但是极其重要。第三部分介绍了必要的Unity 基础知识和数学知识,我们尽量让这些非常重要的内容看起来不枯燥,它们影响在实战中 对一些实现细节的理解,务必搞懂。实战部分主要以Vive 为例将各种类型的虚拟现实应 用的开发过程进行了讲解,从目前盈利能力最强的观光类体验(可用在房地产等行业)到 难度最大的多人联机游戏,从体验最好的Vive 到入门级的Cardboard 设备开发,也包括 了国内少有的Oculus 产品的开发讲解。此外,我们还专门拿出一章对虚拟现实中的绿幕 技术进行讲解。 书中力求以简单的示例,让读者更快入门,同时对所用到的SDK 都进行了一定程度 的源码分析,既不会太深入让人一头雾水,也不会太简单让人感到索然无味,目的是想让 大家在需要时能有熟悉的途径去深入底层。 本书适合有一定开发基础的读者阅读,不论你所处什么行业,经过学习一定可以成为 一个不错的虚拟现实开发者。在阅读本书时,理论知识部分建议开发者仔细阅读,在具备 了Unity 和数学基础后,Cardboard、Oculus DK2、Vive 开发的阅读顺序可以根据需要来 决定,但是我们仍然建议将Vive 的所有例子完整阅读。 感谢HTC Vive 中国区总裁汪丛青先生对本书给予的极大支持,同时感谢HTC Vive 中国 区的马芳。 本书的付梓要特别感谢电子工业出版社的刘皎,在遇到各种问题时她对我们进行了及 时指导,同时要感谢汪达文编辑的辛苦工作,以及出版社其他朋友的帮忙。 感谢家人对此书编写的支持,为了成书我们牺牲了很多陪伴家人的时间。谨以此书献 给我们亲爱的家人。 由于准备仓促和能力有限,书中难免有遗漏和错误,欢迎广大读者批评指正。
1 虚拟现实的前世今生 1 1.1 初探 ......................................................................................................... 1 1.2 缓慢发展 ................................................................................................. 2 1.3 虚拟现实又火爆了 ................................................................................. 6 1.3.1 主机VR 的“三国演义” ............................................................................ 6 1.3.2 群雄逐鹿 ....................................................................................................... 7 1.4 虚拟现实可以干什么 ............................................................................. 8 1.4.1 培训教育 ....................................................................................................... 8 1.4.2 运动 ............................................................................................................... 8 1.4.3 游戏 ............................................................................................................... 9 1.4.4 电影 ............................................................................................................... 9 1.4.5 心理治疗 ..................................................................................................... 10 1.4.6 广告 ............................................................................................................. 10 1.4.7 虚拟现实直播 ............................................................................................. 10 1.5 虚拟现实产品介绍 ............................................................................... 11 1.5.1 主体硬件 ..................................................................................................... 11 1.5.2 各种配件 ..................................................................................................... 12 1.6 小结 ....................................................................................................... 15 2 虚拟现实设计初探 16 2.1 虚拟现实技术难点 ............................................................................... 16 2.1.1 晕动症 ......................................................................................................... 16 2.1.2 视疲劳 ......................................................................................................... 18 2.1.3 成像延时 ..................................................................................................... 18 2.1.4 畸变成像 ..................................................................................................... 19 2.2 虚拟现实应用设计时要考虑的因素 ................................................... 20 2.2.1 刷新率和帧数的影响 ................................................................................. 20 2.2.2 分辨率影响 ................................................................................................. 20 2.2.3 场景复杂度影响 ......................................................................................... 21 2.2.4 摄像机控制 ................................................................................................. 23 2.2.5 自我认知冲突 ............................................................................................. 24 2.2.6 更自然的交互 ............................................................................................. 24 2.2.7 音乐、音效的使用 ..................................................................................... 26 2.2.8 多人联机 ..................................................................................................... 27 2.3 小结 ....................................................................................................... 27 3 认识HTC Vive 28 3.1 HTC Vive .............................................................................................. 28 3.2 运行环境 ............................................................................................... 28 3.2.1 硬件环境 ..................................................................................................... 28 3.2.2 软件环境 ..................................................................................................... 29 3.3 简述Lighting House 原理 .................................................................... 30 3.4 将Vive 连接到电脑 ............................................................................. 30 3.5 房间设定 ............................................................................................... 33 3.6 小结 ....................................................................................................... 37 4 Unity 简介 38 4.1 Unity 入门 ............................................................................................. 38 4.1.1 Unity 简介 ................................................................................................... 38 4.1.2 下载及安装 ................................................................................................. 38 4.1.3 Unity 5 授权 ................................................................................................ 41 4.1.4 Unity 的语言及跨平台原理 ....................................................................... 42 4.2 Unity 编辑器使用简介 ......................................................................... 43 4.2.1 编辑器界面 ................................................................................................. 43 4.2.2 工具栏 ......................................................................................................... 44 4.2.3 Asset Store ................................................................................................... 45 4.2.4 菜单栏 ......................................................................................................... 47 4.2.5 常用工作视图 ............................................................................................. 50 4.3 Unity 脚本以及脚本事件调用 ............................................................. 54 4.4 Unity 物体系统简介 ............................................................................. 55 4.5 创建并发布一个简单的游戏 ............................................................... 56 4.6 Unity 中的全局光照 ............................................................................. 61 4.6.1 全局光照与局部光照 ................................................................................. 61 4.6.2 全局光照的实现问题 ................................................................................. 61 4.6.3 预计算的GI ................................................................................................ 62 4.6.4 烘焙GI ........................................................................................................ 62 4.6.5 预计算的GI 与烘焙GI 的关系 ................................................................. 62 4.6.6 Unity 的几种光源 ....................................................................................... 62 4.6.7 GI 实战 ........................................................................................................ 63 4.7 Unity 地形编辑器 ................................................................................. 67 4.8 Unity 中的粒子系统 ............................................................................. 70 4.9 小结 ....................................................................................................... 73 5 三维空间的数学基础 74 5.1 学习的目的 ........................................................................................... 74 5.2 空间数学的基本概念 ........................................................................... 74 5.2.1 点、矢量与标量 ......................................................................................... 75 5.2.2 笛卡尔坐标系 ............................................................................................. 75 5.3 构建测试项目 ....................................................................................... 76 5.4 矢量运算 ............................................................................................... 81 5.4.1 矢量和标量的乘法、除法 ......................................................................... 81 5.4.2 矢量的加法与减法 ..................................................................................... 84 5.4.3 矢量的模 ..................................................................................................... 86 5.4.4 矢量的归一化 ............................................................................................. 87 5.4.5 矢量的投影 ................................................................................................. 89 5.4.6 矢量的点积 ................................................................................................. 91 5.4.7 矢量的叉积 ................................................................................................. 93 5.5 小结 ....................................................................................................... 96 6 Vive 开发环境搭建及插件介绍 97 6.1 获取SteamVR 插件 ............................................................................. 97 6.2 将SteamVR 插件导入Unity ............................................................... 97 6.3 SteamVR 包简介 .................................................................................. 99 6.4 实现一个最基本的VR 场景 ............................................................. 101 6.4.1 工程场景搭建 ........................................................................................... 102 6.4.2 添加VR 组件 ............................................................................................ 104 6.4.3 常用SteamVR 组件详解 .......................................................................... 105 6.4.4 通过事件监听实现拿、放、扔 ................................................................ 117 6.4.5 通过继承实现发射器效果 ....................................................................... 121 6.5 小结 ..................................................................................................... 123 7 Vive 开发:解密类游戏 124 7.1 游戏开发流程 ..................................................................................... 124 7.2 游戏策划 ............................................................................................. 125 7.3 游戏场景 ............................................................................................. 126 7.4 解密逻辑:激光发射 ......................................................................... 127 7.5 接收激光 ............................................................................................. 130 7.5.1 最基础的接收脚本 ................................................................................... 130 7.5.2 接收并发射激光 ....................................................................................... 132 7.5.3 接收激光后开门 ....................................................................................... 132 7.5.4 接收激光后关卡胜利 ............................................................................... 133 7.6 制作接收和发射激光的预制体 ......................................................... 134 7.7 操作狮子旋转 ..................................................................................... 137 7.8 完成剩余场景布置 ............................................................................. 139 7.9 效果演示 ............................................................................................. 142 7.10 小结 ................................................................................................... 144 8 Vive 开发:第一人称射击类游戏 145 8.1 策划 ..................................................................................................... 145 8.2 游戏场景 ............................................................................................. 145 8.3 创建怪物 ............................................................................................. 146 8.4 Unity 中的自动寻路 ........................................................................... 149 8.4.1 Navigation ................................................................................................. 149 8.4.2 Nav Mesh Agent 组件 ............................................................................... 150 8.5 添加怪物自动寻路 ............................................................................. 151 8.6 添加怪物动画控制器 ......................................................................... 154 8.7 怪物行为控制 ..................................................................................... 157 8.8 游戏管理类 ......................................................................................... 160 8.9 怪物攻击 ............................................................................................. 162 8.10 玩家攻击 ........................................................................................... 164 8.10.1 添加手柄手枪模型 ................................................................................. 164 8.10.2 添加手枪开枪动画 ................................................................................. 165 8.10.3 实现开枪逻辑 ......................................................................................... 167 8.10.4 添加开枪脚本 ......................................................................................... 170 8.10.5 设置怪物的层级(Layer) .................................................................... 170 8.11 游戏重玩逻辑 ................................................................................... 171 8.12 添加背景音乐与音量调整 ............................................................... 174 8.13 小结 ................................................................................................... 175 9 Vive 开发:旅游观光应用 176 9.1 策划 ..................................................................................................... 176 9.2 游戏场景 ............................................................................................. 176 9.3 虚拟空间内移动传送 ......................................................................... 177 9.3.1 为什么要传送和传送的实现方式 ............................................................ 177 9.3.2 传送的实现原理 ....................................................................................... 177 9.3.3 实现位置点选取 ....................................................................................... 179 9.3.4 实现游客传送 ........................................................................................... 181 9.4 多场景编辑 ......................................................................................... 183 9.4.1 为何选择多场景编辑 ............................................................................... 184 9.4.2 多场景的优势 ........................................................................................... 184 9.4.3 多场景的注意事项 ................................................................................... 184 9.4.4 实现多场景加载 ....................................................................................... 186 9.4.5 场景管理类 ............................................................................................... 191 9.5 实现不同时间段效果 ......................................................................... 193 9.5.1 如何实现不同时间段效果 ....................................................................... 193 9.5.2 实现不同时间段的切换效果 .................................................................... 193 9.6 创建可传送面与不可传送面 ............................................................. 196 9.6.1 如何区分可传送面与不可传送面 ............................................................ 196 9.6.2 实现可传送面与不可传送面的区分 ........................................................ 196 9.7 修改传送点选取方式 ......................................................................... 198 9.7.1 修改原因 ................................................................................................... 198 9.7.2 实现原理 ................................................................................................... 198 9.7.3 实现抛物线效果 ....................................................................................... 200 9.8 小结 ..................................................................................................... 206 10 Vive 开发:将一款单机游戏改为联机游戏 207 10.1 策划 ................................................................................................... 207 10.2 场景 ................................................................................................... 207 10.3 联机实现方法 ................................................................................... 208 10.4 UNET ................................................................................................ 208 10.5 HLAPI 实现方法 .............................................................................. 208 10.5.1 主机、本地客户端与远程客户端 .......................................................... 209 10.5.2 本地用户(LocalPlayer) ...................................................................... 209 10.5.3 权限(Authority)控制 .......................................................................... 210 10.5.4 主机与客户机之间的RPC 通信方式 .................................................... 211 10.5.5 主机与客户机之间的数据同步 .............................................................. 212 10.5.6 产生联机物体 ......................................................................................... 212 10.6 使用UNET-HLAPI 来将单机游戏改为联机游戏 .......................... 212 10.6.1 添加网络管理组件 ................................................................................. 213 10.6.2 制作玩家预制体 ..................................................................................... 214 10.6.3 重写游戏管理类 ..................................................................................... 220 10.6.4 为怪物添加网络通信组件...................................................................... 226 10.6.5 设置玩家出生点 ..................................................................................... 229 10.6.6 运行并查看结果 ..................................................................................... 230 10.7 小结 ................................................................................................... 231 11 Cardboard 开发入门 232 11.1 背景知识 ........................................................................................... 232 11.2 Cardboard 简介 ................................................................................. 233 11.3 开发环境准备 ................................................................................... 236 11.3.1 工具安装 ................................................................................................. 236 11.3.2 SDK 简单分析 ........................................................................................ 237 11.4 策划 ................................................................................................... 242 11.4.1 游戏介绍 ................................................................................................. 242 11.4.2 主角 ......................................................................................................... 243 11.4.3 敌人 ......................................................................................................... 243 11.5 场景 ................................................................................................... 243 11.5.1 搭建 ......................................................................................................... 243 11.5.2 天空盒 ..................................................................................................... 244 11.5.3 主角形象 ................................................................................................. 244 11.5.4 敌人 ......................................................................................................... 245 11.5.5 炮弹和爆炸效果 ..................................................................................... 251 11.6 交互 ................................................................................................... 254 11.6.1 盯 ............................................................................................................. 255 11.6.2 单击 ......................................................................................................... 255 11.7 小结 ................................................................................................... 255 12 Oculus 开发入门 256 12.1 产品简介与安装 ............................................................................... 256 12.2 开发环境搭建 ................................................................................... 258 12.3 快速开发体验 ................................................................................... 263 12.4 SDK 细节概述 .................................................................................. 265 12.5 Demo 实战 ........................................................................................ 270 12.5.1 策划 ......................................................................................................... 270 12.5.2 场景 ......................................................................................................... 270 12.5.3 玩家 ......................................................................................................... 271 12.5.4 视角切换 ................................................................................................. 272 12.6 小结 ................................................................................................... 273 13 MR 视频拍摄 274 13.1 电影绿幕 ........................................................................................... 274 13.2 MR 视频............................................................................................ 275 13.3 MR 视频原理 .................................................................................... 276 13.4 SteamVR 中的实现 .......................................................................... 277 13.5 拍摄 ................................................................................................... 282 13.5.1 环境准备 ................................................................................................. 282 13.5.2 如何拍摄 ................................................................................................. 283 13.6 小结 ................................................................................................... 287
冀盼:毕业于哈尔滨工业大学,前工行软件开发中心IEPA应用负责人,多年应用架构设计经验,负责工行门户网站、手机银行、个人网银等产品设计开发,现任奥秘游戏CTO,负责奥秘IT产品规划、技术研究、团队管理,其团队研发的探索解谜游戏《画境》,是HTC Vive首届VR内容开发大赛获奖作品。__eol____eol__谢懿德:毕业于天津大学,知名虚拟现实公司奥秘游戏的资深架构师,在学生时代就热爱图形图像的研究与网络架构设计,毕业后一直从事网络应用相关的开发工作,曾是工行融e联客户端核心技术人员。对于VR有着丰富的实战经验和技术积累,是HTC Vive第一届内容大赛获奖作品《画境》的核心设计开发人员。__eol__