http://www.cnblogs.com/zhanghaipeng-Unity3D/p/4714973.html
之前一直對unity中Mesh到底是什么和實現不清楚,花了時間把這部分看了一下,終於比較清楚了。
Unity3D中的Mesh(網格)事實上就是我們所說的三角網格。而三角網格是什么呢,三角網格就是由一系列三角形組成的多邊形網格,主要用於模擬復雜物體的表面,事實上游戲開發過程中美術給我們的人體、車輛模型都是由一個或多個三角網絡(mesh)組成的。下面我們來通過程序實現一些簡單的三角網格:
1、一個簡單的三角網格類
struct Triangle{ //組成三角網格的基本單位三角形類
Vector3 p[3]; //三角形的頂點數組
};
//維護一個三角形數組
struct TriangleMesh{ //簡單的三角網格類
int triCount; //網格中三角形的總數
Triangle *triList; //存放三角形的鏈表
};
這種表示方法的優點就是實現簡單,對於一些情況也許已經能滿足需求,但是這種表示方法卻不能體現"網格"所隱含的三角形連通性,畢竟所有的三角形都一股腦的放在了三角形鏈表中。
實際中的三角網格,每個三角形都和其他三角形共享邊,所以三角網格需要存儲三類信息:
頂點:每個三角形由3個頂點。各頂點都有可能和其他三角形共享。
邊:連接兩個頂點的邊。每個三角形有3條邊。
面:每個三角形對應一個面。我們可以用頂點或者邊的列表表示面。
因此出現了很多有效的網格表示方法,下面我們來討論一種標准的存儲格式:索引三角網格。
2.索引三角網格:
與上面實現的維護一個三角形數組不同,我們在索引三角網格中維護兩個列表,頂點表和三角形表。
每個頂點包含一個3D位置,一般也會包括紋理映射坐標(UV坐標),表面法向量,光照值等附加信息(這些信息我們在后面的文章討論)。通常來說我們要考慮頂點列出的順序,根據頂點列出的順序來得出三角面的“正面”或“反面”。下面是一個高度簡化的代碼用於表示索引三角形網格。
struct Vertex{ //由於存儲三角形頂點級信息
Vector3 p;
....... //其他信息 紋理映射坐標 法向量 光照信息
};
struct Triangle{ //保存三角形級信息
int vertex[3]; //三個頂點在頂點列表的索引
};
//存放三角網格的結構 維護兩個表 定點表和三角形表
struct TriangleMesh{
int vertexCount; //頂點數
Vertex *vertexList; //頂點存放鏈表
int triangleCount; //三角形數量
Triangle *triangleCount; //存放三角形的鏈表
};
在這種實現方法中,索引三角形網格隱含了鄰接的信息,可以通過搜索三角形鏈表得到公共頂點的索引以此來得出公共邊(好吧,是有點費效率),但是這種方法要比之前的省空間的多,因為信息都存在頂點級,三角形級只存儲頂點索引信息,而頂點索引信息的重復一般要比頂點信息重復占用的空間小的多。