unity模型制作(三):绘制一个凸多边形

(不重要的前言:该博文为系列博文,每一篇有前后文关系,例如基类、组件的集成,如果发现有陌生组件和基类,请查看前面文章,本系列文章单纯应用unity的mesh来绘制模型,并未使用任何三方插件,文章内容、代码都是纯手打,望支持)

        凸多边形是多边形里最简单的一种,如下图的一个五边形,有五个顶点,用任意一个顶点作为起始点,按顺序与其他点相连就可以组成一个多边形。

这个五边形就可以分为a(123)、b(134)、c(145)三个三角面

顶点三角面都有了,就可以画出图形了,上代码:

三角面:

        public override List<int> GetTriangles()
        {
            List<int> triangles = new List<int>();

            for (int i = 1; i < vertices.Count - 1; i++)
            {
                int index0 = i;
                int index1 = i + 1;

                triangles.Add(0);
                triangles.Add(index0);
                triangles.Add(index1);
            }

            return triangles;
        }

uv:简单说下uv的思路,先找到左边的四个边界,最上、最下、最左、最右,四条线会组成一个矩形,每个点在矩形了横向和纵向的占比就是该点的uv

        public override List<Vector2> GetUVs()
        {
            List<Vector2> uvs = new List<Vector2>();

            Vector3 line01 = vertices[1] - vertices[0];
            Vector3 line12 = vertices[2] - vertices[1];


            Vector3 normal = Vector3.Cross(line01, line12).normalized;
            Vector3 X_Axis = line01.normalized;
            Vector3 Y_Axis = (Quaternion.AngleAxis(90, normal) * X_Axis).normalized;

            float maxX = -1000;
            float maxY = -1000;
            float minX = 1000;
            float minY = 1000;

            List<Vector2> map = new List<Vector2>();
            for (int i = 0; i < vertices.Count; i++)
            {
                float x = Vector3.Dot(vertices[i] - vertices[0], X_Axis);
                float y = Vector3.Dot(vertices[i] - vertices[0], Y_Axis);
                map.Add(new Vector2(x, y));

                if (maxX < x) maxX = x;
                if (maxY < y) maxY = y;
                if (minX > x) minX = x;
                if (minY > y) minY = y;
            }

            float xLen = maxX - minX;
            float yLen = maxY - minY;

            for (int i = 0; i < map.Count; i++)
            {
                uvs.Add(new Vector2((map[i].x - minX) / xLen, (map[i].y - minY) / yLen));
            }
            return uvs;
        }

效果:

 下一期写一下凹多边形绘制。

猜你喜欢

转载自blog.csdn.net/u014261855/article/details/123665027