Esempio n. 1
0
 private int[] AssignVertices(ConvexHull a, ConvexHull b, bool[] pointAbovePlane)
 {
     int[] oldToNewVertex = new int[vertices.Count];
     for (int i = 0; i < vertices.Count; i++)
     {
         Point correspondingPoint = vertexPoints[i];
         if (pointAbovePlane[correspondingPoint.index])
         {
             oldToNewVertex[i] = a.AddVertex(vertices[i], normals[i], tangents[i], correspondingPoint);
         }
         else
         {
             oldToNewVertex[i] = b.AddVertex(vertices[i], normals[i], tangents[i], correspondingPoint);
         }
     }
     return(oldToNewVertex);
 }
Esempio n. 2
0
    private void FillCutEdges(ConvexHull a, ConvexHull b, IList <Edge> edgesA, IList <Edge> edgesB, Vector3 normalPlane)
    {
        //Create outline data
        int outlineEdgeCount = edgesA.Count;

        Vector3[] outlinePoints = new Vector3[outlineEdgeCount];
        int[]     outlineEdges  = new int[outlineEdgeCount * 2];

        int startIndex = 0;

        for (int i = 0; i < outlineEdgeCount; i++)
        {
            int currentIndex = i;
            int nextIndex    = (i + 1) % outlineEdgeCount;

            Edge current = edgesA[currentIndex];
            Edge next    = edgesA[nextIndex];

            //Set point
            outlinePoints[i] = current.point0.position;

            //Set edge
            outlineEdges[i * 2 + 0] = currentIndex;

            if (current.point1 == next.point0)
            {
                outlineEdges[i * 2 + 1] = nextIndex;
            }
            else
            {
                outlineEdges[i * 2 + 1] = startIndex;
                startIndex = nextIndex;
            }
        }

        //Triangulate
        Triangulation triangulator = new Triangulation(outlinePoints, outlineEdges, normalPlane);

        List <int[]> newData = triangulator.Fill();

        int[] newEdges         = newData[0];
        int[] newTriangles     = newData[1];
        int[] newTriangleEdges = newData[2];

        //Calculate vertex properties
        Vector3 normalA = -normalPlane;
        Vector3 normalB = normalPlane;

        Vector4[] tangentsA, tangentsB;

        //Create new vertices
        int[] verticesA = new int[outlineEdgeCount];
        int[] verticesB = new int[outlineEdgeCount];

        ////////////////////////
        List <Vector4[]> newTans = assignTangents(normalPlane);

        tangentsA = newTans[0];
        tangentsB = newTans[1];
        ////////////////////////

        for (int i = 0; i < outlineEdgeCount; i++)
        {
            if (i >= tangentsA.Length || i >= tangentsB.Length)
            {
                continue;
            }
            verticesA[i] = a.AddVertex(outlinePoints[i], normalA, tangentsA[i], edgesA[i].point0);
            verticesB[i] = b.AddVertex(outlinePoints[i], normalB, tangentsB[i], edgesB[i].point0);
        }

        //Create new edges
        for (int i = 0; i < newEdges.Length / 2; i++)
        {
            int point0 = newEdges[i * 2 + 0];
            int point1 = newEdges[i * 2 + 1];

            Edge edgeA = new Edge(edgesA[point0].point0, edgesA[point1].point0);
            Edge edgeB = new Edge(edgesB[point0].point0, edgesB[point1].point0);

            edgesA.Add(edgeA);
            edgesB.Add(edgeB);

            a.edges.Add(edgeA);
            b.edges.Add(edgeB);
        }

        //Create new triangles
        for (int i = 0; i < newTriangles.Length / 3; i++)
        {
            int point0 = newTriangles[i * 3 + 0];
            int point1 = newTriangles[i * 3 + 1];
            int point2 = newTriangles[i * 3 + 2];

            int edge0 = newTriangleEdges[i * 3 + 0];
            int edge1 = newTriangleEdges[i * 3 + 1];
            int edge2 = newTriangleEdges[i * 3 + 2];

            Triangle triangleA = new Triangle(verticesA[point0], verticesA[point2], verticesA[point1], edgesA[point0].point0, edgesA[point2].point0, edgesA[point1].point0, edgesA[edge2], edgesA[edge1], edgesA[edge0]);
            Triangle triangleB = new Triangle(verticesB[point0], verticesB[point1], verticesB[point2], edgesB[point0].point0, edgesB[point1].point0, edgesB[point2].point0, edgesB[edge0], edgesB[edge1], edgesB[edge2]);

            a.triangles.Add(triangleA);
            b.triangles.Add(triangleB);
        }
    }
