1、获得顶点的数据集合

protected override Vector3[] GetVertices()
        {
            var bottomPoints = new Vector3[_circularSideCount];
            var topPoints = new Vector3[_circularSideCount];
            for (var i = 0; i < _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;
                var bottomCos = Mathf.Cos(rad) * _bottomRadius;
                var bottomSin = Mathf.Sin(rad) * _bottomRadius;
                var topCos = Mathf.Cos(rad) * _topRadius;
                var topSin = Mathf.Sin(rad) * _topRadius;
                bottomPoints[i] = new Vector3(bottomCos, -_height * 0.5f, bottomSin) - _vertexOffset;
                topPoints[i] = new Vector3(topCos, _height * 0.5f, topSin) - _vertexOffset;
            }

            var curIndex = 0;
            var arrayLen = (_circularSideCount + 1) * 2 + (_circularSideCount + 1) * 2;
            var vertices = new Vector3[arrayLen];
            //底面
            vertices[curIndex++] = new Vector3(0, -_height * 0.5f, 0) - _vertexOffset;
            for (var i = 0; i < _circularSideCount; i++)
            {
                vertices[curIndex++] = bottomPoints[i];
            }
            //顶面
            vertices[curIndex++] = new Vector3(0, _height * 0.5f, 0) - _vertexOffset;
            for (var i = 0; i < _circularSideCount; i++)
            {
                vertices[curIndex++] = topPoints[i];
            }
            //侧面
            for (var i = 0; i < _circularSideCount; i++)
            {
                vertices[curIndex++] = bottomPoints[i];
                vertices[curIndex++] = topPoints[i];
            }
            vertices[curIndex++] = bottomPoints[0];
            vertices[curIndex] = topPoints[0];
            return vertices;
        }

2、获得法线方向的数据集合

protected override Vector3[] GetNormals()
        {
            var curIndex = 0;
            var arrayLen = (_circularSideCount + 1) * 2 + (_circularSideCount + 1) * 2;
            var normals = new Vector3[arrayLen];
            //底面
            for (var i = 0; i <= _circularSideCount; i++)
            {
                normals[curIndex++] = Vector3.down;
            }
            //顶面
            for (var i = 0; i <= _circularSideCount; i++)
            {
                normals[curIndex++] = Vector3.up;
            }
            //侧面
            for (var i = 0; i <= _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;
                var cos = Mathf.Cos(rad);
                var sin = Mathf.Sin(rad);
                normals[curIndex++] = new Vector3(cos, 0, sin);
                normals[curIndex++] = new Vector3(cos, 0, sin);
            }
            return normals;
        }

3、获得三角面顶点的索引

protected override int[] GetTriangles()
        {
            var curIndex = 0;
            var arrayLen = _circularSideCount * 3 + _circularSideCount * 3 + _circularSideCount * 3 * 2;
            var triangles = new int[arrayLen];
            //底面
            for (var i = 1; i < _circularSideCount; i++)
            {
                triangles[curIndex++] = 0;
                triangles[curIndex++] = i;
                triangles[curIndex++] = i + 1;
            }
            triangles[curIndex++] = 0;
            triangles[curIndex++] = _circularSideCount;
            triangles[curIndex++] = 1;
            //顶面
            for (var i = _circularSideCount + 2; i < _circularSideCount * 2 + 1; i++)
            {
                triangles[curIndex++] = i;
                triangles[curIndex++] = _circularSideCount + 1;
                triangles[curIndex++] = i + 1;
            }
            triangles[curIndex++] = _circularSideCount * 2 + 1;
            triangles[curIndex++] = _circularSideCount + 1;
            triangles[curIndex++] = _circularSideCount + 2;
            //侧面
            var startIndex = _circularSideCount * 2 + 2;
            for (var i = 0; i < _circularSideCount; i++)
            {
                var index = i * 2;
                triangles[curIndex++] = startIndex + index;
                triangles[curIndex++] = startIndex + index + 1;
                triangles[curIndex++] = startIndex + index + 3;

                triangles[curIndex++] = startIndex + index + 3;
                triangles[curIndex++] = startIndex + index + 2;
                triangles[curIndex++] = startIndex + index;
            }
            return triangles;
        }

4、获得UV坐标的数据集合

 protected override Vector2[] GetUVs()
        {
            var curIndex = 0;
            var arrayLen = (_circularSideCount + 1) * 2 + (_circularSideCount + 1) * 2;
            var uvs = new Vector2[arrayLen];
            //底面
            uvs[curIndex++] = new Vector2(0.5f, 0.5f);//圆心
            for (var i = 0; i < _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;
                var cos = Mathf.Cos(rad);
                var sin = Mathf.Sin(rad);
                uvs[curIndex++] = new Vector2(cos, sin) * 0.5f + new Vector2(0.5f, 0.5f);
            }
            //顶面
            uvs[curIndex++] = new Vector2(0.5f, 0.5f);
            for (var i = 0; i < _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;
                var cos = Mathf.Cos(rad);
                var sin = Mathf.Sin(rad);
                uvs[curIndex++] = new Vector2(cos, sin) * 0.5f + new Vector2(0.5f, 0.5f);
            }
            //侧面
            var value = 1.0f / _circularSideCount;
            for (var i = 0; i <= _circularSideCount; i++)
            {
                uvs[curIndex++] = new Vector2(value * i, 0);
                uvs[curIndex++] = new Vector2(value * i, 1);
            }
            return uvs;
        }

效果如下:image.png
gitee地址:https://gitee.com/pangdudu010...


肚子圆滚滚
1 声望1 粉丝

积极向上的胖嘟嘟。


引用和评论

0 条评论