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); } }
public static PlaneDistanceError operator +(PlaneDistanceError a, PlaneDistanceError b) { PlaneDistanceError res = new PlaneDistanceError(a); res.OpAdd(b); return(res); }