-----------------------------------------------------------------------------------------------
Mesh是Unity內的一個組件,稱為網格組件。
- Mesh 網格
- MeshFilter 網格過濾器
- Mesh Renderer 網格渲染器
Mesh:是指模型的網格,建模就是建網格。細看Mesh,可以知道Mesh的主要屬性內容包括頂點坐標,法線,紋理坐標,三角形繪制序列等其他有用屬性和功能。因此建網格,就是畫三角形;畫三角形就是定位三個點。
Mesh Filter:內包含一個Mesh組件,可以根據MeshFilter獲得模型網格的組件,也可以為MeshFilter設置Mesh內容。
Mesh Render:是用於把網格渲染出來的組件。MeshFilter的作用就是把Mesh扔給MeshRender將模型或者說是幾何體繪制顯示出來。
它們之間的關系大概就是Unity中的對象就是GameObject,每個GameObject都可以有一個MeshFilter組件(也可以沒有),該組件又有Mesh屬性(這個一定有),而該屬性又有頂點坐標,法線等屬性。而如果GameObject里有MeshFilter,則必須要Mesh Renderer才能將此網格渲染出來,不然是看不見該網格的。
---------------------------------------------------------------------------------------------------------------
Mesh的屬性:
- 頂點坐標(vertex)
- 法線(normal)
- 紋理坐標(uv)
- 三角形序列(triangle)
頂點坐標:頂點坐標數組存放Mesh的每個頂點的空間坐標,假設某mesh有n個頂點,則vertex的size為n
法線:法線數組存放mesh每個頂點的法線,大小與頂點坐標對應,normal[i]對應頂點vertex[i]的法線
紋理坐標:它定義了圖片上每個點的位置的信息. 這些點與3D模型是相互聯系的, 以決定表面紋理貼圖的位置. UV就是將圖像上每一個點精確對應到模型物體的表面. uv[i]對應vertex[i]
三角形序列:每個mesh都由若干個三角形組成,而三角形的三個點就是頂點坐標里的點,三角形的數組的size = 三角形個數 * 3.
例如:某mesh有四個頂點0,1,2,3,
V0(1, 1, 0),
V1(-1, 1, 0),
V2(1, -1, 0),
V3(-1, -1, 0)
那么它們可以組成這樣的一個網格,
tri[0] = ver[0],ver[3],ver[1],tri[1] = ver[0],ver[2],ver[3],

注意:三角形的頂點順序必須是順時針,順時針表示正面,逆時針表示背面,而unity3d在渲染時默認只渲染正面,背面是看不見的。
那么該三角形可以表示為:
tri = new int[2 * 3]{0, 3, 1, 0, 2, 3};
如何要獲取第N個三角形對應的三個頂點坐標,則:v1 = tri[N*3 + 0], v2 = tri[N*3 + 1], v3 = tir[N*3 + 2]
---------------------------------------------------------------------------------------------------------------
示例:
1.創建一個GameObject並添加MeshFilter以及MeshRender組件,並創建一個“CreateMesh.cs”腳本給它。
2.獲取該對象的filter組件,並創建一個mesh給它。
3.為該mesh設置屬性,這里先設置頂點,然后將三角形與頂點綁定
1 using UnityEngine; 2 using System.Collections; 3 4 public class CreateMesh : MonoBehaviour { 5 6 private MeshFilter filter; 7 private Mesh mesh; 8 9 // Use this for initialization 10 void Start () { 11 // 獲取GameObject的Filter組件 12 filter = GetComponent<MeshFilter>(); 13 // 並新建一個mesh給它 14 mesh = new Mesh(); 15 filter.mesh = mesh; 16 17 // 初始化網格 18 InitMesh(); 19 } 20 21 // Update is called once per frame 22 void Update () { 23 24 } 25 26 /// <summary> 27 /// Inits the mesh. 28 /// </summary> 29 void InitMesh() 30 { 31 mesh.name = "MyMesh"; 32 33 // 為網格創建頂點數組 34 Vector3[] vertices = new Vector3[4]{ 35 new Vector3(1, 1, 0), 36 new Vector3(-1, 1, 0), 37 new Vector3(1, -1, 0), 38 new Vector3(-1, -1, 0) 39 }; 40 41 mesh.vertices = vertices; 42 43 // 通過頂點為網格創建三角形 44 int[] triangles = new int[2 * 3]{ 45 0, 3, 1, 0, 2, 3 46 }; 47 48 mesh.triangles = triangles; 49 } 50 }
效果如圖:

3.網格已經成功生成,接下來該給網格貼圖了,在Inspector視圖里選中Mesh Render,並拖一個材質給它,
Mesh Render是負責渲染的,將Mesh Filter里的mesh通過自身的Materials渲染出來。
設置完材質后,我們需要將紋理貼圖與網格頂點一一對應起來,這樣才能渲染出來。
// 為mesh設置紋理貼圖坐標 Vector2[] uv = new Vector2[4]{ new Vector2(1, 1), new Vector2(0, 1), new Vector2(1, 0), new Vector2(0, 0) }; mesh.uv = uv;
效果如圖:

4.mesh還有兩個重要的屬性,法線和顏色,這兩個我不是很懂,暫時沒加入,
不過看了下自帶的cube模型的mesh,每個頂點的法線好像就是設置為那個頂點所在的面的法線。
不過肯定不是這樣的,畢竟要是兩個不在同一面的面共有一個頂點,那就不成立了。
