初識Unity Mesh


Mesh概念:Mesh是Unity中的一個組件,稱為網格組件。通俗的講,Mesh是指模型的網格,3D模型是由多邊形拼接而成,而多邊形實際上是由多個三角形拼接而成的。所以一個3D模型的表面其實是由多個彼此相連的三角面構成。三維空間中,構成這些三角形的點和邊的集合就是Mesh。

Mesh組成

1、頂點坐標數組vertexes 

2、頂點在uv坐標系中的位置信息數組uvs

3、三角形頂點順時針或者逆時針索引數組triangles

4、MeshFiler組件,用於增加mesh屬性

5、MeshRender組件,增加材質並渲染出來。

6、可能還需要每個頂點的法線的數組normals

using UnityEngine;
using UnityEditor;
using System.Collections;

public class GenMesh
{
    [MenuItem("GameEditor/scene/Weather/GenMesh")]
    static public void GenMeshM()
    {
        Mesh m1 = CreateRect();
        AssetDatabase.CreateAsset(m1, "Assets/_Resource/model/prefab/weather/m1.asset");
    }

    public static Mesh CreateRect()
    {
        Mesh mesh = new Mesh();

        int particleNum = 10;
        //頂點坐標
        Vector3[] verts = new Vector3[4 * particleNum]; 
        //uv坐標
        Vector2[] uvs = new Vector2[4 * particleNum];
        //三角形索引
        int[] tris = new int[2 * 3 * particleNum];

        Vector3 position;
        for (int i = 0; i < particleNum; i++)
        {
            int i4 = i * 4;
            int i6 = i * 6;

            position.x = 5 * i;
            position.y = 5 * i;
            position.z = 0;

            //頂點坐標
            verts[i4 + 0] = position;
            verts[i4 + 1] = position + new Vector3(2, 0, 0);
            verts[i4 + 2] = position + new Vector3(2, 2, 0);
            verts[i4 + 3] = position + new Vector3(0, 2, 0);

            //四個頂點在UV坐標系中的位置
            uvs[i4 + 0] = new Vector2(0.0f, 0.0f);
            uvs[i4 + 1] = new Vector2(1.0f, 0.0f);
            uvs[i4 + 2] = new Vector2(1.0f, 1.0f);
            uvs[i4 + 3] = new Vector2(0.0f, 1.0f);

            //順時針繪制三角形0 1 2 / 0 2 3
            tris[i6 + 0] = i4 + 0;
            tris[i6 + 1] = i4 + 1;
            tris[i6 + 2] = i4 + 2;
            tris[i6 + 3] = i4 + 0;
            tris[i6 + 4] = i4 + 2;
            tris[i6 + 5] = i4 + 3;
        }

        mesh.vertices = verts;
        mesh.triangles = tris;
        mesh.uv = uvs;
        mesh.RecalculateBounds();

        return mesh;
    }

    public static Mesh CreateCircle()
    {
        Mesh mesh = new Mesh();

        int particleNum = 10;
        Vector3[] verts = new Vector3[4 * particleNum];
        Vector2[] uvs = new Vector2[4 * particleNum];
        int[] tris = new int[2 * 3 * particleNum];

        Vector3 position;
        for (int i = 0; i < particleNum; i++)
        {
            int i4 = i * 4;
            int i6 = i * 6;

            position.x = 5 * i;
            position.y = 5 * i;
            position.z = 0;

            verts[i4 + 0] = position;
            verts[i4 + 1] = position + new Vector3(2, 0, 0);
            verts[i4 + 2] = position + new Vector3(2, 2, 0);
            verts[i4 + 3] = position + new Vector3(0, 2, 0);

            uvs[i4 + 0] = new Vector2(0.0f, 0.0f);
            uvs[i4 + 1] = new Vector2(1.0f, 0.0f);
            uvs[i4 + 2] = new Vector2(1.0f, 1.0f);
            uvs[i4 + 3] = new Vector2(0.0f, 1.0f);

            //順時針繪制三角形0 1 2 / 0 2 3
            tris[i6 + 0] = i4 + 0;
            tris[i6 + 1] = i4 + 1;
            tris[i6 + 2] = i4 + 2;
            tris[i6 + 3] = i4 + 0;
            tris[i6 + 4] = i4 + 2;
            tris[i6 + 5] = i4 + 3;
        }

        mesh.vertices = verts;
        mesh.triangles = tris;
        mesh.uv = uvs;
        mesh.RecalculateBounds();

        return mesh;
    }
}
View Code

 

