前言
Irrlicht(鬼火)引擎是一款用C++編寫的高性能3D引擎,是經典的3D游戲引擎之一,可以應用于在C++程序中開發3D游戲。該引擎提供商業級別的藝術特性,如動態陰影、粒子系統、角色動畫、碰撞檢測等。Irrlicht引擎的優點有:精悍的引擎框架,和Orge極其相似;高質量的圖形渲染,雖然沒有Orge的質量優越,但是與一般商業引擎相比仍然略勝一籌;清晰單一的C++語言實現,使得引擎沒有繁冗龐大的外部腳本編譯器;支持根據硬件加速調整渲染模塊的參數和算法機制。整體程序會跑得很快、很流暢,但是畫質會降低,是犧牲畫質而保證性能。
游戲開發,特別是3D游戲開發是當前非常熱門的一門學科,但是目前高校計算機專業開設的有關游戲方面的課程比較少,而且大多偏向于理論。鑒于此,本書將在講解3D游戲開發基礎理論知識的同時,選擇Irrlicht游戲引擎對這些技術進行具體的實現,使大家能夠理解一些三維圖形的理論知識,對游戲引擎有一個具體的了解,從而知道3D游戲開發的基本過程。這樣能夠使想要從事游戲開發、對游戲開發感興趣的朋友逐漸入門,掌握游戲設計的精髓。
本書內容
本書共分為15章,包括Irrlicht游戲引擎,編寫第一個Irrlicht程序,Irrlicht圖形學基礎,網格、紋理、覆蓋層,場景管理,攝像機,地形、紋理和渲染,光照與材質,聲音,粒子系統,碰撞檢測,數據和文件的處理,著色器,游戲人工智能,部署一個Irrlicht應用程序等。
本書特點
本書以實例的形式向讀者展示Irrlicht的編程精髓,將3D游戲設計的理論基礎、技巧等方面的知識融入其中,從淺入深、從易到難地講解。書中實例豐富、講解清晰、盡量避免代碼復雜冗長。恰當的實例特別有助于初學者仿效理解,進而把握問題的精髓,在實踐中掌握和領會3D游戲開發的基本技巧和思想精髓。
作者簡介
許志聞,吉林大學計算機科學與技術學院教授、博士生導師,中國計算機學會多媒體專業委員會委員,中國圖形、圖像學會多媒體專業委員會委員。2006年,美國佐治亞大學高級訪問學者。主要研究方向為計算機圖形學、動畫與游戲、虛擬現實、圖像處理、網絡多媒體和生物信息學等。
此外,參與本書創作的還有李偉、朱明會、李楊、王剛、姜曉巍等人,在此表示感謝。
讀者對象
本書適合C++游戲編程初學者和具有一定編程經驗的C++游戲編程人員,也可作為高等院校和培訓學校游戲軟件開發課程的教學參考書。
編者
2017年3月
許志聞,吉林大學計算機科學與技術學院教授、博士生導師,中國計算機學會多媒體專業委員會委員,中國圖形、圖像學會多媒體專業委員會委員。2006年,美國佐治亞大學高級訪問學者。主要研究方向為計算機圖形學、動畫與游戲、虛擬現實、圖像處理、網絡多媒體和生物信息學等。
第1章 Irrlicht游戲引擎 1
1.1 Irrlicht使用許可與系統要求 1
1.2 獲得Irrlicht引擎 2
1.3 在Windows下設置編譯器 4
1.3.1 設置編譯器的原理 4
1.3.2 設置動態鏈接庫的方法 5
1.3.3 其他設置方法 10
1.3.4 環境變量的設置方法 11
1.3.5 設置過程中常見的問題 12
1.4 重新編譯Irrlicht引擎 13
1.5 測試是否已經正確設置 15
1.6 在Linux環境中使用鬼火游戲引擎 16
1.6.1 在Linux下編譯靜態庫 16
1.6.2 編譯Hello World程序并運行 17
1.6.3 在Linux下創建第一個項目 18
1.6.4 第三方編程工具Code::Blocks 19
第2章 編寫第一個Irrlicht程序 20
2.1 Irrlicht引擎的結構 20
2.1.1 引入命名空間 20
2.1.2 了解Irrlicht引擎的結構 21
2.2 分析簡單的代碼 21
2.3 簡單的擴展 24
2.4 類的形式 26
2.5 讓窗口顯示內容 28
2.6 比較成型的模式 29
2.7 讓我們的程序發生變化 30
第3章 圖形學基礎 33
3.1 計算機顯示原理 33
3.1.1 圖形系統的硬件 33
3.1.2 光柵掃描系統 34
3.1.3 計算機圖形標準 35
3.2 圖形學的數學基礎 36
3.2.1 向量及向量運算 36
3.2.2 坐標 36
3.2.3 基本幾何變換 38
3.2.4 三維空間的變換 40
3.3 雙緩存和垂直同步 42
3.4 紋理 43
3.5 Z緩沖 45
3.6 攝像機 46
3.7 粒子系統 47
第4章 網格、紋理、覆蓋層 50
4.1 網格簡介 50
4.2 不同格式網格模型的區別 52
4.3 初識紋理 54
4.4 動態網格模型 56
4.5 覆蓋層 59
4.6 使用精靈表 63
4.7 繪制基本圖形 67
第5章 場景管理 69
5.1 場景節點和實體 69
5.1.1 場景節點 69
5.1.2 實體 71
5.2 場景節點類型 72
5.3 場景管理器 74
5.4 動態節點 74
5.5 場景的應用示例 77
5.5.1 場景節點的應用 77
5.2.2 動態節點的應用 81
5.5.3 自定義場景節點 83
第6章 攝像機 87
6.1 攝像機投影 87
6.1.1 正交投影 88
6.1.2 透視投影 89
6.1.3 兩種投影在代碼上的實現 90
6.2 裁剪 92
6.3 攝像機觀看視角的類型 95
6.3.1 普通攝像機 95
6.3.2 第一人稱射擊攝像機 95
6.3.3 Maya攝像機 96
6.4 FPS攝像機的使用示例 96
第7章 地形、紋理和渲染 99
7.1 地形場景節點類 99
7.2 高度圖 101
7.3 紋理 102
7.3.1 紋理簡介 102
7.3.2 使用紋理 103
7.4 渲染示例 106
7.4.1 渲染地形 106
7.4.2 紋理渲染 111
7.5 創建地形 114
第8章 光照與材質 119
8.1 光照模型 119
8.2 光源 119
8.3 深入光源 120
8.3.1 模擬環境光 121
8.3.2 模擬漫射光 123
8.3.3 燈光的衰減 123
8.4 光源 124
8.4.1 光源的類型 124
8.4.2 光源屬性 125
8.4.3 添加燈光 126
8.5 一些簡單的光照示例 127
8.5.1 用代碼實現環境光 127
8.5.2 用代碼實現漫射光 129
8.5.3 用代碼實現鏡面反射光 132
8.6 材質 135
8.7 陰影 136
8.8 著色 137
8.8.1 著色模式 137
8.8.2 設置著色模式 138
8.9 示例 138
8.9.1 光照和材質示例 138
8.9.2 顯示實時動態陰影 140
第9章 聲 音 144
9.1 聲音基礎 144
9.1.1 聲音的生成 144
9.1.2 聲音的編碼存儲 145
9.1.3 聲音的合成 146
9.2 irrKlang簡介 146
9.3 irrKlang的使用 147
9.3.1 實踐 Hello World 147
9.3.2 播放3D聲音文件 151
9.3.3 聲音特效 154
第10章 粒子系統 157
10.1 粒子系統簡介 157
10.2 粒子編輯器——irrEdit 158
10.2.1 添加自己的粒子系統 158
10.2.2 設置粒子系統 159
10.3 粒子系統各部分的代碼實現 160
10.3.1 粒子結構 160
10.3.2 發射器 161
10.3.3 影響器 163
10.4 繪制一個粒子系統 164
10.4.1 編寫代碼完成一個簡單的粒子系統 164
10.4.2 使用代碼制作水面 169
10.4.3 環形粒子系統 173
第11章 碰撞檢測 177
11.1 碰撞檢測概述 177
11.2 幾何和數學知識 178
11.2.1 多邊形和多面體 178
11.2.2 BSP樹 179
11.2.3 空間四叉樹和空間八叉樹 179
11.2.4 Minkowski和與Minkowski差 180
11.2.5 包圍體 181
11.3 常用的碰撞檢測算法 183
11.3.1 距離跟蹤法 183
11.3.2 基于圖像空間的碰撞檢測法 183
11.3.3 空間分解法 184
11.3.4 層次包圍盒法 185
11.4 代碼解析 185
第12章 數據和文件的處理 192
12.1 Irrlicht文件系統簡介 192
12.2 文件的讀取和寫入 194
12.2.1 寫文件 194
12.2.2 普通文件的讀寫 195
12.2.3 一行一行讀取和按分隔符讀取 198
12.2.4 XML文件的讀寫 200
12.2.5 從XML文件中加載數據 201
12.2.6 向XML文件寫入數據 204
12.2.7 從XML文件中讀取特殊數據類型的數據 205
12.3 從檔案中讀取數據 207
第13章 著色器 210
13.1 圖形渲染管線簡介 210
13.2 著色器簡介 211
13.2.1 頂點著色器 211
13.2.2 片斷(像素)著色器 211
13.2.3 幾何著色器 212
13.3 使用著色器 212
13.3.1 安裝并使用GLSL demo 212
13.3.2 在Irrlicht引擎中使用著色器 214
13.4 進一步了解著色器 223
第14章 游戲人工智能 224
14.1 什么是智能 224
14.2 什么是游戲AI 225
14.3 AI的組成與設計 226
14.3.1 抉擇與推理 226
14.3.2 解決方案的類型 226
14.3.3 智能體的反應能力 226
14.3.4 系統的真實性 226
14.3.5 游戲類型 227
14.3.6 游戲內容 227
14.3.7 游戲平臺 227
14.4 AI的輸入處理和感知 228
14.4.1 感知系統 228
14.4.2 更新規則 229
14.4.3 反應時間 229
14.4.4 門限 229
14.4.5 負荷平衡 229
14.4.6 計算代價與預處理 229
14.5 OpenSteer 230
第15章 部署一個Irrlicht應用程序 232
15.1 什么是部署 232
15.2 針對不同平臺打包發布應用 232
15.2.1 在Windows平臺下部署Irrlicht應用程序 232
15.2.2 在Linux平臺下部署Irrlicht應用程序 233
15.2.3 在Mac OS X平臺下部署Irrlicht應用程序 234
15.3 部署源代碼 236
15.3.1 為什么要部署源代碼 236
15.3.2 如何部署 236
第14章
?游戲人工智能?
游戲AI(ArtificialIntelligence,人工智能)是近來討論較多的主題。隨著游戲中畫質與音效的穩步提高和改善,游戲控制玩家(gamecontrolledplayers)不用“聰明的”方式進行操作,這種情況變得越來越明顯。游戲AI是編程人員為了給用戶提供某種挑戰或某種真實體驗而設計出來的。在游戲中,站在一處從不移動的警衛顯得非常不真實。如果你創建一個程序,使他不時朝四周張望或變換姿勢,就會看起來更具活力,而且更加真實。通過創建一個在預設路徑上行走的警衛,偶然還能夠停下來與正在站崗的警衛談話的情景,可以使玩家感覺到游戲的真實感有很大提高。
編寫游AI是一個十分復雜的工程,里面包含的知識可以編撰成一本書了,但是AI是我們不可回避的問題,所以本章將為大家講解AI的含義及相關概念,最后還會向大家推薦一些在Irrlicht中常使用的協助編寫AI的類庫。
學習目標
?了解游戲AI的想關概念
14.1什么是智能
AI是一門相對年輕的學科,其早期的一些研究工作完成于19世紀50年代初期。受早期游戲機計算能力和存儲空間的限制,游戲采用真正AI技術的歷史很短。由于AI在游戲中是一個嶄新的概念,因此游戲AI的定義對于大多數人,甚至從事游戲開發的人來說都還很模糊。
在介紹游戲AI之前,我們應該先了解一下智能的概念。“智能”這個術語相當模糊,它是指“獲取和應用知識的能力”,從字面上解釋,該定義可能意味著自動調溫器也是智能的。因為自動調溫器可以獲取房間太冷這個知識,從而應用它所學到的知識調節加熱器。事實上,智能的“真正”定義已經是一個古老的爭論了,而設計一個好的游戲并不需要這個定義。基于我們自己的目的,一個智能的游戲智能體是能夠獲取關于這個世界的知識,并對該知識做出反應的智能體。做出反應的質量和效果就是游戲需要權衡和設計的問題。
14.2什么是游戲AI
在AI的經典著作《ArtificalIntelligence:AModernApproach》(人工智能:一種現代方法)中,Russel和Norving指出,AI就是設計計算機程序可以像人一樣行動和思考,同時是理性地行動和思考。這個定義包含智能的認知學和行為學的觀點,并涵蓋理性和“人性”。
簡單地說,游戲AI就是游戲中的代碼,使得在給定情形下,當游戲有多種選擇時,計算機控制的競爭對手(或合作伙伴)采取看起來聰明的決策,從而產生相關、有用的行為。注意上述敘述中“看起來”這個詞。游戲中由AI產生的行為是“結果”導向的,因此可以認為游戲界主要關注AI中的行為主義學派。的確,我們僅僅對系統將要做出的響應感興趣,而不太關心系統是如何做出這個響應的。我們關心系統如何行動,而不關心如何思考。人們在玩游戲時并不會在意這個游戲是否運用龐大的決策腳本數據庫,也不會在意是否對決策樹進行直接搜索,或者是否建立所處環境的精確知識庫,是否基于邏輯規則進行推理決策。正如這些AI所說,推理過程全由游戲AI實現。因此,純粹的行為決策,如對手發動了哪項攻擊、他是如何接近玩家的、他如何在環境中使用各種要素以及其他游戲細節,全部是由游戲AI系統完成的。
現代游戲發展過程中也使用AI這個術語描述其他游戲行為,比如人類輸入接口的工作方式。有時甚至支配運動和碰撞的算法(如果游戲運動通過動畫驅動而非物理模擬)也屬于這一類。可見,AI是游開發界中一個被廣泛使用的名詞。當與其他同行討論AI時,大家必須一致認同這個術語的內涵和范圍。這點非常重要,否則一個人關于AI的觀念與其他人的觀念相差太遠,就容易產生誤解。本章涉及AI時,將使用非常狹窄的定義,即“基于角色的行為智能”。其中的術語“角色”源于大多數游戲的角色驅動本質。
以前,AI編程普遍被稱為“游戲玩法編程”,因為CPU控制的角色所展現出來的行為的確不含任何智能成分。在視頻游戲早期,大多數程序員都為他們游戲中的人物使用一些模式或重復運動。在某種程度上,玩這些游戲時都要找到預先確定的行為模式,以便能夠輕易擊倒對手并繼續前往另一個地點。這是由早期處理器速度和存儲空間的極端限制所決定的。模式很容易存儲,只需要最少的代碼來驅動,并且幾乎不需要進行計算;無論在頂層表現什么行為,它都簡單地使人物按規則模式運動。事實上,一些游戲采用所謂隨機的運動,但由于早期游戲中的隨機數產生器使用偽隨機數的硬編碼表,因此這些模式能夠在整個游戲行為中最終預見。
過去,為了讓游戲看起來更加智能,經常使用另一種技術,即讓計算機對手作弊,也就是讓其擁有人類玩家所不擁有的關于該游戲的額外信息,從而使下一步所做的決策看起來非常巧妙。計算機讀入玩家所按的按鈕后,以一個阻礙的走步作為系統的響應。一個實時策略作弊器可以使使用者在游戲早期還沒有找到有價值資源的區域時便前往這些地點。當游戲賦予計算機對手額外的能力、資源以及一些可直接使用的東西,而不是依靠自己提前規劃和了解對這些資源的需要,就可以實現AI的作弊。這些策略能夠帶來更具挑戰性,但是最終還是不能讓人滿意的對手。
14.3AI的組成與設計
幾乎所有AI引擎都將以某種形式使用決策與推理、感知、導航等基本系統。
14.3.1抉擇與推理
決策系統是AI引擎中使用最廣泛的部分,是決定用戶構建的AI引擎類型的底層結構。推理可定義為從實際知識或假定為真的前提中獲取邏輯或合理結論的行為。用游戲術語來說,意味著AI控制的對手獲取關于世界的信息并響應智能、合理的決策。因此,AI系統受獲取的外界信息限制,也受游戲設計時定義的響應集豐富程度的限制。游戲允許AI角色做的事情越來越多,游戲的響應集或狀態空間就越來越大。用戶選擇的技術應該由用戶要構建的游戲規模和狀態空間的大小決定。
所有決策系統都可歸結于這個定義:利用可得到的輸入獲取解決方案。這些技術之間的差別將決定用戶選擇使用的類型。我們關注的主要區別有:解決方案的類型、智能體的反應能力、系統的真實性、游戲類型、游戲內容、游戲平臺等。
14.3.2解決方案的類型
游戲解決方案的主要類型有兩種:戰略型和戰術型。戰略型解決方案通常針對長期、高層次并需要多個行動共同完成的目標。而戰術型解決方案更多針對短期、低層次并只包含一個物理動作和技巧的目標。兩者的區別在于游戲中關注整體行動還是個體行動。許多游戲同時需要戰略型和戰術型兩種解決方案,因此開發人員根據這種劃分將問題分離成幾個獨立的部分,并結合不同的結束實現。
14.3.3智能體的反應能力
游戲元素應該如何反應?腳本化系統趨向于設計具有更多程式化和語境響應的角色,但它們容易受困于這些行動腳本,從而失去反應。與此相反,完全反應式系統容易被認為過于機械或作弊,并且不符合人類的感情。強響應系統需要一個非常豐富的響應集,否則它們表現的行為將是可預測和無新意的。然而這對街機式游戲或所謂的twitch游戲非常合適,需要在所設計的游戲類型和對所期望設計的玩法經驗正確權衡的基礎上進行闡述。
14.3.4系統的真實性
要被認為是“真實的”,AI元素做出的決策和行動必須類似于人類。在游戲的限制條件下,每個AI實體都需要智能決定所要做的正確的事情,但類似于人類也意味著會犯錯誤。因此,AI角色也需要很好地體現人類的弱點。化解玩家所有拳擊或射擊永遠不會落空的對手和Scrabble游戲中對整個字典了如指掌的對手都不會讓玩家高興,反而會讓他們感到沮喪,我們的目標是在競賽和娛樂之間找到平衡,從而使玩家被游戲的挑戰性所吸引,同時通過擊敗游戲形成一個持續的積極反饋。真實性問題還包括對游戲使用物理定律的實際認同數量。玩家能跳得比實際生活中更高嗎?他能飛嗎?是否能很快痊愈?這些都得由開發人員決定,意味著“真實性”可定義為“特定游戲世界中的真實性”。在幻想世界中尤其要小心,因為肆意破壞規則的敵人將被認為是在作弊而不是具有魔法,必須采取措施以確保玩家了解并遵守游戲世界中的規則。還要記住,大多數玩家都知道地球物理定律,但在他們設法習慣開發人員設定的規則時,這些特殊定律最初很有可能成為他們的絆腳石。
14.3.5游戲類型
不同類型的游戲需要不同類型的AI系統。在游戲層面上,必須記住以下幾項:
(1)輸入(或感知)類型。要注意的事項包括輸入的數量、頻率、信息傳遞方式(輪詢、事件、回調函數等)以及輸入之間的層次關系。街機式游戲只有非常有限的輸入,而實時策略游戲中的角色可能需要非常多關于世界的感知,以便導航地形、保持編隊、幫助友好單元、接收人類發出的命令并對攻擊的敵人做出響應。
(2)輸出(或決策)類型。根據感知,系統賦予引擎決策部分信息,AI系統將做出一個決策或產生一個輸出。輸出可以是模擬的、數字的或在周邊行為上的一連串事件,可以包含整個角色(如潛水以尋求掩護)、部分角色(如扭頭以響應噪聲)或多個角色(如讓市民們挖更多石頭)。輸出可以是具體的,也可以是高層的,其中后者將影響許多AI角色的行為,并改變許多決策的進程。
(3)游戲類型需要的決策整體結構。有的游戲具有非常簡單或單一性的決策,Robotron游戲就是一個例子。怪物以一定的速度和運動類型向玩家靠近,并試圖殺死玩家。在復雜的游戲中(如《帝國時代》),需要在游戲中進行許多不同類型的決策,可以使用小組級策略、單元戰術、一系列路徑搜索問題以及其他更深奧的問題,如外交手段等。其中每一個問題都可能代表AI中的一個子系統,而且這些子系統采用完全不同的方法完成這些工作。
14.3.6游戲內容
上述游戲類型是游戲玩法關注的特例,由特殊或新奇的游戲內容決定。《黑與白》之類的游戲需要為基本的游戲玩法機制設計非常專業的AI系統,即通過引導或展示如何完成工作教它學會主要的動物行為。預先設計框架時需要進行深思熟慮,同時可以向早期的原型性工作尋求幫助以克服設計上的缺陷。
……