---------------------------TypeScript图形渲染实战:基于WebGL的3D架构与实现---------------------------
笔者在本书的姊妹篇《TypeScript图形渲染实战:2D架构设计与实现》一书中使用了微软最新的TypeScript语言,以面向接口及泛型的编程方式,采用HTML 5中的Canvas2D绘图API,实现了一个2D动画精灵系统,并在该精灵系统上演示了精心设计的与图形数学变换相关的Demo。本书中,笔者将继续带领读者学习TypeScript图形渲染的相关知识。本书主要解决的是基于WebGL的3D图形架构与实现。
3D图形编程是一个庞大的主题,从宏观角度,笔者将整个3D图形编程分为三个层次,即画出来、画得美和画得快。本书定位于画出来,目的是让读者使用TypeScript语言及WebGL 3D API编写一个WebGLApplication应用程序框架及WebGLUtilLib封装库,来渲染id Software公司的Quake3及Doom3这两个引擎的场景和骨骼动画格式。通过本书,可以让各位读者了解3D图形渲染底层最原始的运行流程。
读者能学到什么
本书最大的特点是专注于使用TypeScript语言和WebGL API(应用程序接口),来渲染id Software公司最经典的Quake3和Doom3引擎的场景和骨骼蒙皮动画文件格式。全书通过8个完整的Demo来探索和演示3D图形渲染的基础知识。
通过阅读本书,读者能掌握以下知识:
* 构建TypeScript的开发、编译及调试环境;
* 使用TypeScript封装或实现常用的容器对象;
* 实现一个支持刷新、重绘、事件分发与响应、定时回调及异步/同步资源加载的WebGLApplication框架体系;
* 使用WebGL 1.x版中内置的各个常用对象;
* 将WebGL 1.x中的一些常用操作封装成可重复使用的类库(WebGLUtilLib);
* 使用开源的TSM(TypeScript Vector And Matrix Math Library)数学库;
* 用单视口和多视口自由切换来渲染基本的几何体、坐标系,并在WebGL环境中正确地使用Canvas2D进行文本绘制;
* 进行远程加载、解析和渲染Quake3 BSP二进制场景文件;
* 进行远程加载、解析Doom3 PROC场景文件,并实现基于视锥体与AABB级别的可见性测试场景渲染功能;
. * 深入理解骨骼蒙皮动画的数学原理,并成功地解析和渲染Doom3中的MD5骨骼动画格式。
本书有何特色
* 深入:凝聚作者15年3D图形编程经验,带领读者探索3D图形编程的知识;
* 系统:使用TypeScript构建Application应用程序框架及WebGL渲染框架;
* 广泛:涉及数据结构、WebGL渲染API用法、3D数学、二进制文件读取、骨骼动画及场景渲染等内容;
* 独特:使用TypeScript和WebGL渲染API来演示Quake3、Doom3引擎的场景和骨骼动画渲染;
* 实用:详细讲解8个完整的3D图形Demo,帮助读者理解3D图形渲染最本质的运行流程。
本书内容
第1篇 数据结构基础(第1、2章)
第1章SystemJS与webpack,以循序渐进的方式介绍了如何构建基于SystemJS和webpack的TypeScript语言开发、编译和调试环境,最终形成一个支持源码自动编译、模块自动载入、服务器端热部署、具有强大断点调试功能、能自动打包的TypeScript开发环境。
第2章TypeScript封装和实现常用容器,主要涉及与数据结构相关的知识点。首先讲解了JS/TS中新增的ArrayBuffer、DataView及与类型数组相关的知识点,然后封装和实现了动态类型数组、字典、双向循环列表、队列、栈及通用树结构。
第2篇 WebGL图形编程基础(第3~7章)
第3章WebGLApplication框架,通过本书第一个WebGL Demo来演示一个支持不停刷新、重绘、事件分发与响应、具有定时效果的WebGLApplication框架体系的使用流程。该框架支持使用ES 6.0标准中的async/await机制进行资源加载。
第4章WebGL基础,通过一个WebGL基本几何图元绘制的Demo,详细介绍了WebGLContextEvent、WebGLContextAttribut、WebGLRenderingContext、WebGLShader、WebGLProgram、WebGLShaderPrecisionFormat、WebGLActiveInfo、WebGLUniformLocation和WebGLBuffer这9个类的作用和常用方法。读者可以重点关注WebGLBuffer的3种不同渲染数据存储模式。
第5章WebGLUtilLib渲染框架,介绍了多个与WebGL相关的类。其中,GLProgram类用来编译、链接GLSL ES GPU Shader源码,并提供载入uniform变量的相关操作;GLStaticMesh对象用于绘制静态物体;GLMeshBuilder对象可以用于绘制动态物体;GLTexuture类可以在GLStaticMesh或GLMeshBuilder生成的网格对象上进行纹理贴图操作。
第6章3D图形中的数学基础,通过介绍开源TSM(TypeScript Vector And Matrix Math Library)数学库,让读者掌握向量、矩阵、四元数等相关的3D数学知识,并在TSM库的基础上实现了平面、摄像机、矩阵堆栈及GLCoordSystem等后续Demo要用到的类。
第7章多视口渲染基本几何体、坐标系及文字,使用WebGLApplication框架及WebGLUtilLib库实现了两个Demo。其中,第一个Demo使用GLMeshBuilder类在多视口中渲染基本几何体;第二个Demo则用来演示3D图形中坐标系的各种变换效果,并通过使用Canvas2D来绘制文字,从而解决WebGL中文字绘制的短板问题。
第3篇 开发实战(第8~10章)
第8章解析与渲染Quake3 BSP场景,首先在Quake3BspParser类的实现中介绍了如何使用DataView对象进行Quake3 BSP二进制文件解析,然后实现Quake3BspScene类。Quake3BspScene类可以将需要渲染的数据编译成GLStaticMesh对象支持的格式,从而正确地显示Quake3 BSP场景。
第9章解析和渲染Doom3 PROC场景,主要介绍了如何解析和渲染Doom3 PROC场景文件。首先实现了用Doom3SceneParser类进行场景文件的解析;然后实现了用Doom3ProcScene类进行场景文件的渲染;最后对场景的渲染增加视截体的可见性测试,从而提升WebGL的绘制效率。
第10章解析和渲染Doom3 MD5骨骼蒙皮动画,主要介绍了如何解析和渲染Doom3引擎中的MD5骨骼蒙皮动画。首先通过问答的方式介绍了骨骼动画中4个与坐标系相关的问题;然后解析并绘制.md5mesh文件;最后介绍.md5anim动画文件格式,并实现动画序列的显示播放。
本书配套资源获取方式
本书涉及的源代码文件和Demo需要读者自行下载。请登录华章公司网站www.hzbook.com,在该网站上搜索到本书,然后单击“资料下载”按钮,即可在页面上找到“配书资源”下载链接。
运行书中的源代码需要进行以下操作:
(1)按照本书第1章中的介绍下载并安装Node.js和VS Code。
(2)在VS Code的终端对话框中输入npm install命令,自动下载运行依赖包。
(3)下载好依赖包后继续输入npm run watch。
(4)在VS Code中新建一个终端面板,输入npm run dev。
本书读者对象
* 对3D图形编程、WebGL图形开发、游戏开发感兴趣的技术人员;
* 想转行做图形开发和WebGL开发的技术人员;
* 需要全面学习3D图形开发的技术人员;
* 想从其他强类型语言(C、C++、Java、C#、Objective-C等)转HTML 5开发的技术人员;
* JavaScript程序员;
* 想了解TypeScript的程序员;
* 想提高编程水平的人员;
* 在校大学生及喜欢计算机编程的自学者;
* 专业培训机构的学员。
本书阅读建议
* 没有3D图形框架开发基础的读者,建议从第1章顺次阅读并演练每一个实例;
* 有一定3D图形开发基础的读者,可以根据实际情况有重点地选择阅读各个模块和项目案例;
* 对于每一个模块和项目案例,先思考一下实现思路,然后再阅读,学习效果更好;
* 可以先对书中的模块和Demo阅读一遍,然后结合本书提供的源码再进行理解,并亲自运行和调试,这样理解起来就更加容易,也会更加深刻。
本书作者
本书由步磊峰编写。感谢在本书编写和出版过程中给予了笔者大量帮助的各位编辑!
由于作者水平所限,加之写作时间较为仓促,书中可能还存在一些疏漏和不足之处,敬请各位读者批评指正。联系邮箱:hzbook2017@163.com。
编著者
---------------------------TypeScript图形渲染实战:2D架构设计与实现---------------------------
TypeScript是由微软公司开发的一种开源编程语言,主要为大型应用而设计。它是JavaScript的一个超集,扩展了JavaScript的语法,任何现有的JavaScript程序都可以不加改变地在TypeScript下工作。
本书使用最新的TypeScript语言,以面向接口及泛型的编程方式,采用HTML 5中的Canvas2D绘图API,实现了一个2D动画精灵系统,并在该精灵系统上演示了精心设计的与图形数学变换相关的Demo。该精灵系统是一个具备最小运行环境(更新、重绘、裁剪,以及事件分发和响应),并支持精确点选(点与点、线段、矩形、圆形、椭圆、三角形及凸多边形),采取了享元设计模式,基于场景图管理且兼容非场景图类型,而且易于扩展的系统。
本书有何特色
1.全程使用TypeScript面向接口的编程语言
本书通过TypeScript语言提供的面向接口编程功能实现了:
* Doom3引擎中文本格式的词法解析器接口;
* 接口一致,且使用了树结构管理(场景图)和线性结构管理(非场景图)的精灵系统,并且能够让场景图类型的精灵系统兼容运行非场景图类型的精灵系统。
2.剖析Canvas2D的底层原理
本书中的Canvas2D相关章节实现了如下几个重要例子:
* 模拟了Canvas2D中的渲染状态堆栈和矩阵变换堆栈,并且在实例中使用自己的矩阵变换堆栈来运行相关例子;
* 实现了类似于Canvas2D文本绘制的各种对齐算法;
* 实现了加强版的drawImage方法,使其支持repeat/repeat-x/repeat-y填充模式的算法(类似于Canvsas2D中的图案填充),并且使用加强版的drawImage实现了九宫格缩放算法(Scale9Grid)。
3.详解图形数学及点与基本几何形体的碰撞检测算法
图形编程的最大“拦路虎”是涉及图形数学变换。书中以图形数学变换为核心实现了以下例子:
* 将平移、缩放和旋转的不同顺序组合绘制出来;
* 通过绘制各种轨迹来观察和理解物体原点变换的奥秘所在;
* 贝塞尔曲线原理动画;
* 坦克方向正确地朝着鼠标指针位置移动(三角函数版);
* 坦克方向正确地朝着鼠标指针位置移动(使用向量缩放来避免使用sin / cos三角函数);
* 坦克方向正确地朝着鼠标指针位置移动(使用从两个方向以向量构建的旋转矩阵来避免使用三角函数atan2,并且用自己实现的矩阵堆栈来替换Canvas2D中的矩阵堆栈);
* 坦克沿着多条贝塞尔曲线围成的封闭路径朝向正确地运动;
* 点投影到向量上的动画效果(涉及向量的所有操作);
* 使用鼠标精确点选旋转中的精灵(测试点与线段、矩形、圆形、椭圆、三角形,以及凸多边形碰撞检测算法及凸多边形判断算法);
* 太阳系模拟动画;
* 骨骼层次精灵动画。
4.提供了几何原理图的生成源代码
本书图形数学相关章节中的几何原理图都是使用Canvas2D直接绘制出来的,并提供了绘制源代码。主要有如下图示:
* 向量方向与大小概念图示;
* 向量的加减法图示;
* 负向量图示;
* 向量与标量乘法图示;
* 向量点乘图示;
* 点与三角形关系图示;
* 凹多边形、凸多边形及三角形扇形化图示;
* 旋转矩阵推导图示。
5.精准地使用设计模式
本书中用到的设计模式如下:
* 使用工厂模式生产各种接口(精灵系统的精灵ISprite和所有基本形体IShape都是由SpriteFactory制造生产的);
* 使用迭代器模式抽象所有具有迭代功能的类或接口(IDoom3Tokenizer、贝塞尔曲线迭代器、树结构深度优先和广度优先的8个线性遍历迭代器);
* 使用模板方法设计模式(Application类通过模板方法模式规定了整个入口类的运行流程);
* 使用适配器模式(在树结构中为了统一线性遍历算法,将队列和栈数据结构适配成一致的操作接口);
* 使用享元设计模式(实现的精灵系统使用享元模式,多个精灵可以共享同一个形体,但是可以有不同的渲染状态、大小、位置和方向等)。
6.详尽地描述了树的数据结构要点
本书专门用一章来介绍树的数据结构,并且详尽地描述了树结构的各种重要算法。
* 基于队列的广度优先方式的4种非递归遍历算法(先根、后根、从左到右、从右到左);
* 基于栈的深度优先方式的4种非递归遍历算法;
* 基于“父亲+儿子”数组方式的深度优先的4种递归遍历算法;
* 基于“父亲+儿子兄弟”方式的深度优先的4种递归遍历算法;
* 基于“父亲+儿子兄弟”方式的深度优先的非递归遍历算法;
* 基于JSON的序列化和反序列化算法。
7.提供完善的技术支持和售后服务
本书提供了专门的售后服务邮箱hzbook2017@163.com。读者在阅读本书的过程中若有疑问,可以通过该邮箱获得帮助。
本书内容及知识体系
第1篇 TypeScript篇(第1、2章)
第1章构建TypeScript开发、编译和调试环境,主要介绍了TypeScript语言的开发、编译和调试环境的搭建,最终形成一个支持源码自动编译、模块自动载入、服务器端热部署及具有强大断点调试功能的TypeScript快捷开发环境。
第2章使用TypeScript实现词法解析器,用TypeScript语言,以面向接口的方式实现了一个Doom3(原id Software公司毁灭战士3游戏引擎)词法解析器;并在此基础上实现了工厂和迭代器两种设计模式,使其支持接口的生成及使用迭代方式进行Token解析输出;同时封装了XMLHttpRequest类,用来支持从服务器端下载要解析的文件。本章还系统地介绍了后续章节中要用到的一些TypeScript常用的语法知识。
第2篇 Canvas2D篇(第3、4章)
第3章动画与Application类,详细介绍了requestAnimationFrame方法与屏幕刷新频率之间的关系;并在此基础上封装了一个支持基于时间的刷新、重绘,以及事件的分发和处理的Application类;还实现了能正确处理CSS盒模型的坐标变换功能;最后添加了支持不同帧率运行的计时器,模拟了setTimeout和setInterval方法的实现。
第4章使用Canvas2D绘图,主要介绍了Canvas2D中矢量图形、文本、图像及阴影绘制的相关内容,实现了一个本章及后续章节都要使用的基于Canvas2D的演示和测试环境。本章需要读者重点关注渲染状态堆栈的实现原理,以及各种文本对齐方式的算法和支持Repeat模式的drawImage实现等内容。
第3篇 图形数学篇(第5~7章)
第5章Canvas2D坐标系变换是本书的精华,通过多个例子演示了Canvas2D中局部坐标系变换的相关知识点,让读者知道变换顺序的重要性,理解变换及掌握原点变换的几种方式;并且通过太阳自转和月亮自公转的例子,介绍了Canvas2D中矩阵堆栈层次变换的用法;最后通过一个坦克跟随鼠标指针朝向正确地运动Demo,深入讲解了一些常用三角函数的应用。
第6章向量数学及基本形体的点选,首先讲述了向量的一些基本操作,然后通过向量的加法和缩放操作替换第5章坦克Demo中使用的sin/cos函数。为了演示向量的一些基本操作,特意实现了点投影到向量的动画效果Demo;给出了点与线段、圆、矩形、椭圆、三角形及凸多边形等基本形体之间的碰撞检测算法;最后给出了本章所有几何图示的生成源代码,便于读者更加深入地理解向量各个操作背后的几何含义。
第7章矩阵数学及贝塞尔曲线,首先讲述了矩阵的相关知识,重点推导了旋转矩阵;然后将第5章中的坦克Demo用矩阵方式重写,演示如何通过两个单位向量构建旋转矩阵,从而消除对atan2函数的使用;接着模拟了Canvas2D中的矩阵堆栈,并用自己实现的矩阵堆栈重写坦克Demo;最后介绍了贝塞尔曲线多项式的推导过程,并实现了一个曲线动画的Demo。
第4篇 架构与实现篇(第8~10章)
第8章精灵系统,以面向接口编程的方式实现了一个精灵系统,并在该系统上实现了一个Demo,用来测试系统的点与各个基本形体之间的精确碰撞检测。该系统具有必要的功能(更新、绘制、鼠标和键盘事件的分发与响应),使用了非场景图类型,支持精确点选,基于保留模式,并采用了享元设计模式。
第9章优美典雅的树结构,主要介绍了树结构的增、删、改、查,以及各种遍历算法,最后实现了树结构的JSON序列化和反序列化算法。本章重在灵活应用TypeScript泛型编程,涉及不少泛型编程的细节。
第10章场景图系统,融合前面章节所讲知识,以面向接口的编程方式实现了一个精灵系统。该系统具有必要的功能(更新、重绘、裁剪及事件分发和响应),使用了场景图类型(建立在第9章的树结构上),支持精确点选,基于非立即渲染模式(保留模式),采用了享元设计模式,兼容运行第8章的非场景图类型。在此基础上,通过骨骼层次精灵动画,演示了场景图的层次变换功能及享元模式的优点;最后实现了坦克沿着贝塞尔路径朝向正确运行的Demo,以演示该精灵系统的综合特点。
本书配套资源获取方式
本书涉及的源代码文件和Demo需要读者自行下载。请登录华章公司网站www.hzbook.com,在该网站上搜索到本书,然后单击“资料下载”按钮即可在页面上找到“配书资源”下载链接。
运行书中的源代码需要进行以下操作:
(1)按照本书第1章中的介绍下载并安装Node.js和VS Code。
(2)在VS Code的终端对话框中输入npm install命令,自动下载运行依赖包。
(3)下载好依赖包后继续输入npm run dev即可自动运行Demo。
本书读者对象
* 对图形、游戏和UI开发感兴趣的技术人员;
* 想转行到图形开发领域的技术人员;
* 需要全面学习图形开发技术的人员;
* 想从C/C++、Java、C#、Objective-C等语言转HTML 5开发的技术人员;
* JavaScript程序员;
* 想学习TypeScript的程序员;
* 想提高编程水平的人员;
* 在校大学生及喜欢计算机编程的自学者;
* 专业培训机构的学员。
本书阅读建议
* 没有图形框架开发基础的读者,建议从第1章顺次阅读并演练每一个实例。
* 有一定图形开发基础的读者,可以根据实际情况有重点地选择阅读各个模块和项目案例。对于每一个模块和项目案例,先思考一下实现思路,然后阅读,效果更佳。
* 可以先阅读书中的模块和Demo,再结合配套源代码理解并调试,这样更加容易理解,而且也会理解得更加深刻。
本书作者
本书由步磊峰编写。感谢在本书编写和出版过程中给予了笔者大量帮助的各位编辑!
由于笔者水平所限,加之写作时间较为仓促,书中可能还存在一些疏漏和不足之处,敬请各位读者批评指正。
步磊峰