場景內容的再現 天龍八部的原始碼分析 二

2021-07-10 21:15:11 字數 2403 閱讀 8590

在實現了人物模型以及動畫的載入之後, 分析天龍八部內場景是如何構造的, 並且使用 ogre 1.9 重新實現場景內容(天龍八部原始碼是基於 ogre 1.6 部分, 需要修改相關原始碼).

通過原始碼分析, 乙個場景主要分為幾個檔案, 主要有 .scene 檔案, .terrain 檔案, .gridinfo 檔案, 其他檔案之後再分析.

主要用來設定場景物件的內容, 該物件主要有環境物件, 光源物件, 天空穹物件, 靜止物體物件, 粒子物件, 流動地形物件, 並且包含了地形檔案的檔名稱

包含地形大小資訊, 高度圖的檔名稱, 網格資訊檔案的名稱, lightmap 檔案的名稱. 並且設定了所有要用到的紋理影象, 以及 pixmap 資訊, pixmap 為一張紋理的一部分內容, 可以用來設定不同的地形, 比如石頭路, 草地之類. 最後還有地形的材質, 這些材質分所寫的著色器, 都是很簡單的光照計算以及多層紋理貼圖.

地形的高度資訊, 表示地形上乙個網格單元的高度, 而後多個網格組成乙個瓷塊(tile), 而後多個 tile 組成整個地形.

每個網格的資訊, 主要是每個網格單元使用的 pixmap 索引(有兩層), 網格的方位資訊.

對於 scene 檔案和 terrain 檔案部分, 其主要是 xml 格式, **裡面主要通過 expat 庫來分析檔案. 在 fairy::expatparser 類內設定 xml 檔案通過哪幾個函式處理 xml 節點的開始和關閉, 而後在這些函式內分析出節點元素和屬性, 而後傳送給不同的 handler 類來處理不同型別的 xml 檔案. 例如 fairy::scenexmlhandler 處理 scene 檔案, fairy::terraindata_xmlhandler 類處理 terrain 檔案.

主要是二進位制格式和影象格式, 例如高度圖, 其影象格式由於因為儲存的是整數資訊, 因此每個畫素取出來的值還要除以最大整數得到0到1之間的浮點數. 至於二進位制格式, 一般直接讀取相應位置的浮點數.

物件的管理主要通過兩個類來管理, 分別實現不同的功能.

由於場景的內容多種多樣, 相同種類的物件也有不同的屬性, 這些屬性都在類中使用資料成員儲存. 因此**內使用了乙個統一的介面管理所有場景中物件其資料成員的設定, 即 fairy::propertyinte***ce 類. 所有物件都由該類派生而來.

主要原理: 在類的內部儲存了命令的列表(fairy::propertycommand類), 對於每乙個物件類, 都必須派生命令類, 而後使用命令的例項單獨設定物件的乙個屬性值(資料成員值).

舉例: fairy:;enviromentobject 類繼承自 propertyinte***ce, 從 propertycommand 派生了如下這些類, fogmodecmd 類設定環境中的霧, colourrgbmembercommand 的不同特例類設定環境中的環境光, 背景顏色, 霧顏色.

該類主要負責物件的建立和銷毀, 主要通過 createrenderinstance() 和 destroyrenderinstance() 方法建立和銷毀每乙個物件. 每個 object 的派生類中都有工廠類, 通過乙個管理器, 註冊每一類物件的工廠類, 這樣分析 scene 檔案的時候, 可以根據不同的物件種類呼叫不同的工廠, 每個工廠會建立出其相應的物件. 而後在之後渲染場景的時候, 直接遍歷每乙個物件, 建立其場景中的相應內容. 例如有 fairy:;enviromentobject::factory 類.

儲存工廠例項的時候, 有個技巧, 由於工廠是長時間存在於程式中, 因此**內使用類的靜態方法內部的靜態變數來儲存工廠的例項, 這樣還可以方便工廠的唯一性, 不會建立該工廠的多個例項.

分析地形時, 一直考慮tlbb**是如何優化場景的顯示, 如果乙個場景全部渲染的話, 遊戲執行速度會非常慢. 通過**分析可知, 乙個地形劃分為多個 tile, 每個 tile 都是由 ogre::movableobject 派生的類來管理, 因此, 我們除了使用高度圖資料以及紋理資訊設定每乙個 tile 的資料之外, 我們還要設定每乙個 tile 的 aabb, 而 octree 場景管理器則會使用相機的平截頭體和這些 tile 的 aabb 資訊來判斷該 tile 是否可見. 這樣渲染的時候, 不是所有的 tile 都需要進行渲染.

對了避免無限制大小的場景對場景管理器的影響, 整個地形的 aabb 資訊也應該傳送給場景管理器, 讓其自動優化判斷過程.

由於**所使用 resources.cfg 內使用了大量的中文路徑, 而讀取 cfg 的時候, 會產生錯誤的亂碼, 這次我們需要把字元轉換成 utf-8 **, 只需下面的一行**解決 cfg 讀到的亂碼問題即可

archname = boost::locale::conv::between( archname, "gbk", "utf-8" );
蘇州地圖

桃花島地圖

ogre角色遊揚州

** ogre角色遊杭州**

天龍八部原始碼描述

天龍八部 武俠世界 的原始碼很可能是天龍八部 流出後改寫的,因為在看了 中可以找到一些證據,整個客戶端分為 乙個是編輯器,乙個是客戶端,採用ogre cegui 自寫的簡單的物理碰撞檢測 fmod 自寫的網路庫。伺服器端 目前沒仔細關注 客戶端總體的描述如下 ui系統 cegui ui基礎系統 ce...

關於天龍八部3的感想

以前一直沒有玩過網遊,玩的一直是單機的角色扮演類遊戲 武俠為主 大多數情況也是在乎劇情,我這個人玩遊戲還有個特點,就是我不喜歡仙啊 魔 神話之類的遊戲,我還是比較喜歡武俠一類的劇情很唯美結局不是那麼傷感類的遊戲。可能是我太多愁善感了。總體來說這個遊戲給我的感覺總體還是不錯的,我感覺有兩個缺點吧的。第...

《連線資料庫的天龍八部》

第一步 連線資料庫 mysqli connect 伺服器位址,mysql 使用者名稱,mysql 密碼 link mysqli connect localhost root 123456 第二步 判斷連線資料庫是否成功 連線錯誤號 mysqli connect errno 連線錯誤資訊 mysqli...