Unity3D使用Mesh创建物体

众所周知,在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坐标。

其实绘制立方体也是一样的方法,只是记住顶点索引的顺序就行了,大家可以自行尝试。

发表评论

电子邮件地址不会被公开。