public void SolveTest()
        {
            var jacobian = new AngularLimit3DJacobian()
            {
                BFromA           = quaternion.identity,
                MotionAFromJoint = quaternion.identity,
                MotionBFromJoint = quaternion.identity
            };

            var velocityA = MotionVelocity.Zero;
            var velocityB = MotionVelocity.Zero;
            var timestep  = 1.0f;

            jacobian.Solve(ref velocityA, ref velocityB, timestep);

            Assert.AreEqual(MotionVelocity.Zero, velocityA);
            Assert.AreEqual(MotionVelocity.Zero, velocityB);
        }
        public void BuildTest()
        {
            var jacobian = new AngularLimit3DJacobian();

            var aFromConstraint = MTransform.Identity;
            var bFromConstraint = MTransform.Identity;
            var velocityA       = MotionVelocity.Zero;
            var velocityB       = MotionVelocity.Zero;
            var motionA         = MotionData.Zero;
            var motionB         = MotionData.Zero;
            var constraint      = new Constraint()
            {
                ConstrainedAxes = new bool3(true, true, true)
            };
            var tau     = 1.0f;
            var damping = 1.0f;

            jacobian.Build(aFromConstraint, bFromConstraint, velocityA, velocityB, motionA, motionB, constraint, tau, damping);

            Assert.AreEqual(0.0f, jacobian.MinAngle);
            Assert.AreEqual(0.0f, jacobian.MaxAngle);
        }