第一篇 起步篇 3
第1章 J2ME概论 3
1.1 J2ME的基本概念 3
1.1.1 Java平台技术和应用现状 3
1.1.2 J2ME简介 4
1.1.3 J2ME的体系结构 4
1.1.4 J2ME配置 5
1.1.5 J2ME虚拟机 5
1.1.6 J2ME简表 6
1.2 CLDC简介 6
1.2.1 特征设备 6
1.2.2 CLDC的预审核机制 7
1.2.3 CLDC的安全机制 8
1.2.4 CLDC的网络支持 9
1.2.5 CLDC 1.1的新特性 9
1.3 MIDP应用程序开发 10
1.3.1 MIDP设备需求 10
1.3.2 MIDlet Suite简介 10
1.3.3 MIDP类库 11
1.3.4 MIDlet生存周期 12
1.3.5 MIDlet程序结构 12
1.3.6 MIDP 2.0的新特征 14
1.4 J2ME 3D概述 15
1.4.1 J2ME 3D游戏概述 15
1.4.2 M3G包描述 15
1.4.3 两种开发模式 19
1.4.4 手机3D图像开发技术 20
1.4.5 3D绘制性能和游戏引擎 21
1.5 3D手机游戏的分类和设计概要 22
1.6 本章小结 25
第2章 开发环境的选择和配置 26
2.1 WTK 2.5的安装和配置 26
2.1.1 WTK 2.5简介 26
2.1.2 WTK 2.5的安装 27
2.1.3 MIDlet开发流程 29
2.1.4 WTK 2.5中的3D应用开发 30
2.1.5 设置工程属性 33
2.1.6 MIDlet的打包 36
2.1.7 MIDlet的混淆 36
2.1.8 运行JAR文件 37
2.2 手机厂商SDK 38
2.2.1 诺基亚Carbide.j 1.5的安装和使用 39
2.2.2 索尼爱立信J2ME SDK 2.2.4的安装和使用 42
2.2.3 摩托罗拉SDK 6.3的安装和使用 43
2.3 Jbuilder 2006移动开发环境 44
2.3.1 添加WTK 2.5 45
2.3.2 创建工程 46
2.3.3 添加源文件 48
2.3.4 打包与混淆 50
2.3.5 添加厂家模拟器 53
2.4 Eclipse 3.2.1移动开发环境 56
2.4.1 Eclipse简介 57
2.4.2 安装Eclipse和J2ME插件 57
2.4.3 添加WTK 2.5 61
2.4.4 创建工程 63
2.4.5 运行模拟器 65
2.4.6 打包与混淆 66
2.4.7 添加厂家模拟器 67
2.5 NetBeans 5.5移动开发环境 68
2.5.1 安装NetBeans和移动开发包 68
2.5.2 配置SDK 69
2.5.3 创建项目 71
2.5.4 添加代码并运行 73
2.5.5 导入已有程序 75
2.5.6 项目设置 76
2.6 本章小结 77
第3章 游戏开发相关技术 78
3.1 游戏用户界面(Canvas) 78
3.1.1 屏幕属性 78
3.1.2 屏幕绘制 80
3.1.3 绘制基本操作 81
3.1.4 绘制直线 82
3.1.5 绘制弧形 82
3.1.6 绘制圆角矩形 83
3.1.7 绘制三角形 83
3.1.8 绘制笔触的设置 84
3.1.9 双缓冲技术 84
3.2 游戏的屏幕:GameCanvas类 85
3.2.1 GameCanvas概述 86
3.2.2 绘制双缓冲区 86
3.2.3 实现游戏主循环 87
3.2.4 获取键盘状态 88
3.3 绘制图像 90
3.3.1 生成图像数据 90
3.3.2 图像的锚点 93
3.3.3 图像的截取 94
3.3.4 图像的透明 95
3.3.5 用Photoshop制作PNG透明背景 97
3.3.6 用Fireworks制作PNG透明背景 98
3.4 字体设置 99
3.4.1 外观属性 99
3.4.2 字号属性 99
3.4.3 字形属性 100
3.4.4 默认属性 100
3.4.5 设置字体 100
3.5 线程(Thread)与定时器(Timer) 102
3.5.1 多线程概述 102
3.5.2 线程的创建 102
3.5.3 线程的休眠和终止 103
3.5.4 线程的优先级 104
3.5.5 游戏线程 104
3.5.6 定时器任务 105
3.5.7 任务的执行和取消 105
3.6 事件处理机制 106
3.6.1 Command事件 107
3.6.2 键盘事件 109
3.6.3 游戏动作 111
3.6.4 触摸屏事件 112
3.7 记录存储系统(RMS) 113
3.7.1 记录存储的概念 113
3.7.2 记录存储的创建 115
3.7.3 记录存储的关闭和删除 116
3.7.4 列举记录存储的名称 116
3.7.5 记录存储的占用空间 117
3.7.6 添加记录 117
3.7.7 记录的删除 117
3.7.8 记录的修改 117
3.7.9 记录的获取 118
3.7.10 记录存储的监听 118
3.7.11 枚举器 119
3.7.12 过滤器 120
3.7.13 比较器 121
3.7.14 记录存储的游戏应用 121
3.8 媒体的播放(MMAPI) 122
3.8.1 MMAPI简介 123
3.8.2 获取终端支持媒体格式 123
3.8.3 Player的创建 124
3.8.4 Player的状态 126
3.8.5 播放单音和声音序列 127
3.8.6 设置音量和播放方式 128
3.8.7 游戏中的声音播放 129
3.8.8 媒体监听接口 129
3.9 本章小结 130
第二篇 基础篇 133
第4章 用点、线、面构造静态多面体 133
4.1 基本框架 133
4.2 构造多面体的顶点缓冲 134
4.2.1 顶点数组(VertexArray) 134
4.2.2 位置数组(PositionArray) 135
4.2.3 法向量数组(NormalArray) 136
4.2.4 颜色数组(ColorArray) 139
4.2.5 纹理数组(TextureArray) 140
4.2.6 顶点缓冲(VertexBuffer) 142
4.3 构造多面体的索引缓冲 145
4.3.1 索引缓冲的使用原理 145
4.3.2 三角带建模原则 145
4.3.3 三角带索引(TriangleStripArray) 146
4.4 多面体的外观属性 148
4.5 颜色融合属性(CompositingMode) 150
4.5.1 构造函数 151
4.5.2 融合模式 151
4.5.3 Alpha门限 153
4.5.4 颜色缓存 153
4.5.5 深度缓存 153
4.5.6 深度检测 155
4.5.7 深度偏移 155
4.6 多边形属性(PolygonMode) 156
4.6.1 构造函数 157
4.6.2 双面拣选模式(Culling) 158
4.6.3 缠绕方式(Winding) 158
4.6.4 着色模式(Shading) 159
4.6.5 透视修正(PerspectiveCorrection) 160
4.6.6 双面光照(TwoSidedLighting) 161
4.6.7 摄影机灯光(LocalCameraLighting) 161
4.7 纹理映射(Texturing) 161
4.7.1 2D图像(Image2D) 162
4.7.2 Texture2D简介 163
4.7.3 创建纹理 165
4.7.4 纹理的重复和钳位 165
4.7.5 纹理滤镜 166
4.7.6 纹理模式 168
4.7.7 纹理的旋转、缩放和平移 170
4.8 材质属性(Material) 171
4.8.1 光的反射原理 172
4.8.2 材质的类型 173
4.8.3 材质的颜色 174
4.8.4 镜面反射的高光属性 175
4.8.5 顶点颜色跟踪 175
4.9 雾化属性(Fog) 176
4.9.1 构造函数 178
4.9.2 雾化类型 178
4.9.3 雾化方程 178
4.9.4 雾化颜色 179
4.9.5 雾化实例 179
4.10 网格多面体(Mesh) 180
4.10.1 类方法介绍 180
4.10.2 构造函数 181
4.10.3 查询子面和外观属性 181
4.11 实例:构造四棱锥模型 182
4.11.1 四棱锥的顶点定义 182
4.11.2 顶点缓冲的构造 182
4.11.3 外观属性的构造 185
4.11.4 添加场景元素 186
4.11.5 代码框架 186
4.11.6 程序运行结果 188
4.12 实例:带纹理的宝剑 188
4.12.1 顶点缓冲的构造 188
4.12.2 外观属性的构造 190
4.12.3 场景元素的构造 191
4.12.4 游戏线程 192
4.12.5 改变方位 192
4.13 本章小结 194
第5章 光源和摄影机 195
5.1 光源 195
5.1.1 光源类(Light) 195
5.1.2 数量、颜色和方位 197
5.1.3 强度和衰减 198
5.1.4 环境光(Ambient) 199
5.1.5 平行光(Directional) 200
5.1.6 点光源(Omni) 201
5.1.7 聚光源(Spot) 201
5.2 摄影机理论 202
5.2.1 从3D到2D的变换 203
5.2.2 摄影机空间 203
5.2.3 裁剪空间 204
5.2.4 线性插值 205
5.2.5 透视投影 205
5.2.6 正交投影 209
5.3 摄影机使用 210
5.3.1 摄影机类(Camera) 210
5.3.2 透视投影的实现 211
5.3.3 正交投影的实现 211
5.3.4 编程建议 213
5.4 目标摄影机的实现 213
5.4.1 目标摄影机原理 213
5.4.2 投影矩阵的运算 214
5.4.3 目标摄影机的应用 216
5.5 自由摄影机的实现 218
5.5.1 构造方法 218
5.5.2 键盘事件 219
5.5.3 更新摄影机方位 220
5.5.4 平移摄影机 221
5.5.5 旋转摄影机 221
5.5.6 屏幕显示 224
5.5.7 访问组和摄影机 225
5.5.8 自由摄影机的运用 225
5.6 本章小结 226
第6章 矩阵和线性变换 228
6.1 矩阵的定义和运算 228
6.1.1 矩阵变换类(Transform) 228
6.1.2 点和向量 230
6.1.3 4D齐次坐标 231
6.1.4 单位矩阵 232
6.1.5 转置矩阵 233
6.1.6 行列式 234
6.1.7 逆矩阵 236
6.1.8 矩阵与矩阵的乘法 238
6.1.9 矩阵与向量的乘法 239
6.2 矩阵的变换操作 240
6.2.1 平移(Translate) 241
6.2.2 2D中的旋转 242
6.2.3 3D中绕坐标轴的旋转 243
6.2.4 3D中绕任意轴的旋转 244
6.2.5 3D中绕任意点的旋转 246
6.2.6 四元数表示的旋转(RotateQuat) 246
6.2.7 缩放(Scale) 248
6.2.8 镜像(Reflection) 249
6.2.9 2D中的切变 250
6.2.10 3D中的切变 251
6.2.11 逆变换 253
6.2.12 矩阵和顶点数组的乘法 253
6.3 3D对象的变换 254
6.3.1 可变换对象类(Transformable) 254
6.3.2 平移变换 255
6.3.3 旋转变换 257
6.3.4 缩放变换 258
6.3.5 变换的组合 259
6.3.6 世界坐标系 260
6.3.7 物体坐标系 260
6.3.8 不同坐标系里的变换 261
6.4 本章小结 264
第7章 3D场景的渲染 265
7.1 场景树的构建 265
7.1.1 抽象3D物体Object3D 265
7.1.2 节点(Node) 268
7.1.3 节点组(Group) 270
7.1.4 世界节点(World) 271
7.1.5 实例:立方体组的管理 273
7.2 对齐技术的使用 276
7.2.1 公告牌(Billboard)技术 276
7.2.2 场景中树木的实现 277
7.2.3 Align实现的目标摄影机(TargetCamera) 285
7.2.4 Align实现的目标聚光灯(TargetLight) 286
7.3 拾取技术的使用 286
7.3.1 拾取概述 286
7.3.2 拾取光束(RayIntersection) 287
7.3.3 Camera视线拾取 289
7.3.4 实例:拾取立方体 289
7.3.5 碰撞检测 292
7.4 场景绘制(Graphics3D) 292
7.4.1 Graphics3D类的使用 292
7.4.2 图形优化建议 294
7.4.3 绘制和管理场景元素 296
7.4.4 设备的3D属性 296
7.4.5 背景(Background) 298
7.4.6 实例:滚动背景 300
7.4.7 3D精灵类(Sprite3D) 303
7.4.8 移动的精灵对象 305
7.5 本章小结 307
第8章 保留模式构造3D场景 308
8.1 加载M3G文件 308
8.1.1 Loader类加载数据 308
8.1.2 分离模型 310
8.1.3 M3G文件导出建议 311
8.1.4 实例:遍历场景 312
8.2 解析场景树 315
8.2.1 加载M3G文件 315
8.2.2 解析场景 316
8.2.3 解析节点 316
8.2.4 解析组节点的变换矩阵 317
8.2.5 解析顶点缓冲 317
8.2.6 解析材质属性 318
8.2.7 判断根节点 319
8.3 3ds max 9.0构建场景 321
8.3.1 创建茶壶模型 321
8.3.2 摄影机和灯光 322
8.3.3 材质与纹理 325
8.3.4 场景背景 328
8.3.5 导出场景 328
8.3.6 运行程序 331
8.3.7 调整坐标系 332
8.4 Maya7.0构建场景 333
8.4.1 菜单 333
8.4.2 视图 334
8.4.3 隐藏界面元素 335
8.4.4 视图操作 335
8.4.5 平移、旋转和缩放 336
8.4.6 创建模型 336
8.4.7 材质与纹理 338
8.4.8 灯光与摄影机 341
8.4.9 导出场景 342
8.5 Blender 2.4构建场景 345
8.5.1 Blender用户界面简介 345
8.5.2 打开和保存文件 346
8.5.3 选择模型 347
8.5.4 平移、旋转和缩放 347
8.5.5 拆分窗口 348
8.5.6 切换视图 349
8.5.7 工具盒 349
8.5.8 快捷按钮 350
8.5.9 用户参数设置 350
8.5.10 创建模型 351
8.5.11 灯光与摄影机 352
8.5.12 材质与纹理 353
8.5.13 场景背景 355
8.5.14 导出场景 355
8.6 浏览M3G文件 356
8.6.1 JSR-184 Player浏览场景 356
8.6.2 M3GToolkit 0.5.0浏览场景树 357
8.6.3 M3GToolkit 4.0浏览场景 358
8.6.4 显示模式 359
8.6.5 摄影机 360
8.6.6 场景树 361
8.6.7 播放动画 361
8.6.8 自定义灯光 362
8.7 本章小结 362
第9章 3D动画制作 363
9.1 动画概述 363
9.1.1 关键帧动画 363
9.1.2 骨骼蒙皮动画 364
9.1.3 变形物体动画 364
9.1.4 3D动画实现机制及原理 364
9.2 关键帧序列(KeyframeSequence) 365
9.2.1 插值算法 366
9.2.2 线性插值(LINEAR) 366
9.2.3 四元数插值(SLERP) 367
9.2.4 单步插值 368
9.2.5 设置关键帧 368
9.2.6 帧重复模式 368
9.2.7 设置有效帧 369
9.2.8 设置持续时间 369
9.3 动画轨迹(AnimationTrack) 370
9.3.1 动画特性 370
9.3.2 动画轨迹的构造 371
9.3.3 绑定动画控制器 372
9.4 动画控制器(AnimationController) 372
9.4.1 活动间隔和权重 373
9.4.2 序列时间和世界时间 374
9.4.3 动画播放 375
9.4.4 实例:滚动的立方体 376
9.4.5 实例:游动的轮船 380
9.4.6 保留模式下的动画播放 385
9.5 变形多面体动画 387
9.5.1 顶点变形多面体(MorphingMesh) 387
9.5.2 实例:变形的三角柱 390
9.5.3 实例:活动的手指 392
9.5.4 实例:关键帧动画控制权重 398
9.5.5 骨骼变形多面体(SkinnedMesh) 405
9.5.6 实例:活动的关节 406
9.5.7 实例:关键帧动画控制骨骼旋转角度 410
9.6 本章小结 416
第三篇 实战篇 419
第10章 3D开发相关技术 419
10.1 基本地形渲染技术 419
10.1.1 HeightMap简介 419
10.1.2 海岛地图的原理 421
10.1.3 地图元素图元 422
10.1.4 读取元素数据 422
10.1.5 构造四边形图元 423
10.1.6 根据地图构造四边形组 425
10.1.7 构造游戏场景 426
10.1.8 绘制场景 427
10.1.9 键盘输入 427
10.1.10 地图纹理的应用 429
10.1.11 摄影机游历场景图 430
10.2 粒子系统技术 431
10.2.1 粒子系统简介 432
10.2.2 粒子系统应用 432
10.2.3 粒子系统属性 432
10.2.4 粒子系统模型 433
10.2.5 焰火粒子系统 433
10.2.6 爆炸粒子系统 440
10.3 碰撞检测技术 443
10.3.1 碰撞检测技术简介 443
10.3.2 球体碰撞检测 444
10.3.3 AABB立方体边界框检测 446
10.3.4 OBB树碰撞检测 455
10.3.5 碰撞反应 457
10.4 本章小结 457
第11章 3D迷宫游戏设计与实现 458
11.1 迷宫游戏的策划和准备工作 458
11.1.1 3D游戏开发概述 458
11.1.2 游戏的策划 459
11.1.3 游戏的准备工作 460
11.2 迷宫游戏的架构 460
11.2.1 游戏线程 460
11.2.2 游戏的类结构 461
11.2.3 游戏的场景架构 462
11.2.4 游戏的流程 462
11.2.5 深度优先算法生成迷宫 464
11.3 迷宫游戏的实现 467
11.3.1 主类Maze3DMIDlet类 467
11.3.2 菜单列表MenuList类的实现 469
11.3.3 平面Plane类的实现 471
11.3.4 迷宫地图Maze类的实现 473
11.3.5 设备属性Graphics3Dproperties类的实现 481
11.3.6 错误处理ErrorScreen类的实现 481
11.4 游戏画布MazeCanvas类的实现 482
11.4.1 变量和构造函数 482
11.4.2 创建开始标志 483
11.4.3 创建结束标志 485
11.4.4 创建定位标志 486
11.4.5 创建迷宫的墙壁 487
11.4.6 创建地板 488
11.4.7 初始化游戏场景 489
11.4.8 游戏的视角切换 490
11.4.9 半透明的墙壁 491
11.4.10 游戏线程 492
11.4.11 绘制3D场景 494
11.4.12 绘制2D图像 495
11.4.13 玩家的移动 495
11.4.14 判断玩家能否移动 498
11.4.15 显示菜单 499
11.5 迷宫游戏的改善 499
11.6 本章小结 500
第12章 第一人称射击游戏(FPS)的设计与实现 501
12.1 第一人称射击游戏的策划和准备工作 501
12.1.1 第一人称射击游戏概述 501
12.1.2 第一人称射击游戏的人工智能 502
12.1.3 游戏的策划 503
12.1.4 游戏的资源 504
12.2 游戏画布的实现 504
12.2.1 创建场景 504
12.2.2 键盘事件处理 506
12.2.3 刷新绘制 507
12.3 玩家视角的实现 509
12.3.1 带纹理的平面类 509
12.3.2 移动摄影机的实现 511
12.3.3 键盘事件处理 512
12.3.4 位置的更新 513
12.3.5 获取摄影机的当前方位 514
12.4 加载敌人人物角色 515
12.4.1 匪徒信息 515
12.4.2 匪徒1的加载 516
12.4.3 匪徒2的加载 517
12.5 爆炸和射击 519
12.5.1 爆炸动画的实现 519
12.5.2 射击状态的控制 522
12.5.3 爆炸声音的播放 526
12.6 本章小结 528
第四篇 Mascot Capsule篇 533
第13章 Mascot Capsule技术入门 533
13.1 创建和绘制3D模型 533
13.1.1 Mascot Capsule概述 533
13.1.2 绘制立方体实例 535
13.1.3 绘制指令和指令列表 538
13.1.4 图元类型与顶点坐标 539
13.1.5 法向量坐标 539
13.1.6 纹理坐标 540
13.1.7 颜色数据 541
13.1.8 绘制层与摄影机 548
13.1.9 纹理的使用和纹理动画 550
13.1.10 颜色融合方式 556
13.1.11 环境光与平行光 559
13.2 3D变换和运算函数 560
13.2.1 Vector3D类实现的3D向量 560
13.2.2 AffineTrans类实现的仿射变换 563
13.2.3 Util3D类实现的正余弦函数 568
13.2.4 Util3D类实现的方根运算 574
13.3 透明纹理精灵实现的烟雾效果 576
13.3.1 MIDlet程序入口 576
13.3.2 抽象投影属性的V3Object基类 577
13.3.3 墙壁与地板抽象的平面类(Plane) 578
13.3.4 计算帧速度的FPS类 582
13.3.5 继承V3Object的Smoke烟雾类 583
13.3.6 绘制场景游戏画布SmokeCanvas 586
13.4 本章小结 590
第14章 保留模式下的Mascot Capsule开发 591
14.1 保留模式下的文件制作和浏览 591
14.1.1 PAC1.3编辑BAC和TRA文件 591
14.1.2 M3DConv3.8制作MBAC和MTRA文件 594
14.1.3 PVMicro3.5.2浏览MBAC和MTRA文件 595
14.1.4 H3T文件和M3G文件的转换 599
14.2 实例:动画机器人 601
14.2.1 Micro3DMIDlet主类 601
14.2.2 游戏画布流程 602
14.2.3 加载游戏资源 603
14.2.4 启动线程 604
14.2.5 键盘事件 606
14.2.6 切换动画模式 607
14.2.7 释放游戏资源 609
14.3 实例:跳舞的男孩 610
14.3.1 主类程序入口 610
14.3.2 画布工作流程 611
14.3.3 初始化场景 611
14.3.4 游戏线程 613
14.3.5 释放游戏资源 614
14.4 实例:旋转的飞机 614
14.4.1 加载游戏资源 615
14.4.2 游戏循环 616
14.5 本章小结 618