4、Unity 生成幾種經常使用模型mesh-----CylinderShape(圓柱體)

圓柱體的頂點有頂面、底面和側面三部分。
一、得到頂點的數據集合git

protected override Vector3[] GetVertices()
        {
            int curIndex = 0;//當前索引
            int arrayLen = (_circularSideCount + 1) * 2 + _circularSideCount * 2 + 2;//數組的長度
            var vertices = new Vector3[arrayLen];
            //底面
            vertices[curIndex++] = new Vector3(0, -_height * 0.5f, 0) - _verticeOffset; ;//圓心
            for (int i = 0; i < _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;//弧度
                var cos = Mathf.Cos(rad) * _radius;
                var sin = Mathf.Sin(rad) * _radius;
                vertices[curIndex++] = new Vector3(cos, -_height * 0.5f, sin) - _verticeOffset;
            }
            //頂面
            vertices[curIndex++] = new Vector3(0, _height * 0.5f, 0) - _verticeOffset; ;//圓心
            for (int i = 0; i < _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;//弧度
                var cos = Mathf.Cos(rad) * _radius;
                var sin = Mathf.Sin(rad) * _radius;
                vertices[curIndex++] = new Vector3(cos, _height * 0.5f, sin) - _verticeOffset;
            }
            //側面
            int sideStartIndex = curIndex;
            for (int i = 0; i < _circularSideCount; i++)
            {
                var rad = i * 1.0f / _circularSideCount * Mathf.PI * 2;//弧度
                var cos = Mathf.Cos(rad) * _radius;
                var sin = Mathf.Sin(rad) * _radius;
                vertices[curIndex++] = new Vector3(cos, -_height * 0.5f, sin) - _verticeOffset;
                vertices[curIndex++] = new Vector3(cos, _height * 0.5f, sin) - _verticeOffset;
            }
            vertices[curIndex++] = vertices[sideStartIndex];
            vertices[curIndex] = vertices[sideStartIndex + 1];
            return vertices;
        }

二、得到法線方向的數據集合數組

protected override Vector3[] GetNormals()
        {
            int curIndex = 0;
            int arrayLen = (_circularSideCount + 1) * 2 + _circularSideCount * 2 + 2;
            var normals = new Vector3[arrayLen];
            //底面
            for (int i = 0; i <= _circularSideCount; i++)
            {
                normals[curIndex++] = Vector3.down;
            }
            //頂面
            for (int i = 0; i <= _circularSideCount; i++)
            {
                normals[curIndex++] = Vector3.up;
            }
            //側面
            for (int i = 0; i <= _circularSideCount; i++)
            {
                float 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;
        }

三、得到三角面頂點的索引ide

protected override int[] GetTriangles()
        {
            int curIndex = 0;
            int arrayLen = _circularSideCount * 3 + _circularSideCount * 3 + _circularSideCount * 3 * 2;
            var triangles = new int[arrayLen];
            //底面
            for (int 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 (int i = _circularSideCount + 2; i < _circularSideCount * 2 + 1; i++)
            {
                triangles[curIndex++] = _circularSideCount + 1;
                triangles[curIndex++] = i + 1;
                triangles[curIndex++] = i;
            }
            triangles[curIndex++] = _circularSideCount + 1;
            triangles[curIndex++] = _circularSideCount + 2;
            triangles[curIndex++] = _circularSideCount * 2 + 1;
            //側面
            int startIndex = _circularSideCount * 2 + 2;
            for (int i = 0; i < _circularSideCount; i++)
            {
                triangles[curIndex++] = startIndex;
                triangles[curIndex++] = startIndex + 1;
                triangles[curIndex++] = startIndex + 3;

                triangles[curIndex++] = startIndex + 3;
                triangles[curIndex++] = startIndex + 2;
                triangles[curIndex++] = startIndex;

                startIndex += 2;
            }
            return triangles;
        }

四、 得到UV座標的數據集合spa

protected override Vector2[] GetUVs()
        {
            int curIndex = 0;
            int arrayLen = (_circularSideCount + 1) * 2 + (_circularSideCount + 1) * 2;
            var uvs = new Vector2[arrayLen];
            //底面
            uvs[curIndex++] = new Vector2(0.5f, 0.5f);
            for (int 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 (int 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);
            }
            //側面
            float value = 1.0f / _circularSideCount;
            for (int i = 0; i <= _circularSideCount; i++)
            {
                uvs[curIndex++] = new Vector2(i * value, 0);
                uvs[curIndex++] = new Vector2(i * value, 1);
            }
            return uvs;
        }

總體效果以下:
image.pngcode

gitee倉庫地址:https://gitee.com/pangdudu010...orm

相關文章
相關標籤/搜索