代碼示例生成的mesh是這個樣子,未添加MeshRender,即沒有材質和渲染的情況:

 

 

添加MeshRender,即有材質和渲染的情況:

 

 

using UnityEngine;
using System.Collections;

/*僅僅創建Mesh
 *
 *
 */
public class CreatMesh : MonoBehaviour
{

    private GameObject mMesh;
    private Material mMaterial;

    /*  Mesh屬性
     *      長寬
     *      段數
     *      高度
     *      高度差
     */
    private Vector2 size;//長度和寬度
    private float minHeight = -10;//最小高度
    private float maxHeight = 10;//最大高度
    private Vector2 segment;//長度的段數和寬度的段數
    private float unitH;//最小高度和最大高度只差,值為正

    /*  頂點屬性
     *      頂點
     *      uv
     *      三角形 
     */
    private Vector3[] vertexes;//頂點數
    private Vector2 uvs;//uvs坐標
    private int[] triangles;//三角形索引

    void Start()
    {
        creatMesh(100, 100, 3, 3, -10, 10);
    }

    private void creatMesh(float width, float height, uint segmentX, uint segmentY, int min, int max)
    {
        size = new Vector2(width, height);
        maxHeight = max;
        minHeight = min;
        unitH = maxHeight - minHeight;
        segment = new Vector2(segmentX, segmentY);

        if (mMesh != null)
        {
            Destroy(mMesh);
        }
        mMesh = new GameObject();
        mMesh.name = "CreateMesh";

        computeVertexes();
        DrawMesh();
    }

    private void computeVertexes()
    {
        int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));//頂點總數
        float w = size.x / segment.x;//每一段的長度
        float h = size.y / segment.y;

        GetTriangles();

        int index = 0;
        vertexes = new Vector3[sum];
        for (int i = 0; i < segment.y + 1; i++)
        {
            for (int j = 0; j < segment.x + 1; j++)
            {
                float tempHeight = 0;
                vertexes[index] = new Vector3(j * w, 0, i * h);
                index++;
            }
        }
    }

    private void DrawMesh()
    {
        Mesh mesh = mMesh.AddComponent<MeshFilter>().mesh;//網格
        mMesh.AddComponent<MeshRenderer>();//網格渲染器

        mMaterial = new Material(Shader.Find("Diffuse"));//材質

        mMesh.GetComponent<Renderer>().material = mMaterial;

        /*設置mesh*/
        mesh.Clear();//更新
        mesh.vertices = vertexes;
        //mesh.uv 
        mesh.triangles = triangles;

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

    }

    private int[] GetTriangles()
    {
        int sum = Mathf.FloorToInt(segment.x * segment.y * 6);//三角形頂點總數
        triangles = new int[sum];
        uint index = 0;
        for (int i = 0; i < segment.y; i++)
        {
            for (int j = 0; j < segment.x; j++)
            {
                int role = Mathf.FloorToInt(segment.x) + 1;
                int self = j + (i * role);
                int next = j + ((i + 1) * role);
                //順時針
                triangles[index] = self;
                triangles[index + 1] = next + 1;
                triangles[index + 2] = self + 1;
                triangles[index + 3] = self;
                triangles[index + 4] = next;
                triangles[index + 5] = next + 1;
                index += 6;
            }
        }
        return triangles;
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM