Пример #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);
            }
        }
Пример #2
0
        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());
        }