Unity3D中的Mesh


  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; //存放三角形的鏈表

    };

    在這種實現方法中,索引三角形網格隱含了鄰接的信息,可以通過搜索三角形鏈表得到公共頂點的索引以此來得出公共邊(好吧,是有點費效率),但是這種方法要比之前的省空間的多,因為信息都存在頂點級,三角形級只存儲頂點索引信息,而頂點索引信息的重復一般要比頂點信息重復占用的空間小的多。

 


免責聲明!

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



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