Example #1
0
        public static CompositeBodyTransform CrossoverArmStretchTransform(JointSide sideOfStretchedArm)
        {
            JointSide      oppositeSide;
            JointTransform stretchDirectionTransform;

            // First set the stretch direction and the opposite side (helper arm side)
            if (sideOfStretchedArm == JointSide.Left)
            {
                oppositeSide = JointSide.Right;
                stretchDirectionTransform = new SetJointDirectionTransform(1, 0, 0);
            }
            else
            {
                oppositeSide = JointSide.Left;
                stretchDirectionTransform = new SetJointDirectionTransform(-1, 0, 0);
            }

            // Get all joint types for both stretched and support arm
            JointType stretchedElbow = JointTypeHelper.GetSidedJointType(SidedJointName.Elbow, sideOfStretchedArm);
            JointType stretchedWrist = JointTypeHelper.GetSidedJointType(SidedJointName.Wrist, sideOfStretchedArm);

            JointType supportElbow = JointTypeHelper.GetSidedJointType(SidedJointName.Elbow, oppositeSide);
            JointType supportWrist = JointTypeHelper.GetSidedJointType(SidedJointName.Wrist, oppositeSide);


            // Apply the transforms in both arms
            return(new CompositeBodyTransform()
                   .Compose(stretchedElbow, stretchDirectionTransform)
                   .Compose(stretchedWrist, stretchDirectionTransform)
                   .Compose(supportElbow, new SetJointDirectionTransform(0, -1, 0))
                   .Compose(supportWrist, new SetJointDirectionTransform(0, 1, 0)));
        }
Example #2
0
        public TouchBodyRestriction(JointType jointType, JointSide handSide, double distanceThreshold = 0.2, bool dont = false)
            : base(body =>
        {
            JointType sidedHandType = JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide);

            Z3Point3D joint1Position = body.GetJointPosition(jointType);
            Z3Point3D joint2Position = body.GetJointPosition(sidedHandType);

            BoolExpr expr = joint1Position.IsNearerThan(joint2Position, distanceThreshold);
            if (dont)
            {
                expr = Z3.Context.MkNot(expr);
            }

            return(expr);
        },
                   jointType,
                   JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide))
        {
            this.JointType = jointType;
            this.HandSide  = handSide;
            if (dont)
            {
                isNegated = true;
            }
            else
            {
                isNegated = false;
            }
        }
Example #3
0
        public TouchBodyRestriction(JointType jointType, JointSide handSide, double distanceThreshold = 0.2, bool dont = false)
            : base(body =>
        {
            JointType sidedHandType = JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide);

            Z3Point3D joint1Position = body.GetJointZ3Position(jointType);
            Z3Point3D joint2Position = body.GetJointZ3Position(sidedHandType);

            BoolExpr expr = joint1Position.IsNearerThan(joint2Position, distanceThreshold);
            if (dont)
            {
                expr = Z3.Context.MkNot(expr);
            }

            return(expr);
        },
                   body =>
        {
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            var sidedHandType = JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide);

            var p1 = body.Positions[jointType];
            var p2 = body.Positions[sidedHandType];

            var distance   = Math.Max(0.00000001, p1.DistanceTo(p2));
            var percentage = Math.Min(1.0, distanceThreshold / distance);

            if (dont)
            {
                percentage = Math.Min(1.0, distance / distanceThreshold);
            }

            //Console.WriteLine("tch " + stopwatch.ElapsedTicks);
            return(percentage);
        },
                   jointType,
                   JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide))
        {
            this.JointType = jointType;
            this.HandSide  = handSide;
            if (dont)
            {
                isNegated = true;
            }
            else
            {
                isNegated = false;
            }
        }
