前言
第1篇 數據結構基礎
第1章 SystemJS與Webpack 2
1.1 準備工作 3
1.1.1 安裝Node.js 3
1.1.2 安裝Viusal Studio Code 4
1.2 安裝和配置SystemJS 5
1.2.1 安裝SystemJS 5
1.2.2 使用SystemJS 7
1.2.3 第一個TypeScript程序 8
1.3 安裝和配置Webpack 9
1.3.1 安裝Webpack 9
1.3.2 配置Webpack 11
1.3.3 調用build命令 12
1.3.4 配置tsconfig.json文件 12
1.3.5 調用build和dev命令 13
1.3.6 使用watch命令 14
1.3.7 聯合使用watch和dev命令 15
1.3.8 使用Webpack壓縮打包源碼 16
1.4 SysemJS VS. Webpack 16
1.5 編譯(Compile)VS.轉義(Transpile) 18
1.6 斷點調試 19
1.6.1 安裝及配置Debugger for Chrome擴展 19
1.6.2 斷點調試TypeScript程序 20
1.6.3 VS Code Debug快捷鍵 21
1.7 本章總結 21
第2章 TypeScript封裝和實現常用容器 22
2.1 ArrayBuffer、DataView及類型數組實現原理 23
2.1.1 C/C++模擬JS/TS中的ArrayBuffer對象 23
2.1.2 C/C++模擬JS/TS中的DataView對象 24
2.1.3 C/C++版CDataView VS. JS/TS版DataView 25
2.1.4 C/C++模擬JS/TS中的Float32Array對象 26
2.1.5 C/C++版CFloat32Array VS. JS/TS版Float32Array 28
2.1.6 JS/TS中的類型數組對象 30
2.2 封裝動態類型數組 31
2.2.1 TypedArrayList的成員變量及構造函數 31
2.2.2 TypedArrayList的push方法 32
2.2.3 TypedArrayList的slice方法和subarray方法 33
2.2.4 TypedArrayList的其他方法和屬性 35
2.2.5 capacityChangedCallback回調函數 36
2.3 封裝關聯數組 36
2.3.1 JS/TS中的關聯數組 37
2.3.2 TypeScript索引簽名 37
2.3.3 ES 6 Map對象 38
2.3.4 封裝成Dictionary字典對象 39
2.3.5 測試Dictionary對象 42
2.3.6 紅黑樹還是哈希表 42
2.4 實現SGI STL風格雙向循環鏈表 44
2.4.1 泛型的ListNode結構 45
2.4.2 List中的頭節點 45
2.4.3 雙向循環概念 46
2.4.4 List的查詢與遍歷操作 46
2.4.5 List的插入操作 48
2.4.6 List的刪除操作 50
2.4.7 List的push / pop / push_front / pop_front操作 51
2.5 封裝隊列與棧 51
2.5.1 聲明IAdapter< T >泛型接口 52
2.5.2 實現AdapterBase< T >抽象基類 52
2.5.3 實現Queue子類和Stack子類 53
2.6 實現通用樹結構 54
2.6.1 樹結構的內存表示 54
2.6.2 樹節點添加時的要點 55
2.6.3 樹節點isDescendantOf和remove方法的實現 56
2.6.4 實現addChild等方法 58
2.6.5 查詢樹結構的層次關系 59
2.6.6 廣度/深度優先遍歷算法 60
2.6.7 隊列及棧在廣度/深度優先遍歷中的應用 62
2.6.8 廣度/深度線性遍歷枚舉器 63
2.6.9 樹結構枚舉器的實現 63
2.6.10 測試樹結構迭代器 67
2.6.11 深度優先的遞歸遍歷 71
2.7 本章總結 73
第2篇 WebGL圖形編程基礎
第3章 WebGLApplication框架 76
3.1 Application體系結構概述 77
3.2 第一個WebGL Demo 78
3.2.1 技術要點描述 78
3.2.2 Demo的成員變量與構造函數 80
3.2.3 資源同步加載 82
3.2.4 立方體、坐標系、三角形及文字渲染 83
3.2.5 更新操作 85
3.2.6 鍵盤輸入事件處理 86
3.2.7 總結Application框架的使用流程 87
3.3 Application框架實現 87
3.3.1 成員變量與構造函數 88
3.3.2 啟動/查詢/停止Application 89
3.3.3 不間斷地更新操作 90
3.3.4 CanvasInputEvent及其子類 92
3.3.5 DOM中的getBoundingRect方法 93
3.3.6 實現viewportToCanvasCoordinate方法 94
3.3.7 將DOM Event事件轉換為CanvasInputEvent事件 95
3.3.8 實現EventListenerObject接口進行事件分發 96
3.3.9 讓事件起作用 97
3.3.10 定時器Timer系統 97
3.3.11 增刪定時器對象 98
3.3.12 觸發多個定時任務的操作 100
3.3.13 WebGLApplication子類 101
3.3.14 CameraApplication子類 102
3.4 HTML頁面系統 103
3.4.1 HTML頁面系統簡介 103
3.4.2 HTML頁面源碼 104
3.4.3 入口文件main.ts 105
3.5 異步資源加載及同步操作 107
3.5.1 使用Promise封裝HTTP異步請求 107
3.5.2 實現AsyncLoadTestApplication類 109
3.5.3 異步run函數的覆寫(override)與測試 110
3.5.4 Promise.all異步并發加載及同步操作 111
3.5.5 本書后續的資源加載及同步策略 114
3.6 本章總結 114
第4章 WebGL基礎 116
4.1 WebGL中的類 116
4.2 準備工作 117
4.2.1 創建WebGLRenderingContext對象 117
4.2.2 WebGLContextAttributes對象與幀緩沖區 118
4.2.3 渲染狀態 120
4.2.4 WebGLContextEvent事件 121
4.3 基本幾何圖元繪制Demo 122
4.3.1 視矩陣、投影矩陣、裁剪和視口 122
4.3.2 GLSL ES著色語言 123
4.3.3 WebGLShader對象 126
4.3.4 GLSL ES精度限定符與WebGLShaderPrecisionFormat對象 128
4.3.5 WebGLProgram對象 130
4.3.6 WebGLActiveInfo對象 132
4.3.7 WebGLUniformLocation對象 134
4.3.8 WebGLBuffer對象 137
4.3.9 渲染數據存儲思考 140
4.3.10 Interleaved數組的存儲、尋址及繪制 141
4.3.11 drawArrays繪制基本幾何圖元 144
4.3.12 詳解基本幾何圖元 146
4.3.13 drawElements繪制方法 149
4.4 本章總結 152
第5章 WebGLUtilLib渲染框架 153
5.1 WebGLUtilLib框架類結構體系 153
5.2 GLAttribState類的實現 155
5.2.1 預定義頂點屬性常量值 156
5.2.2 GLAttribState類的bit位操作 157
5.2.3 getInterleavedLayoutAttribOffsetMap方法 158
5.2.4 getSequencedLayoutAttribOffsetMap方法 160
5.2.5 getSepratedLayoutAttribOffsetMap方法 161
5.2.6 getVertexByteStride方法 162
5.2.7 setAttribVertexArrayPointer方法 163
5.2.8 setAttribVertexArrayState方法 164
5.3 GLProgram相關類的實現 166
5.3.1 常用的VS和FS uniform變量 166
5.3.2 GLProgram的成員變量和構造函數 167
5.3.3 loadShaders方法 168
5.3.4 綁定和解綁GLProgram 169
5.3.5 載入uniform變量 170
5.3.6 GLProgramCache類 171
5.3.7 GLShaderSource對象 172
5.3.8 初始化常用的著色器 173
5.4 GLMesh相關類的實現 174
5.4.1 VAO對象與GLMeshBase類 174
5.4.2 GLStaticMesh類實現細節 175
5.4.3 GLMeshBuilder類成員變量 178
5.4.4 GLMeshBuilder類構造方法 179
5.4.5 GLMeshBuilder類的color、texcoord、normal和vertex方法 181
5.4.6 GLMeshBuilder類的begin和end方法 184
5.5 GLTexture類的實現 187
5.5.1 GLTexture的成員變量和構造函數 187
5.5.2 GLTexture類的upload方法 188
5.5.3 mipmap相關的靜態方法 189
5.5.4 GLTexture的bind / unbind、wrap和filter方法 190
5.5.5 GLTexture的createDefaultTexture靜態方法 191
5.6 本章總結 192
第6章 3D圖形中的數學基礎 193
6.1 坐標系 193
6.1.1 OpenGL / WebGL中的坐標系 193
6.1.2 左手坐標系與右手坐標系 194
6.2 TSM數學庫 196
6.3 向量 197
6.3.1 向量的概念 197
6.3.2 向量的大小(或長度) 198
6.3.3 兩個向量之間的距離 199
6.3.4 單位向量 199
6.3.5 向量的加法 199
6.3.6 向量的減法 200
6.3.7 向量的縮放 201
6.3.8 負向量 202
6.3.9 向量的點乘 202
6.3.10 向量的叉乘 203
6.4 矩陣 204
6.4.1 矩陣的定義 205
6.4.2 矩陣的乘法 205
6.4.3 單位矩陣 206
6.4.4 矩陣的轉置 207
6.4.5 矩陣的行列式與求逆 207
6.5 仿射變換 208
6.5.1 平移矩陣 209
6.5.2 縮放矩陣 209
6.5.3 繞任意軸旋轉矩陣 210
6.6 視圖矩陣與投影矩陣 211
6.6.1 視圖(攝像機)矩陣 212
6.6.2 投影矩陣 213
6.7 四元數 214
6.8 平面 215
6.8.1 構造平面 216
6.8.2 平面的單位化 217
6.8.3 點與平面的距離與關系 217
6.9 矩陣堆棧 218
6.9.1 構造函數與worldMatrix屬性 219
6.9.2 矩陣的入棧、出棧及load方法 219
6.9.3 仿射變換操作 220
6.10 攝像機 220
6.10.1 成員變量和構造函數 221
6.10.2 攝像機的移動和旋轉 222
6.10.3 攝像機的更新 224
6.10.4 攝像機的相關屬性 225
6.11 WebGLCoordSystem類 227
6.12 本章總結 228
第7章 多視口渲染基本幾何體、坐標系及文字 230
7.1 使用GLMeshBuilder多視口渲染基本幾何體 230
7.1.1 Demo的需求描述 230
7.1.2 Demo的成員變量和構造函數 231
7.1.3 drawByMatrixWithColorShader方法繪制流程 233
7.1.4 使用INTERLEAVED頂點存儲格式繪制三角形 234
7.1.5 使用SEQUENCED頂點存儲格式繪制四邊形 235
7.1.6 使用SEPARATED頂點存儲格式繪制立方體 236
7.1.7 創建多視口的方法 239
7.1.8 WebGL中的紋理坐標系 240
7.1.9 drawByMultiViewportsWithTextureShader方法繪制流程 240
7.1.10 繪制紋理立方體 242
7.1.11 實現Atlas紋理貼圖效果 243
7.1.12 收尾工作 245
7.2 坐標系、文字渲染及空間變換Demo 246
7.2.1 Demo的需求描述 246
7.2.2 Demo的成員變量和構造函數 247
7.2.3 生成單視口或多視口坐標系數組 248
7.2.4 覆寫(override)更新和渲染虛方法 249
7.2.5 覆寫(override)鍵盤事件處理虛方法 250
7.2.6 drawFullCoordSystem方法 250
7.2.7 drawFullCoordSystemWithRotatedCube方法 252
7.2.8 DrawHelper類的drawFullCoordSystem方法 254
7.2.9 深度測試對坐標系繪制的影響 255
7.2.10 drawText方法 256
7.2.11 MathHelper類的obj2GLViewportSpace方法 258
7.2.12 3D圖形中的數學變換流水線 258
7.3 本章總結 259
第3篇 開發實戰
第8章 解析與渲染Quake3 BSP場景 262
8.1 Q3BspApplication入口類 262
8.2 解析Quake3 BSP二進制文件 264
8.2.1 Quake3BspParser類的常量定義 264
8.2.2 Q3BSPLump結構定義 265
8.2.3 解析BSP文件頭 266
8.2.4 解析實體字符串數據 267
8.2.5 解析材質數據 269
8.2.6 解析頂點數據 270
8.2.7 解析頂點索引數據 273
8.2.8 解析渲染表面數據 273
8.2.9 Quake3與WebGL坐標系轉換 276
8.3 渲染Quake3 BSP場景 277
8.3.1 Quake3BspScene的初始化 278
8.3.2 DrawSurface對象 278
8.3.3 封裝Promise加載所有紋理 279
8.3.4 生成GLStaticMesh對象 280
8.3.5 繪制整個BSP場景 282
8.4 本章總結 283
第9章 解析和渲染Doom3 PROC場景 285
9.1 Doom3Application入口類 285
9.2 解析Doom3 PROC場景 286
9.2.1 Doom3詞法解析規則 287
9.2.2 IDoom3Tokenizer詞法解析器 287
9.2.3 Doom3 PROC文件格式總覽 288
9.2.4 Doom3ProcParser的parse方法 289
9.2.5 Doom3Area、Doom3Surface及Doom3Vertex類 290
9.2.6 Doom3ProcParser的_readArea方法 292
9.2.7 Doom3ProcParser的_readSurface方法 293
9.2.8 Doom3ProcParser的_readPortals方法 295
9.2.9 Doom3ProcParser的_readNodes方法 297
9.3 使用Doom3ProcScene加載和渲染PROC場景 298
9.3.1 RenderSurface對象 299
9.3.2 Doom3ProcScene的draw方法 299
9.3.3 Doom3ProcScene類的loadTextures方法 300
9.3.4 Doom3ProcScene的parseDoom3Map方法 301
9.4 AABB包圍盒 303
9.4.1 AABB包圍盒與OBB包圍盒的特點 304
9.4.2 構建AABB包圍盒 304
9.4.3 計算AABB包圍盒的9個頂點坐標值 306
9.4.4 計算變換后的AABB包圍盒 307
9.4.5 AABB包圍盒的兩個常用碰檢算法 307
9.5 攝像機視截體 308
9.5.1 攝像機視截體的概念 308
9.5.2 Frustum類的成員變量和構造函數 309
9.5.3 buildFromCamera方法的實現 310
9.5.4 讓Camera類支持Frustum 312
9.5.5 Frustum與包圍盒及三角形的可見行測試 313
9.5.6 讓GLStaticMesh支持包圍盒 314
9.5.7 更新Doom3ProcScene的draw方法 314
9.5.8 將Frustum繪制出來 315
9.5.9 Doom3ProcScene類增加包圍盒繪制方法 316
9.6 本章總結 316
第10章 解析和渲染Doom3 MD5骨骼蒙皮動畫 318
10.1 骨骼蒙皮動畫原理 318
10.1.1 骨骼蒙皮動畫效果演示 319
10.1.2 骨骼蒙皮動畫中的各種坐標系 320
10.1.3 骨骼蒙皮動畫數學關鍵點的問答 321
10.2 解析和渲染.md5mesh文件格式 322
10.2.1 .md5mesh文件解析流程 323
10.2.2 .md5mesh中的綁定姿態 324
10.2.3 解析綁定姿態 325
10.2.4 .md5mesh中的蒙皮數據 326
10.2.5 解析蒙皮數據 329
10.2.6 計算頂點最終位置 330
10.2.7 加載和生成紋理 331
10.2.8 繪制綁定姿態(BindPose) 332
10.3 解析和渲染.md5anim文件格式 333
10.3.1 .md5anim的解析流程 333
10.3.2 解析.md5anim中的關節層次信息 334
10.3.3 解析.md5anim中的包圍盒數據 336
10.3.4 解析.md5anim中的baseframe數據 337
10.3.5 解析.md5anim中的frame數據 338
10.3.6 幀動作姿態結構 339
10.3.7 MD5Anim類的buildLocalSkeleton方法 340
10.3.8 MD5Anim類的updateToModelSpaceSkeleton方法 342
10.3.9 MD5SkinedMesh類的playAnim方法 342
10.3.10 MD5SkinedMesh的drawAnimPose方法 343
10.4 實現MD5SkinedMeshApplication Demo 344
10.5 本章總結 346
編輯推薦:
資深圖形編程專家15年開發經驗的深度分享
詳解TypeScript編程及基于WebGL的3D架構與實現
深入:凝聚作者15年圖形編程經驗,帶領讀者深入探索圖形編程的知識
系統:用TypeScript語言實現WebGLApplication框架和WebGLUtilLib渲染庫
廣泛:涵蓋常用的數據結構、3D圖形數學基礎、多視口渲染、文字繪制、Quake3 BSP場景渲染、Doom3 PROC場景渲染、骨骼蒙皮動畫原理及渲染等內容
獨特:精講8個完整的有較高價值的繪圖案例,幫助讀者理解3D圖形編程的基礎核心要點
實用:不局限于TypeScript和WebGL范疇,可以使用其他各種編程語言應用到3D圖形編程的各個領域
7位重量級大咖力薦:
中國工業設計研究院西南中心院長 覃霽
上海靈禪網絡科技股份有限公司CEO 蘭海文
上海凱英網絡科技有限公司副總裁 何鑫
成都手領科技有限公司創始人兼CTO、迷霧偵探/AI-LIMIT游戲技術負責人 張銳
《全局光照技術》作者 秦春林
《Go語言從入門到進階實戰》作者、慕課網講師、資深全棧游戲開發者 徐波
跨平臺開源UI引擎FairyGUI作者 蕭應棠
本書核心內容:
SystemJS與webpack
TypeScript封裝和實現常用容器
WebGLApplication框架
WebGL基礎
WebGLUtilLib渲染框架
3D圖形中的數學基礎
多視口渲染基本幾何體、坐標系及文字
解析與渲染Quake3 BSP場景
解析與渲染Doom3 PROC場景
解析與渲染Doom3 MD5骨骼蒙皮動畫
筆者在本書的姊妹篇《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。
編著者