众所周知,在Unity3D中,一切物体都是由Mesh组成。
通常一个显示在世界里的3D物体,都包含一个MeshFilter(网格数据)和MeshRenderer(网格渲染器)。至于碰撞体,可以另外依需求加。
下面我们来看看Unity3D里如何使用Mesh创建物体的步骤:
1.创建Mesh
2.设置顶点数组
3.设置顶点索引
4.设置贴图UV
5.设置法线向量
当然,对于没有贴图或者不需要对光照进行特殊处理的话,UV和法线向量并不是必要的。
using UnityEngine;
using System.Collections;
public class MeshTest : MonoBehaviour {
public int lengthX = 1;
public int lengthY = 1;
public int lengthZ = 1;
public Material mMaterial;
private Vector3[] GetVertices(){
Vector3 vertice0 = new Vector3(lengthX * 0.5f, -lengthY, lengthZ * 0.5f);
Vector3 vertice1 = new Vector3(lengthX * 0.5f, -lengthY, -lengthZ * 0.5f);
Vector3 vertice2 = new Vector3(-lengthX * 0.5f, -lengthY, -lengthZ * 0.5f);
Vector3 vertice3 = new Vector3(-lengthX * 0.5f, -lengthY, lengthZ * 0.5f);
Vector3[] vertices = new Vector3[] { vertice0,vertice1,vertice2,vertice3};
return vertices;
}
private Mesh GetObj()
{
if (GetComponent() == null)
{
MeshFilter filter = gameObject.AddComponent();
Mesh mesh = filter.mesh;
mesh.Clear();
return mesh;
}
else
{
return gameObject.AddComponent().mesh;
}
}
private Vector2[] getUVs()
{
Vector2 _00_CORDINATES = new Vector2(0f, 0f);
Vector2 _10_CORDINATES = new Vector2(1f, 0f);
Vector2 _01_CORDINATES = new Vector2(0f, 1f);
Vector2 _11_CORDINATES = new Vector2(1f, 1f);
Vector2[] uvs = new Vector2[]
{
// Bottom
_11_CORDINATES, _10_CORDINATES, _00_CORDINATES, _01_CORDINATES,
};
return uvs;
}
private Mesh mesh;
private int[] GetTriangles()
{
int[] triangles = new int[]
{
0,1,2,
0,2,3
};
return triangles;
}
void Start () {
mesh = GetObj();
mesh.vertices = GetVertices();
mesh.triangles = GetTriangles();
mesh.uv = getUVs();
mesh.RecalculateBounds();
mesh.RecalculateNormals();
mesh.Optimize();
gameObject.AddComponent();
GetComponent().material = mMaterial;
}
}
如上面代码所示,需要注意的是,这里的三角形的顶点索引是按照OpenGL里面的GL_TRIANGLE_FAN的顶点顺序来进行渲染的,顶点的索引顺序千万不能颠倒,不然在绘制四边形(两个三角形)或者立方体(十二个三角形)等物体的时候,无法渲染出正确的结果。我之前也是测试多次。
运行效果如下图:
在Mesh的视图中显示如下:
很明显,上面写着4个顶点,2个三角形,包含UV坐标。
其实绘制立方体也是一样的方法,只是记住顶点索引的顺序就行了,大家可以自行尝试。
文章评论