Beispiel #1
0
        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);
        }