Unity Mesh 初体验

作者: 破土君 | 来源:发表于2015-08-09 18:33 被阅读8509次

    什么是Mesh

    Mesh是Unity中的一个组件,称为网格组件。通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成。所以一个3D模型的表面是由多个彼此相连的三角面构成。三维空间中,构成这些三角面的点以及三角形的边的集合就是Mesh。如下图所示:

    mesh.png

    所以建模型就是就是要画一些列的三角形,而定位一个三角形就是只需要3个顶点而已。很简单哦。

    比如我们要画一个五边形,如下:

    demo1.png

    它有五个顶点,但是在Unity中是通过把它转换成一系列的三角形来绘制的。所以我们需要想一想用几个三角形通过什么样的组合才能拼成这个五边形呢。

    我们可以由(1, 2, 3), (1, 3, 4)和(1, 4, 5)三个三角形组成,


    demo2.png

    也可以由(2, 1, 5),(2, 4, 5) 和(2, 3, 4)三个三角形组成。

    demo3.png

    组成同一个形状的三角形排列方案可以有很多种,但是并不是所有的方案都能组合成我们希望的图形,比如下面这个:


    demo4.png

    在Unity Mesh这个类中,数组mesh.vertices就是用于存储三角形顶点坐标。当顶点数超过3个的时候,我们连接点的顺序不同,就会绘制出不同形状的图形,所以我们必须要获得我们想要的连接点的顺序。数组mesh.triangles就是用来记录连接三角形的顺序的。由于每绘制一个三角形需要知道其三个顶点的顺序,那么绘制n个三角形就需要知道3*n个点的顺序。即数组mesh.triangles的长度是3的倍数。

    手写代码创建Mesh

    为了简单,我们先来学习下如何用代码创建一个三角形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> ();
                 
                // 构建三角形的三个顶点,并赋值给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),
                };
    
                // 构建三角形的顶点顺序,因为这里只有一个三角形,
                // 所以只能是(0, 1, 2)这个顺序。
                mesh.triangles = new int[3] {0, 1, 2};
    
                mesh.RecalculateNormals ();
                mesh.RecalculateBounds ();
    
                // 使用Shader构建一个材质,并设置材质的颜色。
                Material material = new Material (Shader.Find ("Diffuse"));
                material.SetColor ("_Color", Color.yellow);
    
                // 构建一个MeshRender并把上面创建的材质赋值给它,
                // 然后使其把上面构造的Mesh渲染到屏幕上。
                MeshRenderer renderer = go.AddComponent<MeshRenderer> ();
                renderer.sharedMaterial = material;
    
                return go;
            }
    }
    

    代码比较简单,里面关于MeshFilter和MeshRenderer,以及Shader相关的知识,这部分我另外会单独介绍,大家可以先关注Mesh相关的部分。

    下面我们再来创建一个稍微复杂一点的五边形。

    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;
    }
    

    代码也很简单,不再废话。大家可以自己动手试试看,改变mest.triangles中三角形的顺序,看看会产生什么不同的结果。

    好了,关于Mesh相关的知识就暂时讲这些,我也是一个Unity的新手,有任何问题欢迎大家指正,一起进步。

    相关文章

      网友评论

        本文标题:Unity Mesh 初体验

        本文链接:https://www.haomeiwen.com/subject/auzbqttx.html