/// <summary> /// Creates the constraint. /// </summary> /// <param name="type">The type.</param> /// <param name="rigidBodyA">The rigid body a.</param> /// <param name="rigidBodyB">The rigid body b.</param> /// <param name="frameA">The frame a.</param> /// <param name="frameB">The frame b.</param> /// <param name="useReferenceFrameA">if set to <c>true</c> [use reference frame a].</param> /// <returns></returns> /// <exception cref="System.Exception"> /// Cannot perform this action when the physics engine is set to CollisionsOnly /// or /// Both RigidBodies must be valid /// </exception> public static Constraint CreateConstraint(ConstraintTypes type, RigidBody rigidBodyA, RigidBody rigidBodyB, Matrix frameA, Matrix frameB, bool useReferenceFrameA = false) { if (rigidBodyA == null || rigidBodyB == null) throw new Exception("Both RigidBodies must be valid"); //todo check if the 2 rbs are on the same engine instance! var rbA = rigidBodyA.InternalRigidBody; var rbB = rigidBodyB.InternalRigidBody; switch (type) { case ConstraintTypes.Point2Point: { var constraint = new Point2PointConstraint { InternalPoint2PointConstraint = new BulletSharp.Point2PointConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalPoint2PointConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Hinge: { var constraint = new HingeConstraint { InternalHingeConstraint = new BulletSharp.HingeConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalHingeConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Slider: { var constraint = new SliderConstraint { InternalSliderConstraint = new BulletSharp.SliderConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalSliderConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.ConeTwist: { var constraint = new ConeTwistConstraint { InternalConeTwistConstraint = new BulletSharp.ConeTwistConstraint(rbA, rbB, frameA, frameB), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalConeTwistConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoF: { var constraint = new Generic6DoFConstraint { InternalGeneric6DofConstraint = new BulletSharp.Generic6DofConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoFSpring: { var constraint = new Generic6DoFSpringConstraint { InternalGeneric6DofSpringConstraint = new BulletSharp.Generic6DofSpringConstraint(rbA, rbB, frameA, frameB, useReferenceFrameA), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Gear: { var constraint = new GearConstraint { InternalGearConstraint = new BulletSharp.GearConstraint(rbA, rbB, frameA.TranslationVector, frameB.TranslationVector), RigidBodyA = rigidBodyA, RigidBodyB = rigidBodyB }; constraint.InternalConstraint = constraint.InternalGearConstraint; rigidBodyA.LinkedConstraints.Add(constraint); rigidBodyB.LinkedConstraints.Add(constraint); return constraint; } } return null; }
/// <summary> /// Creates the constraint. /// </summary> /// <param name="type">The type.</param> /// <param name="rigidBodyA">The rigid body a.</param> /// <param name="frameA">The frame a.</param> /// <param name="useReferenceFrameA">if set to <c>true</c> [use reference frame a].</param> /// <returns></returns> /// <exception cref="System.Exception"> /// Cannot perform this action when the physics engine is set to CollisionsOnly /// or /// Both RigidBodies must be valid /// or /// A Gear constraint always needs two rigidbodies to be created. /// </exception> public static Constraint CreateConstraint(ConstraintTypes type, RigidBody rigidBodyA, Matrix frameA, bool useReferenceFrameA = false) { if (rigidBodyA == null) throw new Exception("Both RigidBodies must be valid"); var rbA = rigidBodyA.InternalRigidBody; switch (type) { case ConstraintTypes.Point2Point: { var constraint = new Point2PointConstraint { InternalPoint2PointConstraint = new BulletSharp.Point2PointConstraint(rbA, frameA.TranslationVector), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalPoint2PointConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Hinge: { var constraint = new HingeConstraint { InternalHingeConstraint = new BulletSharp.HingeConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalHingeConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Slider: { var constraint = new SliderConstraint { InternalSliderConstraint = new BulletSharp.SliderConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA, }; constraint.InternalConstraint = constraint.InternalSliderConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.ConeTwist: { var constraint = new ConeTwistConstraint { InternalConeTwistConstraint = new BulletSharp.ConeTwistConstraint(rbA, frameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalConeTwistConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoF: { var constraint = new Generic6DoFConstraint { InternalGeneric6DofConstraint = new BulletSharp.Generic6DofConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Generic6DoFSpring: { var constraint = new Generic6DoFSpringConstraint { InternalGeneric6DofSpringConstraint = new BulletSharp.Generic6DofSpringConstraint(rbA, frameA, useReferenceFrameA), RigidBodyA = rigidBodyA }; constraint.InternalConstraint = constraint.InternalGeneric6DofConstraint = constraint.InternalGeneric6DofSpringConstraint; rigidBodyA.LinkedConstraints.Add(constraint); return constraint; } case ConstraintTypes.Gear: { throw new Exception("A Gear constraint always needs two rigidbodies to be created."); } } return null; }
/// <summary> /// Removes the rigid body from the engine processing pipeline. /// </summary> /// <param name="rigidBody">The rigid body.</param> /// <exception cref="System.Exception">Cannot perform this action when the physics engine is set to CollisionsOnly</exception> public void RemoveRigidBody(RigidBody rigidBody) { if (discreteDynamicsWorld == null) throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); discreteDynamicsWorld.RemoveRigidBody(rigidBody.InternalRigidBody); rigidBody.Simulation = null; }
/// <summary> /// Adds the rigid body to the engine processing pipeline. /// </summary> /// <param name="rigidBody">The rigid body.</param> /// <param name="group">The group.</param> /// <param name="mask">The mask.</param> /// <exception cref="System.Exception">Cannot perform this action when the physics engine is set to CollisionsOnly</exception> public void AddRigidBody(RigidBody rigidBody, CollisionFilterGroupFlags group, CollisionFilterGroupFlags mask) { if (discreteDynamicsWorld == null) throw new Exception("Cannot perform this action when the physics engine is set to CollisionsOnly"); discreteDynamicsWorld.AddRigidBody(rigidBody.InternalRigidBody, (short)group, (short)mask); rigidBody.Simulation = this; }
/// <summary> /// Creates the rigid body. /// </summary> /// <param name="collider">The collider.</param> /// <returns></returns> public RigidBody CreateRigidBody(ColliderShape collider) { var rb = new RigidBody(collider); rb.InternalRigidBody = new BulletSharp.RigidBody(0.0f, rb.MotionState, collider.InternalShape, Vector3.Zero) { UserObject = rb }; rb.InternalCollider = rb.InternalRigidBody; rb.InternalCollider.ContactProcessingThreshold = !canCcd ? 1e18f : 1e30f; if (collider.NeedsCustomCollisionCallback) { rb.InternalCollider.CollisionFlags |= BulletSharp.CollisionFlags.CustomMaterialCallback; } if (collider.Is2D) //set different defaults for 2D shapes { rb.InternalRigidBody.LinearFactor = new Vector3(1.0f, 1.0f, 0.0f); rb.InternalRigidBody.AngularFactor = new Vector3(0.0f, 0.0f, 1.0f); } return rb; }
public XenkoMotionState(RigidBody rb) { rigidBody = rb; }