void _determinePdeToConstrainEdge(Edge edge, float weight, ref PlaneDistanceError pde) { int vi0 = edge.v[0]; int vi1 = edge.v[1]; Vector3 v0 = mesh.vertices[vi0].coords; Vector3 vEdge = mesh.vertices[vi1].coords - v0; Vector3 edgeNormal; pde.Clear(); float mag = vEdge.sqrMagnitude; for (int i = 0; i < edge.linkedFaces.Count; ++i) { edgeNormal = mesh.faces[edge.linkedFaces[i]].normal; Vector3 n = Vector3.Cross(vEdge, edgeNormal); // normal to edge and face UnityUtils.NormalizeSmallVector(ref n); float d = -Vector3.Dot(n, v0); pde2.Set(n.x, n.y, n.z, d, mag); // Multiply by face area (factor) for weighting pde2.OpMul(pde2.Factor() * weight * 0.5f); pde.OpAdd(pde2); } }
void _determinePdeForFace(int faceIndex, ref PlaneDistanceError pde) { KrablMesh.Face face = mesh.faces[faceIndex]; Vector3 n = mesh.CalculateFaceNormal(faceIndex); // Create error struct from the plane of the face (using face normal) float offset = -Vector3.Dot(n, mesh.vertices[face.v[0]].coords); pde.Set(n.x, n.y, n.z, offset, mesh.CalculateFaceArea(faceIndex)); // Multiply by face area (factor) for weighting pde.OpMul(pde.Factor()); }