詳細介紹Quake2BSP檔案格式和應用(轉)
詳細介紹Quake2BSP檔案格式和應用(轉)[@more@] 簡介 BSP檔案格式是QUAKE 2用於儲存地圖的一種檔案格式,說得具體點,就是用於渲染Q2世界的。儘管有其他的資訊包含在BSP檔案中,用於其他遊戲部分(如敵人AI,等等),在這篇文章中,我不將討論他們。如果你有這方面的知識,請告訴我,我的E-MAIL在下面。在這篇文章中難免有錯誤之處,請告訴我。 為了更清楚的描述BSP檔案格式,在這篇文章中將試圖對Q2渲染引擎進行技術方面的描述。現在讓我們假想這個渲染器使用的是基本的3D圖形技術,包含BSP樹結構。 我們在這篇文章中描述的是Q2的BSP檔案格式,這個檔案格式由Kingpin使用(他建立了Q2引擎)。對於Q1和Q3的檔案格式,雖然他們很相同,但還是有點不相容。不管怎樣,BSP的檔案結構和技術不是很難,這篇文章將對於那些對這些格式趕興趣的人。 法律方面的問題 協定 在這篇文章中,我用C語言結構來描述這些問題。為了使描述簡單並規範意義,我用int32 and uint32來表示有符號和無符號32位整形數;同樣的符號將用於16位和32位整形數。下面為用於儲存BSP檔案格式的頂點和向量的結構: struct point3f { float x; float y; float z; }; struct point3s { int16 x; int16 y; int16 z; }; 第二版中一些地方,如儲存記憶體,就不需要很高的精度。相比於12位的版本,他只需要6位。通常情況下,都是用整形,而非浮點。 渲染 在這一節中,我們將介紹資料結構中的一些術語,並描述一下在Q2中進行渲染的過程。 Q2地圖中劃分成很多的凸區域,這些區域用BSP樹頁來表示。任何時候攝象機的位置隨這些凸區域的水平方向改變。那一些樹葉都相互的簇擁在一起,成一叢一叢的。這些叢如何構成是由建立BSP檔案的工具決定。對於每個叢,他們都是以列表形式潛在,直觀地儲存。我們把這稱為potentially visible set(PVS). 要渲染Q2地圖,首先篇歷BSP樹,以決定攝象機的匯入。一旦知道攝象機匯入的葉,相應的叢也匯入了(記住一片葉包含一個叢)。對應於叢的PVS然後解壓出攝象機對應的那些PVS的列表。葉然後儲存根據視角平截面裁減的葉的範圍。 BSP樹 許多人在透過用Q2和相似的引擎時,沒有把BSP樹和相應的演算法聯絡起來。透過上面的敘述,我們知道可視的介面是由PVS決定。BSP樹用於分割地圖並快速地決定哪一塊應該顯示。結果,在Q2中沒有好的渲染演算法,而不得不用其他資料結構代替(如OCTREE OR K-D TREE)。BSP樹不管怎樣是非常簡單的,他也被用在Q2引擎中其他不用渲染的任務中。 當討論BSP樹中儲存葉結點的BSP樹(leaf-based BSP trees)和儲存內部結點的BSP樹(node-based BSP trees)時。用在Q2中的BSP樹的變化實際上是兩方面的。這兩方面是渲染和衝突檢測。用於渲染時,他直接把儲存在葉結點中的面渲染出來,因為他們是以PVS形式儲存的。如果你沒有執行衝突檢測,儲存在內部結點中的面將完全被忽約。 檔案頭 就我所知,所有的BSP檔案是以位元組的形式儲存的,當用在大的終端平臺上時,隨著匯入而變換。這使的相同的地圖能夠被使用不同平臺的Q2使用者共同使用。如果你在大的終端中匯入BSP檔案-------如Macintosh ,UNIX---你將不得不仔細的變換位元組順序。 BSP檔案格式是用目錄結構組織的,檔案中所有的資料包含“自由的浮動”(free floating)團。在檔案開始處,有一個目錄告訴團的開始的偏移和長度。這個目錄後的檔案開始的8個位元組是用於描述這些團的位置和長度。 BSP檔案頭的格式描述如下: struct bsp_lump { uint32 offset; //從檔案開始的資料的偏移(用位元組表示) uint32 length; //資料的長度(用位元組表示) }; struct bsp_header { uint32 magic; //magic號(“IBSP”) uint32 version; //BSP格式的版本(38) bsp_lump lump[19]; //團的目錄 }; BSP檔案開始的4個位元組是一個標記,用於標識檔案是否一個軟體BSP檔案。這些位元組被拼為“IBSP”。接下來是32位無符號整形數,用於指定版本號。正如上面說的一樣,本檔案的版本號為38。 接下來的表顯示BSP檔案中包含的不同的團,並且這些團的索引排列在檔案頭中。這些團的目的是用於標識不知道的問題標記(這個名字來源於QBSP原始碼),不管怎樣,他們是不用建構簡單的Q2標準渲染器。 索引名 描述 0 Entities MAP實體文字緩衝器 1 Planes 平面佇列 2 Vertices 頂點佇列 3 Visibility 壓縮的PVS資料和所有的叢目錄 4 Nodes BSP樹的內部結點陣列 5 Texture Information 表面材質運用佇列 6 Faces 表面佇列 7 Lightmaps 光圖 8 Leaves BSP樹的內部葉佇列 9 Leaf Face Table 索引查詢表,用於參考葉中的表面佇列 10 Leaf Brush Table ? 11 Edges 邊佇列 12 Face Edge Table 索引查詢表,用於參考葉中的邊佇列 13 Models ? 14 Brushes ? 15 Brush Sides ? 16 Pop ? 17 Areas ? 18 Area Portals ? 許多團是用結構佇列的形式儲存的,這些結構都是固定大小。例如,頂點團是一個POINT3F結構佇列。由於每個POINT3F是12位,頂點值被12個頂點團分開進行計算。相似的計算也被用於面,結點,材質資訊,表面,葉和邊團。 在下一節,我們將討論團的結構和作用。 頂點團 頂點團是一列世界的所有的頂點。每個結點是3個float浮點值,相當於12個位元組。你能計算這些頂點值透過把這些頂點團的長度分為12來計算。(You can compute the numbers of vertices by dividing the length of the vertex lump by 12. ^_^不好意思,可能翻譯錯了) Q2用一個協調系統透過Z-軸調整為向上。記住,就是你用其他的系統進行調節,你可能需要改變束縛盒和麵方程式。 邊團 在表面的頂點要共享,而且邊也要共享。每一條邊是儲存在頂點佇列中。儲存量是兩個16位的整形數,因此,在邊佇列中的邊數是由邊團的值除以4。這裡要說的是可能有一條邊被有卷繞著的線的兩個面共享,因此對於一條邊,沒有特殊的方向。這一點將在表面團中討論。 表面團 bsp_face結構佇列中表麵糰的格式如下: struct bsp_face { uint16 plane; //表面平行的面的索引 uint16 plane_side; //設定表面是否與面平行 uint32 first_edge; //第一條邊的索引(在表面邊佇列中) uint16 num_edges; //連續的邊的數量(在表面邊佇列中) uint16 texture_info; //材質資訊結構的索引 uint8 lightmap_syles[4]; //光圖的型別 uint32 lightmap_offset; //光圖在光圖團中的偏移 }; 這個bsp_face結構的長度是20位元組,面的數量可以由表面團除以20得到
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-952186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SD卡中FAT32檔案格式快速入門(圖文詳細介紹)【轉】SD卡
- Qt 檔案模型(QFileSystemModel)詳細介紹QT模型
- dxf檔案用什麼開啟(dxf檔案格式介紹)
- PE檔案格式詳細解析(一)
- 01 . Shell詳細入門介紹及簡單應用
- pandas agg函式的詳細介紹與應用函式
- PE檔案格式詳細解析(二)--IAT
- 《非常防護》專案詳細介紹
- kubernetes實戰篇之helm示例yaml檔案檔案詳細介紹YAML
- javascript this詳細介紹JavaScript
- JDBC 詳細介紹JDBC
- Kafka詳細介紹Kafka
- Git詳細介紹Git
- vuex詳細介紹和使用方法Vue
- PKI 證書檔案編碼格式介紹
- unix口令檔案介紹(轉)
- keepalived(一)原理介紹和配置檔案詳解
- Go Channel 詳細介紹Go
- Nacos 介面詳細介紹
- MQ詳細命令介紹MQ
- Recovery命令詳細介紹
- Vmstat 命令詳細介紹
- java運算子和表示式詳細介紹Java
- Android中讀取assets目錄下的檔案詳細介紹Android
- 《新型冠狀病毒剖析》專案詳細介紹
- 《蝙蝠的“自我修養”》專案詳細介紹
- 《戰疫情況一覽》專案詳細介紹
- 詳細介紹php和apache的關係和作用PHPApache
- less的介紹和應用
- 哪裡有關於Struts標籤庫的詳細介紹和應用例項呢?
- Go語言詳細介紹:logo和版本Go
- Flutter系列(一)——詳細介紹Flutter
- Nginx服務詳細介紹Nginx
- python字典詳細介紹Python
- Spring bean詳細介紹SpringBean
- Http Module 的詳細介紹HTTP
- Java異常詳細介紹Java
- 【SCN】Oracle SCN 詳細介紹Oracle