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; } } } }
public void Connect(GhostEdge e) { Connection.Add(e); }
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); } } }