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