Unity 动态创建mesh API

来源:互联网 发布:国际学校教师工资 知乎 编辑:程序博客网 时间:2024/04/29 10:51
/// <summary>
    /// 计算链接顶点
    /// </summary>
    /// <param name="segment">段数</param>
    /// <param name="triangles">链接点</param>
    public static void ComputeMeshTriangles(Vector2 segment, out int[] triangles)
    {
        int trianglesindex = 0;
        int trianglessum = Mathf.FloorToInt(segment.x * segment.y * 6);//三角形顶点总数  
        triangles = new int[trianglessum];
        for (int i = 0; i < segment.y + 1; i++)
        {
            for (int j = 0; j < segment.x + 1; j++)
            {
                if (i < segment.y && j < segment.x)
                {
                    int role = Mathf.FloorToInt(segment.x) + 1;
                    int self = j + (i * role);
                    int next = j + ((i + 1) * role);
                    //顺时针  
                    triangles[trianglesindex] = self;
                    triangles[trianglesindex + 1] = next + 1;
                    triangles[trianglesindex + 2] = self + 1;
                    triangles[trianglesindex + 3] = self;
                    triangles[trianglesindex + 4] = next;
                    triangles[trianglesindex + 5] = next + 1;
                    trianglesindex += 6;
                }
            }
        }
    }
    /// <summary>
    /// 计算顶点
    /// </summary>
    /// <param name="segment">段数</param>
    /// <param name="verticessize">顶点面积大小</param>
    /// <param name="distance">顶点深度</param>
    /// <param name="vertices">out 顶点</param>
    public static void ComputeMeshVertices(Vector2 segment, Vector2 verticessize, float distance, out Vector3[] vertices)
    {
        int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));//顶点总数  
        float vw = verticessize.x / segment.x;//vts每一段的长度  
        float vh = verticessize.y / segment.y;


        int index = 0;


        vertices = new Vector3[sum];


        for (int i = 0; i < segment.y + 1; i++)
        {
            for (int j = 0; j < segment.x + 1; j++, index++)
            {
                vertices[index] = new Vector3(j * vw, i * vh, distance);
                vertices[index] -= new Vector3(verticessize.x / 2, verticessize.y / 2, 0);
            }
        }
    }
    /// <summary>
    /// 计算网格
    /// </summary>
    /// <param name="segment">段数</param>
    /// <param name="uvsize">1:1</param>     
    /// <param name="uvs">out uv</param>
    public static void ComputeMeshUvs(Vector2 segment, Vector2 uvsize, out Vector2[] uvs)
    {
        int sum = Mathf.FloorToInt((segment.x + 1) * (segment.y + 1));//顶点总数  


        float uw = uvsize.x / segment.x;//uv每一段的长度  
        float uh = uvsize.y / segment.y;
        int index = 0;
 
        uvs = new Vector2[sum];
 
        for (int i = 0; i < segment.y + 1; i++)
        {
            for (int j = 0; j < segment.x + 1; j++, index++)
            {


                uvs[index] = new Vector2(j * uw, i * uh);
            }
        }
    }
原创粉丝点击