Esempio n. 3
0
    private void SplitTriangle(ConvexHull topConvexHull, ConvexHull bottomConvexHull, Edge topEdge0, Edge topEdge1, Edge topCutEdge, Edge bottomEdge0, Edge bottomEdge1, Edge bottomCutEdge, Edge bottomEdge2, int vertex0, int vertex1, int vertex2, float scalar0, float scalar1, int[] oldToNewVertex)
    {
        //   http://stackoverflow.com/questions/24806221/split-a-triangle-into-smaller-triangles like why.

        Vector3 n0 = normals[vertex0];
        Vector3 n1 = normals[vertex1];
        Vector3 n2 = normals[vertex2];

        Vector4 t0 = tangents[vertex0];
        Vector4 t1 = tangents[vertex1];
        Vector4 t2 = tangents[vertex2];

        //Calculate the cut vertex data by interpolating original triangle values
        Vector3 cutNormal0 = new Vector3();

        cutNormal0.x = n0.x + (n1.x - n0.x) * scalar0;
        cutNormal0.y = n0.y + (n1.y - n0.y) * scalar0;
        cutNormal0.z = n0.z + (n1.z - n0.z) * scalar0;
        cutNormal0.Normalize();

        Vector3 cutNormal1 = new Vector3();

        cutNormal1.x = n1.x + (n2.x - n1.x) * scalar1;
        cutNormal1.y = n1.y + (n2.y - n1.y) * scalar1;
        cutNormal1.z = n1.z + (n2.z - n1.z) * scalar1;
        cutNormal1.Normalize();

        Vector4 cutTangent0 = new Vector4();

        cutTangent0.x = t0.x + (t1.x - t0.x) * scalar0;
        cutTangent0.y = t0.y + (t1.y - t0.y) * scalar0;
        cutTangent0.z = t0.z + (t1.z - t0.z) * scalar0;
        cutTangent0.Normalize();
        cutTangent0.w = t0.w;

        Vector4 cutTangent1 = new Vector4();

        cutTangent1.x = t1.x + (t2.x - t1.x) * scalar1;
        cutTangent1.y = t1.y + (t2.y - t1.y) * scalar1;
        cutTangent1.z = t1.z + (t2.z - t1.z) * scalar1;
        cutTangent1.Normalize();
        cutTangent1.w = t1.w;

        // Add the cut vertices to the hulls
        int topCutVertex0, topCutVertex1;

        topCutVertex0 = topConvexHull.AddVertex(topEdge0.point0.position, cutNormal0, cutTangent0, topEdge0.point0);
        topCutVertex1 = topConvexHull.AddVertex(topEdge1.point0.position, cutNormal1, cutTangent1, topEdge1.point0);

        int bottomCutVertex0, bottomCutVertex1;

        bottomCutVertex0 = bottomConvexHull.AddVertex(bottomEdge0.point0.position, cutNormal0, cutTangent0, bottomEdge0.point0);
        bottomCutVertex1 = bottomConvexHull.AddVertex(bottomEdge1.point0.position, cutNormal1, cutTangent1, bottomEdge1.point0);

        // Create the top of the original triangle
        Triangle topTriangle = new Triangle(topCutVertex0, oldToNewVertex[vertex1], topCutVertex1, topEdge0.point0, topEdge0.point1, topEdge1.point0, topEdge0, topEdge1, topCutEdge);

        topConvexHull.triangles.Add(topTriangle);

        // Create the bottom of the original triangle
        Edge     bottomCrossEdge = new Edge(bottomEdge0.point1, bottomEdge1.point0);
        Triangle bottomTriangle0 = new Triangle(oldToNewVertex[vertex0], bottomCutVertex0, bottomCutVertex1, bottomEdge0.point1, bottomEdge0.point0, bottomEdge1.point0, bottomEdge0, bottomCutEdge, bottomCrossEdge);
        Triangle bottomTriangle1 = new Triangle(oldToNewVertex[vertex0], bottomCutVertex1, oldToNewVertex[vertex2], bottomEdge0.point1, bottomEdge1.point0, bottomEdge1.point1, bottomCrossEdge, bottomEdge1, bottomEdge2);

        bottomConvexHull.edges.Add(bottomCrossEdge);
        bottomConvexHull.triangles.Add(bottomTriangle0);
        bottomConvexHull.triangles.Add(bottomTriangle1);
    }