public static Matrix4x4 GetJacobi(IIntersect obj0, IIntersect obj1, Vector2 uv0, Vector2 uv1, Vector2 uvNew0, Vector2 uvNew1) { var dU0 = obj0.EvaluateDU(uv0); var dV0 = obj0.EvaluateDV(uv0); var dU1 = obj1.EvaluateDU(uv1); var dV1 = obj1.EvaluateDV(uv1); var normalT = GetTNormal(dU0, dU1, dV0, dV1); dU0 = obj0.EvaluateDU(uvNew0); dV0 = obj0.EvaluateDV(uvNew0); dU1 = -obj1.EvaluateDU(uvNew1); dV1 = -obj1.EvaluateDV(uvNew1); var dot1 = Vector3.Dot(dU0, normalT); var dot2 = Vector3.Dot(dV0, normalT); var jacobiMatrix = new Matrix4x4( dU0.X, dV0.X, dU1.X, dV1.X, dU0.Y, dV0.Y, dU1.Y, dV1.Y, dU0.Z, dV0.Z, dU1.Z, dV1.Z, dot1, dot2, 0, 0); Matrix4x4.Invert(jacobiMatrix, out Matrix4x4 inv); return(inv); }
public static Vector4 GetF(IIntersect obj0, IIntersect obj1, Vector2 uv0, Vector2 uv1, Vector2 uvNew0, Vector2 uvNew1, float alpha) { var P0 = obj0.Evaluate(uv0); var Q = obj1.Evaluate(uvNew1); var P1 = obj0.Evaluate(uvNew0); var dU0 = obj0.EvaluateDU(uv0); var dV0 = obj0.EvaluateDV(uv0); var dU1 = obj1.EvaluateDU(uv1); var dV1 = obj1.EvaluateDV(uv1); var normalT = GetTNormal(dU0, dU1, dV0, dV1); var d = alpha * 10; return(new Vector4(P1 - Q, Vector3.Dot(P1 - P0, normalT) - d)); }
private static List <Vector2> GetGradient(IIntersect obj0, IIntersect obj1, Vector2 point0, Vector2 point1) { var eval0 = obj0.Evaluate(point0); var eval1 = obj1.Evaluate(point1); var diff = eval0 - eval1; var eval0u = obj0.EvaluateDU(point0).Normalized(); var eval0v = obj0.EvaluateDV(point0).Normalized(); var eval1u = obj1.EvaluateDU(point1).Normalized(); var eval1v = obj1.EvaluateDV(point1).Normalized(); var grad0 = new Vector2(Vector3.Dot(diff, eval0u), Vector3.Dot(diff, eval0v)); var grad1 = new Vector2(Vector3.Dot(-diff, eval1u), Vector3.Dot(-diff, eval1v)); return(new List <Vector2>() { grad0, grad1 }); }