Example #1
0
    private void ApplyConstraints()
    {
        for (int i = 0; i < vertices.Count; i++)
        {
            vertices[i].NextPosition();
        }

        for (int iter = 0; iter < constraintIter; iter++)
        {
            for (int i = 0; i < vertices.Count; i++)
            {
                GhostNode a = vertices[i];
                for (int j = 0; j < a.Connection.Count; j++)
                {
                    GhostEdge e = a.Connection[j];
                    GhostNode b = e.ConnectedTo(a);

                    Vector3 delta = a.position - b.position;

                    float distance = delta.magnitude;
                    float f        = (distance - e.Length) / distance;

                    a.position -= f * 0.5f * delta;
                    b.position += f * 0.5f * delta;
                }
            }
        }
    }
Example #2
0
 public void Connect(GhostEdge e)
 {
     Connection.Add(e);
 }
Example #3
0
    private void BuildGhost()
    {
        //Iterate through all the vertices and add them to the vertices array
        //vertice[] store GhostNode and the acutal GameObject is stored in verticesGO.
        //See my documentation for the position of each vertices.
        Transform t;

        for (int i = 0; i < numOfVertices; i++)
        {
            if (i == 5 || i == 7 || i == 9)
            {
                t = ghostBody.Find(i.ToString());
            }
            else if (i == 13)
            {
                t = ghostHead.Find("left_eye");
            }
            else if (i == 14)
            {
                t = ghostHead.Find("right_eye");
            }
            else
            {
                t = ghostHead.Find(i.ToString());
            }

            vertices.Add(new GhostNode(t.position));
            verticesGO.Add(t.gameObject);
        }

        for (int i = 0; i < numOfVertices; i++)
        {
            GhostNode a = vertices[i];

            //Basic Shape of Ghost:
            if (i < 12)
            {
                GhostNode b = vertices[i + 1];
                GhostEdge e = new GhostEdge(a, b, false);
                a.Connect(e);
                b.Connect(e);
            }

            //Additional Constraints:
            if (i == 4)
            {
                GhostNode b = vertices[0];
                GhostEdge e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 6)
            {
                GhostNode b = vertices[4];
                GhostEdge e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);

                b = vertices[8];
                e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 7)
            {
                GhostNode b = vertices[1];
                GhostEdge e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 10)
            {
                GhostNode b = vertices[8];
                GhostEdge e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);

                b = vertices[1];
                e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 11)
            {
                GhostNode b = vertices[3];
                GhostEdge e = new GhostEdge(a, b, false);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 12)
            {
                GhostNode b = vertices[0];
                GhostEdge e = new GhostEdge(a, b, false);
                a.Connect(e);
                b.Connect(e);

                b = vertices[2];
                e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 13)
            {
                GhostNode b = vertices[0];
                GhostEdge e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);

                b = vertices[12];
                e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);

                b = vertices[14];
                e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
            if (i == 14)
            {
                GhostNode b = vertices[1];
                GhostEdge e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);

                b = vertices[2];
                e = new GhostEdge(a, b, true);
                a.Connect(e);
                b.Connect(e);
            }
        }
    }