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

支持我

您的支持,就是我创作的最大动力

发布了28 篇原创文章 · 获赞 49 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qwe25878/article/details/84838501