Example #4
0
        public static JointType GetSidedJointType(SidedJointName name, JointSide side)
        {
            switch (name)
            {
            case (SidedJointName.Ankle):
                return((side == JointSide.Left) ? JointType.AnkleLeft : JointType.AnkleRight);

            case (SidedJointName.Elbow):
                return((side == JointSide.Left) ? JointType.ElbowLeft : JointType.ElbowRight);

            case (SidedJointName.Foot):
                return((side == JointSide.Left) ? JointType.FootLeft : JointType.FootRight);

            case (SidedJointName.Hand):
                return((side == JointSide.Left) ? JointType.HandLeft : JointType.HandRight);

            case (SidedJointName.HandTip):
                return((side == JointSide.Left) ? JointType.HandTipLeft : JointType.HandTipRight);

            case (SidedJointName.Hip):
                return((side == JointSide.Left) ? JointType.HipLeft : JointType.HipRight);

            case (SidedJointName.Knee):
                return((side == JointSide.Left) ? JointType.KneeLeft : JointType.KneeRight);

            case (SidedJointName.Shoulder):
                return((side == JointSide.Left) ? JointType.ShoulderLeft : JointType.ShoulderRight);

            case (SidedJointName.Thumb):
                return((side == JointSide.Left) ? JointType.ThumbLeft : JointType.ThumbRight);

            case (SidedJointName.Wrist):
                return((side == JointSide.Left) ? JointType.WristLeft : JointType.WristRight);

            default:
                throw new ArgumentException();
            }
        }
Example #5
0
 // Arm considers only the elbow and the wrist,
 // This decision is taken based on common sense that if you ask
 // the user to put his arm in a specific direction,
 // he may do it with his hand pointing another direction and
 // it would still be correct.
 public static IEnumerable<JointType> GetArm(JointSide side)
 {
     yield return GetSidedJointType(SidedJointName.Wrist, side);
     yield return GetSidedJointType(SidedJointName.Elbow, side);
 }
Example #6
0
        public static JointType GetSidedJointType(SidedJointName name, JointSide side)
        {
            switch (name)
            {
                case (SidedJointName.Ankle):
                    return (side == JointSide.Left) ? JointType.AnkleLeft : JointType.AnkleRight;
                case (SidedJointName.Elbow):
                    return (side == JointSide.Left) ? JointType.ElbowLeft : JointType.ElbowRight;
                case (SidedJointName.Foot):
                    return (side == JointSide.Left) ? JointType.FootLeft : JointType.FootRight;
                case (SidedJointName.Hand):
                    return (side == JointSide.Left) ? JointType.HandLeft : JointType.HandRight;
                case (SidedJointName.HandTip):
                    return (side == JointSide.Left) ? JointType.HandTipLeft : JointType.HandTipRight;
                case (SidedJointName.Hip):
                    return (side == JointSide.Left) ? JointType.HipLeft : JointType.HipRight;
                case (SidedJointName.Knee):
                    return (side == JointSide.Left) ? JointType.KneeLeft : JointType.KneeRight;
                case (SidedJointName.Shoulder):
                    return (side == JointSide.Left) ? JointType.ShoulderLeft : JointType.ShoulderRight;
                case (SidedJointName.Thumb):
                    return (side == JointSide.Left) ? JointType.ThumbLeft : JointType.ThumbRight;
                case (SidedJointName.Wrist):
                    return (side == JointSide.Left) ? JointType.WristLeft : JointType.WristRight;

                default:
                    throw new ArgumentException();
            }
        }
Example #7
0
 public static IEnumerable<JointType> GetLeg(JointSide side)
 {
     yield return GetSidedJointType(SidedJointName.Knee, side);
     yield return GetSidedJointType(SidedJointName.Ankle, side);
 }
Example #8
0
 internal Wrapper(JointSide side)
 {
     this.value = side;
 }
Example #9
0
        public static IEnumerable <JointType> GetLeg(JointSide side)
        {
            yield return(GetSidedJointType(SidedJointName.Knee, side));

            yield return(GetSidedJointType(SidedJointName.Ankle, side));
        }
