Unity中的Mesh的簡單使用

Unity中的Mesh的簡單使用

這裏我們展示一個非常簡單的效果 cube的Mesh原點改爲底部的中心 此效果可以使得我們在使用scale縮放y軸的時,使cube只向上伸展,而不是既向上又向下伸展。同理,如果我們需要cube在scale其他軸的時候,也僅僅向一側伸展,只要把原點(0,0)改爲對應位置即可。

編寫Mesh的步驟

Mesh是指模型的網格,3D模型是由多邊形拼接而成,而一個複雜的多邊形,實際上是由多個三角面拼接而成。所以一個3D模型的表面是由多個彼此相連的三角面構成。三維空間中,構成這些三角面的點以及三角形的邊的集合就是Mesh。

編寫Mesh需要如下步驟:

  1. 確定頂點座標
  2. 確定頂點的uv座標
  3. 確認三角形的連接方式

開始實現

注意,如果你是爲了正確的貼圖(如給每一個面都貼上不同的圖,或者原始的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;
    }

支持我

您的支持,就是我創作的最大動力

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章