Unity中的Mesh的簡單使用
這裏我們展示一個非常簡單的效果 cube的Mesh原點改爲底部的中心 此效果可以使得我們在使用scale縮放y軸的時,使cube只向上伸展,而不是既向上又向下伸展。同理,如果我們需要cube在scale其他軸的時候,也僅僅向一側伸展,只要把原點(0,0)改爲對應位置即可。
編寫Mesh的步驟
Mesh是指模型的網格,3D模型是由多邊形拼接而成,而一個複雜的多邊形,實際上是由多個三角面拼接而成。所以一個3D模型的表面是由多個彼此相連的三角面構成。三維空間中,構成這些三角面的點以及三角形的邊的集合就是Mesh。
編寫Mesh需要如下步驟:
- 確定頂點座標
- 確定頂點的uv座標
- 確認三角形的連接方式
開始實現
注意,如果你是爲了正確的貼圖(如給每一個面都貼上不同的圖,或者原始的cube的uv不符合你的效果),那麼我建議你使用24個頂點和24個uv座標的形式,因爲本例子非常簡單,所以本例子使用的是最簡單的cube,即8個頂點,對應8個uv座標的形式。
提示:Mesh需要MeshRenderer才能顯示出來
GameObject orgcube = new GameObject();//新建我們的物體
MeshFilter meshf = orgcube.AddComponent<MeshFilter>();//添加MeshFilter組件
orgcube.AddComponent<MeshRenderer>();//添加MeshRenderer組件
Mesh m = new Mesh();
List<Vector3> _verticesList = new List<Vector3>();//這是頂點座標
List<Vector2> _uvList = new List<Vector2>();//這是頂點對應的uv座標
List<int> _triList = new List<int>();//這是三角形的連接方式
這時候,我們的變量初始化就完成了。
計算頂點座標
現在,這裏需要一點點的小數學。
我們的cube原點是底部的中心(0,0,0),我們假設cube的邊長是1,那麼左下角頂點的座標就是
(-0.5,0,-0.5),那麼左後頂點的座標就是(-0.5,0,0.5),左上頂點座標就是(-0.5,1,-0.5)···同理,我們就求出了所有的頂點座標
//這裏的順序可以任意,建議按照自己的規律來寫,不容易漏點和錯點
_verticesList.Add(new Vector3(-0.5f, 0, -0.5f));
_verticesList.Add(new Vector3(0.5f, 0, -0.5f));
_verticesList.Add(new Vector3(0.5f, 1, -0.5f));
_verticesList.Add(new Vector3(-0.5f, 1, -0.5f));
_verticesList.Add(new Vector3(-0.5f, 0, 0.5f));
_verticesList.Add(new Vector3(0.5f, 0, 0.5f));
_verticesList.Add(new Vector3(0.5f, 1, 0.5f));
_verticesList.Add(new Vector3(-0.5f, 1, 0.5f));
設置頂點的uv
完成了頂點座標,我們就要設置頂點的uv了,uv座標不會影響cube的顯示,但是,uv座標會影響貼圖和shader。注意,uv順序需要跟上述頂點順序對應
_uvList.Add(new Vector2(0, 0));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(1, 1));
_uvList.Add(new Vector2(1, 1));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(1, 1));
_uvList.Add(new Vector2(1, 1));
連接三角形
接着,我們就要連接三角形了,三角形的法線向量需要朝向外部,這樣cube在渲染後,纔是可見的。三角形的法線向量遵循左手螺旋定則
// 前面
_triList.Add(0);
_triList.Add(1);
_triList.Add(2);
_triList.Add(0);
_triList.Add(2);
_triList.Add(3);
// 後面
_triList.Add(4);
_triList.Add(7);
_triList.Add(5);
_triList.Add(5);
_triList.Add(7);
_triList.Add(6);
// 左面
_triList.Add(1);
_triList.Add(5);
_triList.Add(6);
_triList.Add(1);
_triList.Add(6);
_triList.Add(2);
// 右面
_triList.Add(0);
_triList.Add(3);
_triList.Add(4);
_triList.Add(3);
_triList.Add(7);
_triList.Add(4);
// 上面
_triList.Add(2);
_triList.Add(6);
_triList.Add(3);
_triList.Add(3);
_triList.Add(6);
_triList.Add(7);
// 下面
_triList.Add(1);
_triList.Add(4);
_triList.Add(5);
_triList.Add(0);
_triList.Add(4);
_triList.Add(1);
好了,我們的工作基本上完成了,剩下只需要簡單設置下,就可以完成了
m.vertices = _verticesList.ToArray();//設置頂點
m.uv = _uvList.ToArray();//設置uv
m.triangles = _triList.ToArray();//設置三角形
meshf.mesh = m;//設置Mesh
完整的Mesh代碼如下
private void finalmesh()
{
GameObject orgcube = new GameObject();
MeshFilter meshf = orgcube.AddComponent<MeshFilter>();
orgcube.AddComponent<MeshRenderer>();
Mesh m = new Mesh();
List<Vector3> _verticesList = new List<Vector3>();
List<Vector2> _uvList = new List<Vector2>();
List<int> _triList = new List<int>();
_verticesList.Add(new Vector3(-0.5f, 0, -0.5f));
_verticesList.Add(new Vector3(0.5f, 0, -0.5f));
_verticesList.Add(new Vector3(0.5f, 1, -0.5f));
_verticesList.Add(new Vector3(-0.5f, 1, -0.5f));
_verticesList.Add(new Vector3(-0.5f, 0, 0.5f));
_verticesList.Add(new Vector3(0.5f, 0, 0.5f));
_verticesList.Add(new Vector3(0.5f, 1, 0.5f));
_verticesList.Add(new Vector3(-0.5f, 1, 0.5f));
_uvList.Add(new Vector2(0, 0));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(1, 1));
_uvList.Add(new Vector2(1, 1));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(1, 1));
_uvList.Add(new Vector2(1, 1));
// 前面
_triList.Add(0);
_triList.Add(1);
_triList.Add(2);
_triList.Add(0);
_triList.Add(2);
_triList.Add(3);
// 後面
_triList.Add(4);
_triList.Add(7);
_triList.Add(5);
_triList.Add(5);
_triList.Add(7);
_triList.Add(6);
// 左面
_triList.Add(1);
_triList.Add(5);
_triList.Add(6);
_triList.Add(1);
_triList.Add(6);
_triList.Add(2);
// 右面
_triList.Add(0);
_triList.Add(3);
_triList.Add(4);
_triList.Add(3);
_triList.Add(7);
_triList.Add(4);
// 上面
_triList.Add(2);
_triList.Add(6);
_triList.Add(3);
_triList.Add(3);
_triList.Add(6);
_triList.Add(7);
// 下面
_triList.Add(1);
_triList.Add(4);
_triList.Add(5);
_triList.Add(0);
_triList.Add(4);
_triList.Add(1);
m.vertices = _verticesList.ToArray();
m.uv = _uvList.ToArray();
m.triangles = _triList.ToArray();
meshf.mesh = m;
}
支持我
您的支持,就是我創作的最大動力