什么是Mesh
Mesh是Unity中的一個(gè)組件檀轨,稱為網(wǎng)格組件。通俗的講欺嗤,Mesh是指模型的網(wǎng)格参萄,3D模型是由多邊形拼接而成,而一個(gè)復(fù)雜的多邊形煎饼,實(shí)際上是由多個(gè)三角面拼接而成讹挎。所以一個(gè)3D模型的表面是由多個(gè)彼此相連的三角面構(gòu)成。三維空間中腺占,構(gòu)成這些三角面的點(diǎn)以及三角形的邊的集合就是Mesh淤袜。如下圖所示:
所以建模型就是就是要畫一些列的三角形,而定位一個(gè)三角形就是只需要3個(gè)頂點(diǎn)而已衰伯。很簡單哦铡羡。
比如我們要畫一個(gè)五邊形,如下:
它有五個(gè)頂點(diǎn)意鲸,但是在Unity中是通過把它轉(zhuǎn)換成一系列的三角形來繪制的烦周。所以我們需要想一想用幾個(gè)三角形通過什么樣的組合才能拼成這個(gè)五邊形呢。
我們可以由(1, 2, 3), (1, 3, 4)和(1, 4, 5)三個(gè)三角形組成怎顾,
也可以由(2, 1, 5)读慎,(2, 4, 5) 和(2, 3, 4)三個(gè)三角形組成。
組成同一個(gè)形狀的三角形排列方案可以有很多種槐雾,但是并不是所有的方案都能組合成我們希望的圖形夭委,比如下面這個(gè):
在Unity Mesh這個(gè)類中,數(shù)組mesh.vertices就是用于存儲(chǔ)三角形頂點(diǎn)坐標(biāo)募强。當(dāng)頂點(diǎn)數(shù)超過3個(gè)的時(shí)候株灸,我們連接點(diǎn)的順序不同,就會(huì)繪制出不同形狀的圖形擎值,所以我們必須要獲得我們想要的連接點(diǎn)的順序慌烧。數(shù)組mesh.triangles就是用來記錄連接三角形的順序的。由于每繪制一個(gè)三角形需要知道其三個(gè)頂點(diǎn)的順序鸠儿,那么繪制n個(gè)三角形就需要知道3*n個(gè)點(diǎn)的順序屹蚊。即數(shù)組mesh.triangles的長度是3的倍數(shù)。
手寫代碼創(chuàng)建Mesh
為了簡單进每,我們先來學(xué)習(xí)下如何用代碼創(chuàng)建一個(gè)三角形Mesh汹粤。
public class MeshDemo : MonoBehaviour
{
// Use this for initialization
void Start ()
{
this.GetTriangle ();
}
// Update is called once per frame
void Update ()
{
}
public GameObject GetTriangle ()
{
GameObject go = new GameObject ("Triangle");
MeshFilter filter = go.AddComponent<MeshFilter> ();
// 構(gòu)建三角形的三個(gè)頂點(diǎn),并賦值給Mesh.vertices
Mesh mesh = new Mesh ();
filter.sharedMesh = mesh;
mesh.vertices = new Vector3[] {
new Vector3 (0, 0, 1),
new Vector3 (0, 2, 0),
new Vector3 (2, 0, 5),
};
// 構(gòu)建三角形的頂點(diǎn)順序品追,因?yàn)檫@里只有一個(gè)三角形玄括,
// 所以只能是(0, 1, 2)這個(gè)順序。
mesh.triangles = new int[3] {0, 1, 2};
mesh.RecalculateNormals ();
mesh.RecalculateBounds ();
// 使用Shader構(gòu)建一個(gè)材質(zhì)肉瓦,并設(shè)置材質(zhì)的顏色遭京。
Material material = new Material (Shader.Find ("Diffuse"));
material.SetColor ("_Color", Color.yellow);
// 構(gòu)建一個(gè)MeshRender并把上面創(chuàng)建的材質(zhì)賦值給它胃惜,
// 然后使其把上面構(gòu)造的Mesh渲染到屏幕上。
MeshRenderer renderer = go.AddComponent<MeshRenderer> ();
renderer.sharedMaterial = material;
return go;
}
}
代碼比較簡單哪雕,里面關(guān)于MeshFilter和MeshRenderer船殉,以及Shader相關(guān)的知識,這部分我另外會(huì)單獨(dú)介紹斯嚎,大家可以先關(guān)注Mesh相關(guān)的部分利虫。
下面我們再來創(chuàng)建一個(gè)稍微復(fù)雜一點(diǎn)的五邊形。
public GameObject GetPentagon ()
{
GameObject go = new GameObject ("Pentagon");
MeshFilter filter = go.AddComponent<MeshFilter> ();
Mesh mesh = new Mesh ();
filter.sharedMesh = mesh;
mesh.vertices = new Vector3[] {
new Vector3 (0, 0, 0),
new Vector3 (0, 2, 0),
new Vector3 (2, 0, 0),
new Vector3 (2, -2, 0),
new Vector3 (1, -2, 0),
};
mesh.triangles = new int[9] {0, 1, 2, 0, 2, 3, 0, 3, 4};
mesh.RecalculateNormals ();
mesh.RecalculateBounds ();
Material material = new Material (Shader.Find ("Diffuse"));
material.SetColor ("_Color", Color.yellow);
MeshRenderer renderer = go.AddComponent<MeshRenderer> ();
renderer.sharedMaterial = material;
return go;
}
代碼也很簡單堡僻,不再廢話糠惫。大家可以自己動(dòng)手試試看,改變mest.triangles中三角形的順序钉疫,看看會(huì)產(chǎn)生什么不同的結(jié)果硼讽。
好了,關(guān)于Mesh相關(guān)的知識就暫時(shí)講這些牲阁,我也是一個(gè)Unity的新手固阁,有任何問題歡迎大家指正,一起進(jìn)步城菊。