Example #10
0
        // Arm considers only the elbow and the wrist,
        // This decision is taken based on common sense that if you ask
        // the user to put his arm in a specific direction,
        // he may do it with his hand pointing another direction and
        // it would still be correct.
        public static IEnumerable <JointType> GetArm(JointSide side)
        {
            yield return(GetSidedJointType(SidedJointName.Wrist, side));

            yield return(GetSidedJointType(SidedJointName.Elbow, side));
        }
Example #11
0
        public static BodyTransform CrossoverArmStretchTransform(JointSide sideOfStretchedArm)
        {
            JointSide oppositeSide;
            JointTransform stretchDirectionTransform;

            // First set the stretch direction and the opposite side (helper arm side)
            if (sideOfStretchedArm == JointSide.Left)
            {
                oppositeSide = JointSide.Right;
                stretchDirectionTransform = new SetJointDirectionTransform(1, 0, 0);
            }
            else
            {
                oppositeSide = JointSide.Left;
                stretchDirectionTransform = new SetJointDirectionTransform(-1, 0, 0);
            }

            // Get all joint types for both stretched and support arm
            JointType stretchedElbow = JointTypeHelper.GetSidedJointType(SidedJointName.Elbow, sideOfStretchedArm);
            JointType stretchedWrist = JointTypeHelper.GetSidedJointType(SidedJointName.Wrist, sideOfStretchedArm);

            JointType supportElbow = JointTypeHelper.GetSidedJointType(SidedJointName.Elbow, oppositeSide);
            JointType supportWrist = JointTypeHelper.GetSidedJointType(SidedJointName.Wrist, oppositeSide);

            // Apply the transforms in both arms
            return new BodyTransform()
                .Compose(stretchedElbow, stretchDirectionTransform)
                .Compose(stretchedWrist, stretchDirectionTransform)
                .Compose(supportElbow, new SetJointDirectionTransform(0, -1, 0))
                .Compose(supportWrist, new SetJointDirectionTransform(0, 1, 0));
        }
Example #12
0
        public TouchBodyRestriction(JointType jointType, JointSide handSide, double distanceThreshold = 0.2, bool dont = false)
            : base(body =>
            {
                JointType sidedHandType = JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide);

                Z3Point3D joint1Position = body.GetJointZ3Position(jointType);
                Z3Point3D joint2Position = body.GetJointZ3Position(sidedHandType);

                BoolExpr expr = joint1Position.IsNearerThan(joint2Position, distanceThreshold);
                if (dont)
                {
                    expr = Z3.Context.MkNot(expr);
                }

                return expr;
            },
            body =>
            {
                var stopwatch = new Stopwatch();
                stopwatch.Start();
                var sidedHandType = JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide);

                var p1 = body.Positions[jointType];
                var p2 = body.Positions[sidedHandType];

                var distance = Math.Max(0.00000001, p1.DistanceTo(p2));
                var percentage = Math.Min(1.0, distanceThreshold / distance);

                if (dont)
                    percentage = Math.Min(1.0, distance / distanceThreshold);

                //Console.WriteLine("tch " + stopwatch.ElapsedTicks);
                return percentage;
            },
            jointType,
            JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide))
        {
            this.JointType = jointType;
            this.HandSide = handSide;
            if (dont)
            {
                isNegated = true;
            }
            else
            {
                isNegated = false;
            }
        }
Example #13
0
        public TouchBodyRestriction(JointType jointType, JointSide handSide, double distanceThreshold = 0.2, bool dont = false)
            : base(body =>
            {
                JointType sidedHandType = JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide);

                Z3Point3D joint1Position = body.GetJointPosition(jointType);
                Z3Point3D joint2Position = body.GetJointPosition(sidedHandType);

                BoolExpr expr = joint1Position.IsNearerThan(joint2Position, distanceThreshold);
                if (dont)
                {
                    expr = Z3.Context.MkNot(expr);
                }

                return expr;
            },
            jointType,
            JointTypeHelper.GetSidedJointType(SidedJointName.Hand, handSide))
        {
            this.JointType = jointType;
            this.HandSide = handSide;
            if (dont)
            {
                isNegated = true;
            }
            else
            {
                isNegated = false;
            }
        }