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