这里我们展示一个非常简单的效果 cube的Mesh原点改为底部的中心 此效果可以使得我们在使用scale缩放y轴的时,使cube只向上伸展,而不是既向上又向下伸展。同理,如果我们需要cube在scale其他轴的时候,也仅仅向一侧伸展,只要把原点(0,0)改为对应位置即可。
Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成。所以一个3D模型的表面是由多个彼此相连的三角面构成。三维空间中,构成这些三角面的点以及三角形的边的集合就是Mesh。
编写Mesh需要如下步骤:
注意,如果你是为了正确的贴图(如给每一个面都贴上不同的图,或者原始的cube的uv不符合你的效果),那么我建议你使用24个顶点和24个uv坐标的形式,因为本例子非常简单,所以本例子使用的是最简单的cube,即8个顶点,对应8个uv坐标的形式。
提示:Mesh需要MeshRenderer才能显示出来
GameObject orgcube = new GameObject();//新建我们的物体
MeshFilter meshf = orgcube.AddComponent();//添加MeshFilter组件
orgcube.AddComponent();//添加MeshRenderer组件
Mesh m = new Mesh();
List _verticesList = new List();//这是顶点坐标
List _uvList = new List();//这是顶点对应的uv坐标
List _triList = new List();//这是三角形的连接方式
这时候,我们的变量初始化就完成了。
现在,这里需要一点点的小数学。
我们的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坐标不会影响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
private void finalmesh()
{
GameObject orgcube = new GameObject();
MeshFilter meshf = orgcube.AddComponent();
orgcube.AddComponent();
Mesh m = new Mesh();
List _verticesList = new List();
List _uvList = new List();
List _triList = new List();
_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;
}
您的支持,就是我创作的最大动力