Unity里的Mesh屬性


-----------------------------------------------------------------------------------------------

Mesh是Unity內的一個組件,稱為網格組件。

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,每個頂點的法線好像就是設置為那個頂點所在的面的法線。

不過肯定不是這樣的,畢竟要是兩個不在同一面的面共有一個頂點,那就不成立了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM