Ejemplo n.º 1
0
    public PassiveRagdollSample(Microsoft.Xna.Framework.Game game)
      : base(game)
    {
      GraphicsScreen.DrawReticle = true;

      // Add game objects which allow to shoot balls and grab rigid bodies.
      _ballShooterObject = new BallShooterObject(Services) { Speed = 10 };
      GameObjectService.Objects.Add(_ballShooterObject);
      _grabObject = new GrabObject(Services);
      GameObjectService.Objects.Add(_grabObject);

      var modelNode = ContentManager.Load<ModelNode>("Dude/Dude");
      _meshNode = modelNode.GetSubtree().OfType<MeshNode>().First().Clone();
      _meshNode.PoseLocal = new Pose(new Vector3F(0, 0, 0));
      SampleHelper.EnablePerPixelLighting(_meshNode);
      GraphicsScreen.Scene.Children.Add(_meshNode);

      // Create a ragdoll for the Dude model.
      _ragdoll = new Ragdoll();
      DudeRagdollCreator.Create(_meshNode.SkeletonPose, _ragdoll, Simulation, 0.571f);

      // Set the world space pose of the whole ragdoll. And copy the bone poses of the
      // current skeleton pose.
      _ragdoll.Pose = _meshNode.PoseWorld;
      _ragdoll.UpdateBodiesFromSkeleton(_meshNode.SkeletonPose);

      // Uncomment to disable dynamic movement (for debugging during ragdoll creation):
      //foreach (var body in _ragdoll.Bodies)
      //  if (body != null)
      //    body.MotionType = MotionType.Kinematic;

      // In this sample we use a passive ragdoll where we need joints to hold the
      // limbs together and limits to restrict angular movement.
      _ragdoll.EnableJoints();
      _ragdoll.EnableLimits();

      // Set all motors to constraint motors that only use damping. This adds a damping
      // effect to all ragdoll limbs.
      foreach (RagdollMotor motor in _ragdoll.Motors)
      {
        if (motor != null)
        {
          motor.Mode = RagdollMotorMode.Constraint;
          motor.ConstraintDamping = 5;
          motor.ConstraintSpring = 0;
        }
      }
      _ragdoll.EnableMotors();

      // Add rigid bodies and the constraints of the ragdoll to the simulation.
      _ragdoll.AddToSimulation(Simulation);

      // Add a rigid body.
      var box = new RigidBody(new BoxShape(0.4f, 0.4f, 0.4f))
      {
        Name = "Box",
        Pose = new Pose(new Vector3F(0, 3, 0)),
      };
      Simulation.RigidBodies.Add(box);
    }
Ejemplo n.º 2
0
    private void InitializeModelAndRagdoll()
    {
      // Load Dude model.
      var contentManager = Services.GetInstance<ContentManager>();
      var dudeModelNode = contentManager.Load<ModelNode>("Dude/Dude");
      _meshNode = dudeModelNode.GetSubtree().OfType<MeshNode>().First().Clone();
      _meshNode.PoseLocal = new Pose(new Vector3F(0, 0, 0));
      SampleHelper.EnablePerPixelLighting(_meshNode);
      GraphicsScreen.Scene.Children.Add(_meshNode);

      // Create a ragdoll for the Dude model.
      _ragdoll = new Ragdoll();
      DudeRagdollCreator.Create(_meshNode.SkeletonPose, _ragdoll, Simulation, 0.571f);

      // Set the world space pose of the whole ragdoll. And copy the bone poses of the
      // current skeleton pose.
      _ragdoll.Pose = _meshNode.PoseWorld;
      _ragdoll.UpdateBodiesFromSkeleton(_meshNode.SkeletonPose);

      // Disable sleeping.
      foreach (var body in _ragdoll.Bodies)
      {
        if (body != null)
        {
          body.CanSleep = false;
          //body.CollisionResponseEnabled = false;
        }
      }

      // The pelvis bone (index 1) is updated directly from the Kinect hip center.
      _ragdoll.Bodies[1].MotionType = MotionType.Kinematic;

      // In this sample we use a passive ragdoll where we need joints to hold the
      // limbs together and limits to restrict angular movement.
      _ragdoll.EnableJoints();
      _ragdoll.EnableLimits();

      // Set all motors to constraint motors that only use damping. This adds a damping
      // effect to all ragdoll limbs.
      foreach (RagdollMotor motor in _ragdoll.Motors)
      {
        if (motor != null)
        {
          motor.Mode = RagdollMotorMode.Constraint;
          motor.ConstraintDamping = 100;
          motor.ConstraintSpring = 0;
        }
      }
      _ragdoll.EnableMotors();

      // Add rigid bodies and the constraints of the ragdoll to the simulation.
      _ragdoll.AddToSimulation(Simulation);
    }
        private void InitializeModel()
        {
            // Load dude model including the skeleton.
              _model = Game.Content.Load<Model>("Dude");
              var additionalData = (Dictionary<string, object>)_model.Tag;
              var ragdollSkeleton = (DRSkeleton)additionalData["Skeleton"];
              _skeletonPose = SkeletonPose.Create(ragdollSkeleton);

              // Create a ragdoll for the Dude model.
              _ragdoll = new Ragdoll();
              DudeRagdollCreator.Create(_skeletonPose, _ragdoll, Simulation, 0.57f);

              // Set the world space pose of the whole ragdoll. And copy the bone poses of the
              // current skeleton pose.
              _ragdoll.UpdateBodiesFromSkeleton(_skeletonPose);

              // Disable sleeping.
              foreach (var body in _ragdoll.Bodies)
              {
            if (body != null)
              body.CanSleep = false;
              }

              // The pelvis bone (index 1) is updated directly from the Kinect hip center.
              _ragdoll.Bodies[1].MotionType = MotionType.Kinematic;

              // In this sample we use a passive ragdoll where we need joints to hold the
              // limbs together and limits to restrict angular movement.
              _ragdoll.EnableJoints();
              _ragdoll.EnableLimits();

              // Set all motors to constraint motors that only use damping. This adds a damping
              // effect to all ragdoll limbs.
              foreach (RagdollMotor motor in _ragdoll.Motors)
              {
            if (motor != null)
            {
              motor.Mode = RagdollMotorMode.Constraint;
              motor.ConstraintDamping = 100;
              motor.ConstraintSpring = 0;
            }
              }
              _ragdoll.EnableMotors();

              // Add rigid bodies and the constraints of the ragdoll to the simulation.
              _ragdoll.AddToSimulation(Simulation);
        }
Ejemplo n.º 4
0
        protected override void LoadContent()
        {
            // Add a ground plane to the simulation.
              Simulation.RigidBodies.Add(
            new RigidBody(new PlaneShape(Vector3F.UnitY, 0))
            {
              MotionType = MotionType.Static
            });

              // Load model.
              _model = Game.Content.Load<Model>("Dude");
              var additionalData = (Dictionary<string, object>)_model.Tag;
              var skeleton = (Skeleton)additionalData["Skeleton"];

              // Create the two skeleton poses.
              _targetSkeletonPose = SkeletonPose.Create(skeleton);
              _actualSkeletonPose = SkeletonPose.Create(skeleton);

              // Animate the _targetSkeletonPose.
              var animations = (Dictionary<string, SkeletonKeyFrameAnimation>)additionalData["Animations"];
              var loopingAnimation = new AnimationClip<SkeletonPose>(animations.Values.First())
              {
            LoopBehavior = LoopBehavior.Cycle,
            Duration = TimeSpan.MaxValue,
              };
              AnimationService.StartAnimation(loopingAnimation, (IAnimatableProperty)_targetSkeletonPose);

              // Create a ragdoll for the Dude model.
              _ragdoll = new Ragdoll();
              DudeRagdollCreator.Create(_targetSkeletonPose, _ragdoll, Simulation);

              // Set the world space pose of the whole ragdoll. And copy the bone poses of the
              // current skeleton pose.
              _ragdoll.Pose = _pose;
              _ragdoll.UpdateBodiesFromSkeleton(_targetSkeletonPose);

              // In this sample we use an active ragdoll. We need joints because constraint ragdoll
              // motors only affect the body rotations.
              _ragdoll.EnableJoints();

              // We disable limits. If limits are enabled, the ragdoll could get unstable if
              // the animation tries to move a limb beyond an allowed limit. (This happens if
              // a pose in the animation violates one of our limits.)
              _ragdoll.DisableLimits();

              // Set all motors to constraint motors. Constraint motors are like springs that
              // rotate the limbs to a target position.
              foreach (RagdollMotor motor in _ragdoll.Motors)
              {
            if (motor != null)
            {
              motor.Mode = RagdollMotorMode.Constraint;
              motor.ConstraintDamping = 10000;
              motor.ConstraintSpring = 100000;
            }
              }
              _ragdoll.EnableMotors();

              // Add rigid bodies and the constraints of the ragdoll to the simulation.
              _ragdoll.AddToSimulation(Simulation);

              base.LoadContent();
        }
Ejemplo n.º 5
0
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

              if (_avatarPose == null)
              {
            if (_avatarRenderer.State == AvatarRendererState.Ready)
            {
              _avatarPose = new AvatarPose(_avatarRenderer);

              // Create a ragdoll for the avatar.
              _ragdoll = Ragdoll.CreateAvatarRagdoll(_avatarPose, Simulation);

              // Set the world space pose of the whole ragdoll. And copy the bone poses of the
              // current skeleton pose.
              _ragdoll.Pose = _pose;
              _ragdoll.UpdateBodiesFromSkeleton(_avatarPose.SkeletonPose);

              // In this sample we use a passive ragdoll where we need joints to hold the
              // limbs together and limits to control the angular movement.
              _ragdoll.EnableJoints();
              _ragdoll.EnableLimits();

              // Set all motors to constraint motors that only use damping. This adds a damping
              // effect to all ragdoll limbs.
              foreach (RagdollMotor motor in _ragdoll.Motors)
              {
            if (motor != null)
            {
              motor.Mode = RagdollMotorMode.Constraint;
              motor.ConstraintDamping = 5;
              motor.ConstraintSpring = 0;
            }
              }
              _ragdoll.EnableMotors();

              // Add rigid bodies and the constraints of the ragdoll to the simulation.
              _ragdoll.AddToSimulation(Simulation);
            }
              }
        }
        protected override void LoadContent()
        {
            // Add a ground plane to the simulation.
              Simulation.RigidBodies.Add(
            new RigidBody(new PlaneShape(Vector3F.UnitY, 0))
            {
              MotionType = MotionType.Static
            });

              // Load model and start animation.
              _model = Game.Content.Load<Model>("Dude");
              var additionalData = (Dictionary<string, object>)_model.Tag;
              var skeleton = (Skeleton)additionalData["Skeleton"];
              _skeletonPose = SkeletonPose.Create(skeleton);
              var animations = (Dictionary<string, SkeletonKeyFrameAnimation>)additionalData["Animations"];
              var loopingAnimation = new AnimationClip<SkeletonPose>(animations.Values.First())
              {
            LoopBehavior = LoopBehavior.Cycle,
            Duration = TimeSpan.MaxValue,
              };
              var animationController = AnimationService.StartAnimation(loopingAnimation, (IAnimatableProperty)_skeletonPose);
              animationController.UpdateAndApply();

              // Create a ragdoll for the Dude model.
              _ragdoll = new Ragdoll();
              DudeRagdollCreator.Create(_skeletonPose, _ragdoll, Simulation);

              // Set the world space pose of the whole ragdoll. And copy the bone poses of the
              // current skeleton pose.
              _ragdoll.Pose = _pose;
              _ragdoll.UpdateBodiesFromSkeleton(_skeletonPose);

              // Set all bodies to kinematic -  they should not be affected by forces.
              foreach (var body in _ragdoll.Bodies)
              {
            if (body != null)
            {
              body.MotionType = MotionType.Kinematic;
            }
              }

              // Set all motors to velocity motors. Velocity motors change RigidBody.LinearVelocity
              // RigidBody.AngularVelocity to move the rigid bodies.
              foreach (RagdollMotor motor in _ragdoll.Motors)
              {
            if (motor != null)
            {
              motor.Mode = RagdollMotorMode.Velocity;
            }
              }
              _ragdoll.EnableMotors();

              // In this sample, we do not need joints or limits.
              _ragdoll.DisableJoints();
              _ragdoll.DisableLimits();

              // Add ragdoll rigid bodies to the simulation.
              _ragdoll.AddToSimulation(Simulation);

              base.LoadContent();
        }
Ejemplo n.º 7
0
        protected override void LoadContent()
        {
            // Add a ground plane to the simulation.
              Simulation.RigidBodies.Add(
            new RigidBody(new PlaneShape(Vector3F.UnitY, 0))
            {
              MotionType = MotionType.Static
            });

              _basicEffect = new BasicEffect(GraphicsDevice);

              _model = Game.Content.Load<Model>("Dude");
              var additionalData = (Dictionary<string, object>)_model.Tag;
              var skeleton = (Skeleton)additionalData["Skeleton"];
              _skeletonPose = SkeletonPose.Create(skeleton);

              // Create a ragdoll for the Dude model.
              _ragdoll = new Ragdoll();
              DudeRagdollCreator.Create(_skeletonPose, _ragdoll, Simulation);

              // Set the world space pose of the whole ragdoll. And copy the bone poses of the
              // current skeleton pose.
              _ragdoll.Pose = _pose;
              _ragdoll.UpdateBodiesFromSkeleton(_skeletonPose);

              // Uncomment to disable dynamic movement (for debugging during ragdoll creation):
              //foreach (var body in _ragdoll.Bodies)
              //  if (body != null)
              //    body.MotionType = MotionType.Kinematic;

              // In this sample we use a passive ragdoll where we need joints to hold the
              // limbs together and limits to restrict angular movement.
              _ragdoll.EnableJoints();
              _ragdoll.EnableLimits();

              // Set all motors to constraint motors that only use damping. This adds a damping
              // effect to all ragdoll limbs.
              foreach (RagdollMotor motor in _ragdoll.Motors)
              {
            if (motor != null)
            {
              motor.Mode = RagdollMotorMode.Constraint;
              motor.ConstraintDamping = 5;
              motor.ConstraintSpring = 0;
            }
              }
              _ragdoll.EnableMotors();

              // Add rigid bodies and the constraints of the ragdoll to the simulation.
              _ragdoll.AddToSimulation(Simulation);

              base.LoadContent();
        }
Ejemplo n.º 8
0
    public KinematicRagdollSample(Microsoft.Xna.Framework.Game game)
      : base(game)
    {
      GraphicsScreen.DrawReticle = true;

      // Add game objects which allow to shoot balls and grab rigid bodies.
      _ballShooterObject = new BallShooterObject(Services) { Speed = 10 };
      GameObjectService.Objects.Add(_ballShooterObject);
      _grabObject = new GrabObject(Services);
      GameObjectService.Objects.Add(_grabObject);

      var modelNode = ContentManager.Load<ModelNode>("Dude/Dude");
      _meshNode = modelNode.GetSubtree().OfType<MeshNode>().First().Clone();
      _meshNode.PoseLocal = new Pose(new Vector3F(0, 0, 0), Matrix33F.CreateRotationY(ConstantsF.Pi));
      SampleHelper.EnablePerPixelLighting(_meshNode);
      GraphicsScreen.Scene.Children.Add(_meshNode);

      var animations = _meshNode.Mesh.Animations;
      var loopingAnimation = new AnimationClip<SkeletonPose>(animations.Values.First())
      {
        LoopBehavior = LoopBehavior.Cycle,
        Duration = TimeSpan.MaxValue,
      };
      var animationController = AnimationService.StartAnimation(loopingAnimation, (IAnimatableProperty)_meshNode.SkeletonPose);
      animationController.UpdateAndApply();

      // Create a ragdoll for the Dude model.
      _ragdoll = new Ragdoll();
      DudeRagdollCreator.Create(_meshNode.SkeletonPose, _ragdoll, Simulation, 0.571f);

      // Set the world space pose of the whole ragdoll. And copy the bone poses of the
      // current skeleton pose.
      _ragdoll.Pose = _meshNode.PoseWorld;
      _ragdoll.UpdateBodiesFromSkeleton(_meshNode.SkeletonPose);

      // Set all bodies to kinematic -  they should not be affected by forces.
      foreach (var body in _ragdoll.Bodies)
      {
        if (body != null)
        {
          body.MotionType = MotionType.Kinematic;
        }
      }

      // Set all motors to velocity motors. Velocity motors change RigidBody.LinearVelocity
      // RigidBody.AngularVelocity to move the rigid bodies. 
      foreach (RagdollMotor motor in _ragdoll.Motors)
      {
        if (motor != null)
        {
          motor.Mode = RagdollMotorMode.Velocity;
        }
      }
      _ragdoll.EnableMotors();

      // In this sample, we do not need joints or limits.
      _ragdoll.DisableJoints();
      _ragdoll.DisableLimits();

      // Add ragdoll rigid bodies to the simulation.
      _ragdoll.AddToSimulation(Simulation);

      // Add a rigid body.
      var box = new RigidBody(new BoxShape(0.4f, 0.4f, 0.4f))
      {
        Name = "Box",
        Pose = new Pose(new Vector3F(0, 3, 0)),
      };
      Simulation.RigidBodies.Add(box);
    }
Ejemplo n.º 9
0
    public ActiveRagdollSample(Microsoft.Xna.Framework.Game game)
      : base(game)
    {
      GraphicsScreen.DrawReticle = true;

      // Add game objects which allow to shoot balls and grab rigid bodies.
      _ballShooterObject = new BallShooterObject(Services) { Speed = 10 };
      GameObjectService.Objects.Add(_ballShooterObject);
      _grabObject = new GrabObject(Services);
      GameObjectService.Objects.Add(_grabObject);

      var modelNode = ContentManager.Load<ModelNode>("Dude/Dude");
      _meshNode = modelNode.GetSubtree().OfType<MeshNode>().First().Clone();
      _meshNode.PoseLocal = new Pose(new Vector3F(0, 0, 0));
      SampleHelper.EnablePerPixelLighting(_meshNode);
      GraphicsScreen.Scene.Children.Add(_meshNode);

      // Create a copy of the dude's skeleton.
      _targetSkeletonPose = SkeletonPose.Create(_meshNode.Mesh.Skeleton);

      // Animate the _targetSkeletonPose.
      var animations = _meshNode.Mesh.Animations;
      var loopingAnimation = new AnimationClip<SkeletonPose>(animations.Values.First())
      {
        LoopBehavior = LoopBehavior.Cycle,
        Duration = TimeSpan.MaxValue,
      };
      AnimationService.StartAnimation(loopingAnimation, (IAnimatableProperty)_targetSkeletonPose);

      // Create a ragdoll for the Dude model.
      _ragdoll = new Ragdoll();
      DudeRagdollCreator.Create(_targetSkeletonPose, _ragdoll, Simulation, 0.571f);

      // Set the world space pose of the whole ragdoll. And copy the bone poses of the
      // current skeleton pose.
      _ragdoll.Pose = _meshNode.PoseWorld;
      _ragdoll.UpdateBodiesFromSkeleton(_targetSkeletonPose);

      // In this sample we use an active ragdoll. We need joints because constraint ragdoll
      // motors only affect the body rotations.
      _ragdoll.EnableJoints();

      // We disable limits. If limits are enabled, the ragdoll could get unstable if 
      // the animation tries to move a limb beyond an allowed limit. (This happens if
      // a pose in the animation violates one of our limits.)
      _ragdoll.DisableLimits();

      // Set all motors to constraint motors. Constraint motors are like springs that
      // rotate the limbs to a target position.
      foreach (RagdollMotor motor in _ragdoll.Motors)
      {
        if (motor != null)
        {
          motor.Mode = RagdollMotorMode.Constraint;
          motor.ConstraintDamping = 10000;
          motor.ConstraintSpring = 100000;
        }
      }
      _ragdoll.EnableMotors();

      // Add rigid bodies and the constraints of the ragdoll to the simulation.
      _ragdoll.AddToSimulation(Simulation);

      // Add a rigid body.
      var box = new RigidBody(new BoxShape(0.4f, 0.4f, 0.4f))
      {
        Name = "Box",
        Pose = new Pose(new Vector3F(0, 3, 0)),
      };
      Simulation.RigidBodies.Add(box);
    }
Ejemplo n.º 10
0
    public override void Update(GameTime gameTime)
    {
      if (_avatarPose == null)
      {
        if (_avatarRenderer.State == AvatarRendererState.Ready)
        {
          _avatarPose = new AvatarPose(_avatarRenderer);

          // Create a ragdoll for the avatar.
          _ragdoll = Ragdoll.CreateAvatarRagdoll(_avatarPose, Simulation);

          // Set the world space pose of the whole ragdoll. And copy the bone poses of the
          // current skeleton pose.
          _ragdoll.Pose = _pose;
          _ragdoll.UpdateBodiesFromSkeleton(_avatarPose.SkeletonPose);

          // In this sample we use a passive ragdoll where we need joints to hold the
          // limbs together and limits to control the angular movement.
          _ragdoll.EnableJoints();
          _ragdoll.EnableLimits();

          // Set all motors to constraint motors that only use damping. This adds a damping
          // effect to all ragdoll limbs.
          foreach (RagdollMotor motor in _ragdoll.Motors)
          {
            if (motor != null)
            {
              motor.Mode = RagdollMotorMode.Constraint;
              motor.ConstraintDamping = 5;
              motor.ConstraintSpring = 0;
            }
          }
          _ragdoll.EnableMotors();

          // Add rigid bodies and the constraints of the ragdoll to the simulation.
          _ragdoll.AddToSimulation(Simulation);
        }
      }
      else
      {
        // Copy skeleton pose from ragdoll.
        _ragdoll.UpdateSkeletonFromBodies(_avatarPose.SkeletonPose);
      }

      // Render rigid bodies.
      _debugRenderer.Clear();
      foreach (var body in Simulation.RigidBodies)
        if (!(body.Shape is EmptyShape))  // Do not draw dummy bodies which might be used by the ragdoll.
          _debugRenderer.DrawObject(body, Color.Black, true, false);
    }