美文网首页
程序画网格并着色

程序画网格并着色

作者: jojo911 | 来源:发表于2019-04-29 15:35 被阅读0次

https://catlikecoding.com/unity/tutorials/procedural-grid/

https://pan.baidu.com/s/1k5K-uQQmo65TSlKnU7et7Q
提取码:fz6g

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//自己画一个骰子

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Cube : MonoBehaviour
{
    private Vector3[] vertices;

    private void Awake()
    {
        StartCoroutine(Generate());
    }

    private IEnumerator Generate()
    {
        WaitForSeconds wait = new WaitForSeconds(1f);

        var mesh = GetComponent<MeshFilter>().mesh = new Mesh();
        mesh.name = "Procedural Cube";

        vertices = new Vector3[14];
        Vector2[] uv = new Vector2[14];
        int[] triangles = new int[6 * 6];

        vertices[0] = new Vector3(0, 0, 0);
        vertices[1] = new Vector3(0, 1, 0);
        vertices[2] = new Vector3(1, 1, 0);
        vertices[3] = new Vector3(1, 0, 0);
        vertices[4] = new Vector3(0, 0, 1);
        vertices[5] = new Vector3(0, 1, 1);
        vertices[6] = new Vector3(1, 1, 1);
        vertices[7] = new Vector3(1, 0, 1);

        vertices[8] = new Vector3(0, 0, 0);
        vertices[9] = new Vector3(0, 1, 0);

        vertices[10] = new Vector3(0, 1, 0);
        vertices[11] = new Vector3(0, 1, 1);

        vertices[12] = new Vector3(0, 0, 1);
        vertices[13] = new Vector3(0, 0, 0);


        uv[0] = new Vector2(0, 1f/3f);
        uv[1] = new Vector2(0, 2f / 3f);

        uv[2] = new Vector2(1f/4f, 2f / 3f);
        uv[3] = new Vector2(1f / 4f, 1f / 3f);

        uv[6] = new Vector2(2f / 4f, 2f / 3f);
        uv[7] = new Vector2(2f / 4f, 1f / 3f);

        uv[5] = new Vector2(3f / 4f, 2f / 3f);
        uv[4] = new Vector2(3f / 4f, 1f / 3f);

        uv[9] = new Vector2(4f / 4f, 2f / 3f);
        uv[8] = new Vector2(4f / 4f, 1f / 3f);

        uv[11] = new Vector2(2f / 4f, 3f / 3f);
        uv[10] = new Vector2(1f / 4f, 3f / 3f);

        uv[12] = new Vector2(2f / 4f, 0);
        uv[13] = new Vector2(1f / 4f, 0);

        //1
        triangles[0] = 0;
        triangles[1] = 1;
        triangles[2] = 2;
        triangles[3] = 0;
        triangles[4] = 2;
        triangles[5] = 3;
        //2
        triangles[6] = 3;
        triangles[7] = 2;
        triangles[8] = 7;
        triangles[9] = 7;
        triangles[10] = 2;
        triangles[11] = 6;
        //3
        triangles[12] = 7;
        triangles[13] = 6;
        triangles[14] = 5;
        triangles[15] = 4;
        triangles[16] = 7;
        triangles[17] = 5;
        //4
        triangles[18] = 8;
        triangles[19] = 4;
        triangles[20] = 5;
        triangles[21] = 8;
        triangles[22] = 5;
        triangles[23] = 9;
        //5
        triangles[24] = 2;
        triangles[25] = 10;
        triangles[26] = 6;
        triangles[27] = 6;
        triangles[28] = 10;
        triangles[29] = 11;
        //6
        triangles[30] = 3;
        triangles[31] = 7;
        triangles[32] = 13;
        triangles[33] = 13;
        triangles[34] = 7;
        triangles[35] = 12;

        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uv;
        mesh.RecalculateNormals();

        yield return wait;
    }

    private void OnDrawGizmos()
    {
        if (vertices == null)
        {
            return;
        }

        Gizmos.color = Color.black;
        for (int i = 0; i < vertices.Length; i++)
        {
            //Gizmos.DrawSphere(vertices[i], 0.1f);
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//自己画一个面,并着色

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Grid : MonoBehaviour
{
    public int xSize, ySize;
    private Vector3[] vertices;

    private void Awake()
    {
        StartCoroutine(Generate());
    }

    private IEnumerator Generate()
    {
        WaitForSeconds wait = new WaitForSeconds(1f);

        var mesh = GetComponent<MeshFilter>().mesh = new Mesh();
        mesh.name = "Procedural Grid";

        vertices = new Vector3[(xSize + 1) * (ySize + 1)];
        Vector2[] uv = new Vector2[vertices.Length];
        Vector4[] tangents = new Vector4[vertices.Length];
        Vector4 tangent = new Vector4(1f, 0f, 0f, -1f);
        for (int i = 0, y = 0; y <= ySize; y++)
        {
            for (int x = 0; x <= xSize; x++, i++)
            {
                vertices[i] = new Vector3(x, y);
                uv[i] = new Vector2((float)x / xSize, (float)y / ySize);
                tangents[i] = tangent;
            }
        }
        mesh.vertices = vertices;
        mesh.uv = uv;
        mesh.tangents = tangents;

        int[] triangles = new int[xSize * ySize * 6];
        for (int ti = 0, vi = 0, y = 0; y < ySize; y++, vi++)
        {
            for (int x = 0; x < xSize; x++, ti += 6, vi++)
            {
                triangles[ti] = vi;
                triangles[ti + 3] = triangles[ti + 2] = vi + 1;
                triangles[ti + 4] = triangles[ti + 1] = vi + xSize + 1;
                triangles[ti + 5] = vi + xSize + 2;
            }
        }
        mesh.triangles = triangles;

        mesh.RecalculateNormals();

        yield return wait;
    }

    private void OnDrawGizmos()
    {
        if (vertices == null)
        {
            return;
        }

        Gizmos.color = Color.black;
        for (int i = 0; i < vertices.Length; i++)
        {
            Gizmos.DrawSphere(vertices[i], 0.1f);
        }
    }
}

相关文章

网友评论

      本文标题:程序画网格并着色

      本文链接:https://www.haomeiwen.com/subject/jqgynqtx.html