Unity中的Mesh的简单使用

匿名 (未验证) 提交于 2019-12-02 23:03:14

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

支持我

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!