internal DigitalRunePointOnPlaneJoint(PointOnPlaneJointDescriptor descriptor)
        {
            WrappedPointOnPlaneJoint = new PointOnPlaneConstraint();

            #region set RigidBodies
            if (!(descriptor.RigidBodyA is RigidBody))
                throw new ArgumentException(String.Format("The type of the property 'RigidBodyA' must be '{0}'.", typeof(RigidBody)));
            WrappedPointOnPlaneJoint.BodyA = ((RigidBody)descriptor.RigidBodyA).WrappedRigidBody;
            _rigidBodyA = descriptor.RigidBodyA;

            if (!(descriptor.RigidBodyB is RigidBody))
                throw new ArgumentException("The type of the property 'RigidBodyB' must be 'System.Physics.DigitalRune.RigidBody'.");
            WrappedPointOnPlaneJoint.BodyB = ((RigidBody)descriptor.RigidBodyB).WrappedRigidBody;
            _rigidBodyB = descriptor.RigidBodyB;
            #endregion
            WrappedPointOnPlaneJoint.AnchorPositionALocal = descriptor.AnchorPositionALocal.ToDigitalRune();
            WrappedPointOnPlaneJoint.XAxisALocal = descriptor.XAxisALocal.ToDigitalRune();
            WrappedPointOnPlaneJoint.YAxisALocal = descriptor.YAxisALocal.ToDigitalRune();
            WrappedPointOnPlaneJoint.AnchorPositionBLocal = descriptor.AnchorPositionBLocal.ToDigitalRune();

            var actualMinimumX = WrappedPointOnPlaneJoint.Minimum;
            actualMinimumX[0] = descriptor.MinimumDistanceX;
            WrappedPointOnPlaneJoint.Minimum = actualMinimumX;

            var actualMaximumX = WrappedPointOnPlaneJoint.Maximum;
            actualMaximumX[0] = descriptor.MaximumDistanceX;
            WrappedPointOnPlaneJoint.Maximum = actualMaximumX;

            var actualMaximumY = WrappedPointOnPlaneJoint.Maximum;
            actualMaximumY[1] = descriptor.MaximumDistanceY;
            WrappedPointOnPlaneJoint.Maximum = actualMaximumY;

            var actualMinimumY = WrappedPointOnPlaneJoint.Minimum;
            actualMinimumY[1] = descriptor.MinimumDistanceY;
            WrappedPointOnPlaneJoint.Minimum = actualMinimumY;


            Descriptor = descriptor;
        }
示例#2
0
    public ConstraintSample2(Microsoft.Xna.Framework.Game game)
      : base(game)
    {
      // Add basic force effects.
      Simulation.ForceEffects.Add(new Gravity());
      Simulation.ForceEffects.Add(new Damping());

      // Add a ground plane.
      RigidBody groundPlane = new RigidBody(new PlaneShape(Vector3F.UnitY, 0))
      {
        Name = "GroundPlane",           // Names are not required but helpful for debugging.
        MotionType = MotionType.Static,
      };
      Simulation.RigidBodies.Add(groundPlane);

      // ----- PointOnLineConstraint
      RigidBody box0 = new RigidBody(new BoxShape(0.1f, 0.5f, 6))
      {
        Pose = new Pose(new Vector3F(-4, 3, 0)),
        MotionType = MotionType.Static,
      };
      Simulation.RigidBodies.Add(box0);
      RigidBody sphere0 = new RigidBody(new SphereShape(0.5f))
      {
        Pose = new Pose(new Vector3F(-4, 2, 0))
      };
      Simulation.RigidBodies.Add(sphere0);
      PointOnLineConstraint pointOnLineConstraint = new PointOnLineConstraint
      {
        BodyA = box0,
        // The line goes through this point:
        AnchorPositionALocal = new Vector3F(0, -0.25f, 0),
        BodyB = sphere0,
        AnchorPositionBLocal = new Vector3F(0, 0.5f, 0),
        // The line axis:
        AxisALocal = Vector3F.UnitZ,
        // The movement on the line axis:
        Minimum = -3,
        Maximum = +3,
        CollisionEnabled = false,
      };
      Simulation.Constraints.Add(pointOnLineConstraint);

      // ----- PointOnPlaneConstraint
      RigidBody box1 = new RigidBody(new BoxShape(2f, 0.5f, 6))
      {
        Pose = new Pose(new Vector3F(-1, 3, 0)),
        MotionType = MotionType.Static,
      };
      Simulation.RigidBodies.Add(box1);
      RigidBody sphere1 = new RigidBody(new SphereShape(0.5f))
      {
        Pose = new Pose(new Vector3F(-1, 2, 0))
      };
      Simulation.RigidBodies.Add(sphere1);
      PointOnPlaneConstraint pointOnPlaneConstraint = new PointOnPlaneConstraint
      {
        BodyA = box1,
        // The plane goes through this point:
        AnchorPositionALocal = new Vector3F(0, -0.25f, 0),
        BodyB = sphere1,
        AnchorPositionBLocal = new Vector3F(0, 0.5f, 0),
        // Two orthonormal vectors that define the plane:
        XAxisALocal = Vector3F.UnitX,
        YAxisALocal = Vector3F.UnitZ,
        // Limits for the x axis and y axis movement:
        Minimum = new Vector2F(-1, -3),
        Maximum = new Vector2F(1, 3),
        CollisionEnabled = false,
      };
      Simulation.Constraints.Add(pointOnPlaneConstraint);

      // ----- NoRotationConstraint
      // This constraint keeps two rotations synchronized. 
      RigidBody box2 = new RigidBody(new BoxShape(1, 1, 1))
      {
        Pose = new Pose(new Vector3F(2, 3, 0)),
      };
      Simulation.RigidBodies.Add(box2);
      RigidBody box3 = new RigidBody(new BoxShape(1, 1, 1))
      {
        Pose = new Pose(new Vector3F(2.5f, 2, 0))
      };
      Simulation.RigidBodies.Add(box3);
      NoRotationConstraint noRotationConstraint = new NoRotationConstraint
      {
        BodyA = box2,
        BodyB = box3,
        CollisionEnabled = true,
      };
      Simulation.Constraints.Add(noRotationConstraint);

      // ----- Distance limit.
      // Here, the distance of two cone tips is kept at a constant distance.
      RigidBody cone0 = new RigidBody(new ConeShape(0.5f, 1f))
      {
        Pose = new Pose(new Vector3F(4, 3, 0), Matrix33F.CreateRotationZ(ConstantsF.Pi)),
        MotionType = MotionType.Static,
      };
      Simulation.RigidBodies.Add(cone0);
      RigidBody cone1 = new RigidBody(new ConeShape(0.5f, 1f))
      {
        Pose = new Pose(new Vector3F(4, 0, 0))
      };
      Simulation.RigidBodies.Add(cone1);
      DistanceLimit distanceLimit = new DistanceLimit
      {
        BodyA = cone0,
        BodyB = cone1,
        // The attachment points are the tips of the cones.
        AnchorPositionALocal = new Vector3F(0, 1, 0),
        AnchorPositionBLocal = new Vector3F(0, 1, 0),
        // The tips should always have a distance of 0.5 units.
        MinDistance = 0.5f,
        MaxDistance = 0.5f,
      };
      Simulation.Constraints.Add(distanceLimit);
    }