Beispiel #1
0
    // tr f
    // 0.5f, 0.5f, 0.5f
    // tl f
    // -0.5f, 0.5f, 0.5f
    // br f
    // 0.5f, -0.5f, 0.5f),
    // bl f
    // -0.5f, -0.5f, 0.5f
    // tr b
    // 0.5f, 0.5f, -0.5f
    // tl b
    // -0.5f, 0.5f, -0.5f
    // br b
    // 0.5f, -0.5f, -0.5f
    // bl b
    // -0.5f, -0.5f, -0.5f

    internal static Mesh GetMesh(Vector3 trf, Vector3 tlf, Vector3 brf, Vector3 blf, Vector3 trb, Vector3 tlb, Vector3 brb, Vector3 blb)
    {
        Vector3[] positions = new Vector3[]
        {
            trf,
            tlf,
            brf,
            blf,
            trb,
            tlb,
            brb,
            blb
        };

        List <Vector3> vertices = new List <Vector3>();

        vertices.AddRange(new Vector3[] { positions[1], positions[0], positions[2], positions[3] });
        vertices.AddRange(new Vector3[] { positions[2], positions[0], positions[4], positions[6] });
        vertices.AddRange(new Vector3[] { positions[7], positions[6], positions[4], positions[5] });
        vertices.AddRange(new Vector3[] { positions[3], positions[7], positions[5], positions[1] });
        vertices.AddRange(new Vector3[] { positions[4], positions[0], positions[1], positions[5] });
        vertices.AddRange(new Vector3[] { positions[2], positions[6], positions[7], positions[3] });


        int[] triangles = new int[72];
        for (int i = 0; i < 6; i++)
        {
            int startTriangle = i * 6;
            int startVertice  = i * 4;
            ProceduralHead.CreateQuad(ref triangles, ref startTriangle, startVertice++, startVertice++, startVertice++, startVertice++);
        }


        Mesh mesh = new Mesh
        {
            vertices  = vertices.ToArray(),
            triangles = triangles
        };

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        return(mesh);
    }
    internal static Mesh GetMesh(float footRadiusOuter, float headRadiusOuter, float footRadiusInner, float headRadiusInner,
                                 float innerHeadHeight, float outerHeadHeight, float innerFootHeight, float outerFootHeight,
                                 int segments)
    {
        segments        = Mathf.Max(segments, 3);
        headRadiusOuter = Mathf.Max(0, headRadiusOuter);
        footRadiusOuter = Mathf.Max(0, footRadiusOuter);
        innerHeadHeight = Mathf.Abs(innerHeadHeight);

        List <Vector3> newVerts = new List <Vector3>(ProceduralHead.GetCircleVertices(segments));

        newVerts.AddRange(newVerts);

        // Shaft ends
        List <Vector3> vertices = new List <Vector3>(newVerts.ToArray());

        // Outer cap ends
        vertices.AddRange(newVerts.ToArray());

        // Inner cap ends
        vertices.AddRange(newVerts.ToArray());

        // Inner shaft ends
        vertices.AddRange(newVerts.ToArray());

        int[] triangles = new int[segments * 30];


        Vector3 innerHeadPosition = -Vector3.up * innerHeadHeight;
        Vector3 outerHeadPosition = -Vector3.up * outerHeadHeight;

        Vector3 innerFootPosition = Vector3.up * innerFootHeight;
        Vector3 outerFootPosition = Vector3.up * outerFootHeight;

        Mesh mesh = new Mesh();

        int headOffset      = segments - 1;
        int footCapStart    = segments * 2;
        int outerCapEnd     = segments * 3;
        int innerCapStart   = segments * 4;
        int innerCapEnd     = segments * 5;
        int innerShaftStart = segments * 6;

        for (int i = 0; i < segments; i++)
        {
            bool finalQuad      = i == segments - 1;
            int  outerShaftHead = i;
            int  outerShaftFoot = i + segments;

            int outerCapHead = i + footCapStart;
            int innerCapHead = outerCapHead + segments;

            int outerCapFoot = i + innerCapStart;
            int innerCapFoot = outerCapFoot + segments;

            int innerShaftHead = i + innerShaftStart;
            int innerShaftFoot = innerShaftHead + segments;

            // Shaft ends
            vertices[outerShaftHead] *= headRadiusOuter;
            vertices[outerShaftHead] += outerHeadPosition;
            vertices[outerShaftFoot] *= footRadiusOuter;
            vertices[outerShaftFoot] += outerFootPosition;


            vertices[innerCapHead] *= headRadiusOuter;
            vertices[innerCapHead] += outerHeadPosition;

            vertices[outerCapHead] *= headRadiusInner;
            vertices[outerCapHead] += innerHeadPosition;


            vertices[outerCapFoot] *= footRadiusOuter;
            vertices[outerCapFoot] += outerFootPosition;
            vertices[innerCapFoot] *= footRadiusInner;
            vertices[innerCapFoot] += innerFootPosition;



            // Inner shaft ends
            vertices[innerShaftHead] *= footRadiusInner;
            vertices[innerShaftHead] += innerFootPosition;
            vertices[innerShaftFoot] *= headRadiusInner;
            vertices[innerShaftFoot] += innerHeadPosition;


            int triangle = i * 30;

            int vert1 = outerShaftHead;
            int vert2 = outerShaftFoot;
            int vert3 = finalQuad ? segments : outerShaftFoot + 1;
            int vert4 = finalQuad ? 0 : outerShaftHead + 1;

            ProceduralHead.CreateQuad(ref triangles, ref triangle, vert1, vert2, vert3, vert4);


            vert1 = outerCapHead;
            vert2 = innerCapHead;
            vert3 = finalQuad ? footCapStart + segments: innerCapHead + 1;
            vert4 = finalQuad ? footCapStart : outerCapHead + 1;

            ProceduralHead.CreateQuad(ref triangles, ref triangle, vert1, vert2, vert3, vert4);


            vert1 = outerCapFoot;
            vert2 = innerCapFoot;
            vert3 = finalQuad ? innerCapStart + segments : innerCapFoot + 1;
            vert4 = finalQuad ? innerCapStart : outerCapFoot + 1;

            ProceduralHead.CreateQuad(ref triangles, ref triangle, vert1, vert2, vert3, vert4);


            vert1 = innerShaftHead;
            vert2 = innerShaftFoot;
            vert3 = finalQuad ? innerShaftStart + segments : innerShaftFoot + 1;
            vert4 = finalQuad ? innerShaftStart : innerShaftHead + 1;

            ProceduralHead.CreateQuad(ref triangles, ref triangle, vert1, vert2, vert3, vert4);
        }

        mesh.vertices = vertices.ToArray();
        mesh.RecalculateBounds();

        mesh.triangles = triangles;
        mesh.RecalculateTangents();
        mesh.RecalculateNormals();

        return(mesh);
    }