protected void DiscontinuityConstraint(int vertI, int vertJ, List <int> faceList) { foreach (var faceId in faceList) { var orig = new MxVector3(model.Vertex(vertI)); var dest = new MxVector3(model.Vertex(vertJ)); var edge = dest - orig; var nml = new[] { 0.0, 0.0, 0.0 }; model.ComputeFaceNormal(faceId, ref nml); var n = new MxVector3(nml); var n2 = edge ^ n; MxVector3.Unitize(ref n2); var quad = new MxQuadric3(n2, -(n2 * orig)); quad *= BoundaryWeight; if (WeightingPolicy == MxWeighting.Area || WeightingPolicy == MxWeighting.AreaAverage) { quad.Area = MxVector3.Norm(edge); quad *= quad.Area; } quadrics[vertI] += quad; quadrics[vertJ] += quad; } }
internal static MxVector3 TriangleNormal(MxVector3 v1, MxVector3 v2, MxVector3 v3) { var n = TriangleRawNormal(v1, v2, v3); MxVector3.Unitize(ref n); return(n); }
internal static MxMatrix4 LookAtMatrix(MxVector3 from, MxVector3 at, MxVector3 up) { var vUp = new MxVector3(up[0], up[1], up[2]); MxVector3.Unitize(ref vUp); var f = at - from; MxVector3.Unitize(ref f); var s = f ^ vUp; MxVector3.Unitize(ref s); var u = s ^ f; MxVector3.Unitize(ref u); var mat = new MxMatrix4(new MxVector4(s, 0.0), new MxVector4(u, 0.0), new MxVector4(-f, 0.0), new MxVector4(0.0, 0.0, 0.0, 1.0)); return(mat * TranslationMatrix(-from)); }