Пример #1
0
		private static void Main(string[] args)
		{
			var collisionConfig = new DefaultCollisionConfiguration();
			var dispatcher = new CollisionDispatcher(collisionConfig);
			var pairCache = new DbvtBroadphase();
			var solver = new SequentialImpulseConstraintSolver();

			var dynamicsWorld = new DiscreteDynamicsWorld(dispatcher, pairCache, solver, collisionConfig);
			dynamicsWorld.Gravity = new Vector3(0, -10, 0);

			var groundShape = new BoxShape(new Vector3(50, 50, 50));
			var groundTransform = Matrix.CreateTranslation(0, -56, 0);

			{
				float mass = 0;
				bool isDynamic = mass != 0;
				Vector3 localInertia = Vector3.Zero;

				if (isDynamic)
					localInertia = groundShape.CalculateLocalInertia(mass);

				var motionState = new DefaultMotionState(groundTransform);
				var rbinfo = new RigidBodyConstructionInfo(mass, motionState, groundShape, localInertia);
				var body = new RigidBody(rbinfo);

				dynamicsWorld.AddRigidBody(body);
			}

			{
				var collisionShape = new SphereShape(1);
				var transform = Matrix.Identity;
				float mass = 1;
				bool isDynamic = mass != 0;
				Vector3 localInertia = Vector3.Zero;

				if (isDynamic)
					localInertia = collisionShape.CalculateLocalInertia(mass);

				transform.Translation = new Vector3(2, 10, 0);

				var motionState = new DefaultMotionState(transform);
				var rbinfo = new RigidBodyConstructionInfo(mass, motionState, collisionShape, localInertia);
				var body = new RigidBody(rbinfo);

				dynamicsWorld.AddRigidBody(body);
			}

			Console.WriteLine("Starting simulation");

			for (int i = 0; i < 100; i++)
			{
				dynamicsWorld.StepSimulation(1f / 60f, 10);

				for (int j = dynamicsWorld.GetNumCollisionObjects() - 1; j >= 0; j--)
				{
					var obj = dynamicsWorld.GetCollisionObjectArray()[j];
					var body = (RigidBody)obj;

					if (body != null && body.GetMotionState() != null)
					{
						Matrix transform = Matrix.Identity;

						body.GetMotionState().GetWorldTransform(ref transform);

						Console.WriteLine("Object@{0} Position={1}", body.GetHashCode(), transform.Translation);
					}
				}
			}

			Console.Read();
		}
Пример #2
0
		///setupRigidBody is only used internally by the constructor
		protected void SetupRigidBody(RigidBodyConstructionInfo constructionInfo)
		{
			m_internalType = CollisionObjectTypes.CO_RIGID_BODY;

			m_linearVelocity = Vector3.Zero;
			m_angularVelocity = Vector3.Zero;
			m_angularFactor = Vector3.One;
			m_linearFactor = Vector3.One;
			m_gravity = Vector3.Zero;
			m_totalForce = Vector3.Zero;
			m_totalTorque = Vector3.Zero;
			m_linearDamping = 0f;
			m_angularDamping = 0.5f;
			m_linearSleepingThreshold = constructionInfo.m_linearSleepingThreshold;
			m_angularSleepingThreshold = constructionInfo.m_angularSleepingThreshold;
			m_optionalMotionState = constructionInfo.m_motionState;
			m_contactSolverType = 0;
			m_frictionSolverType = 0;
			m_additionalDamping = constructionInfo.m_additionalDamping;
			m_additionalDampingFactor = constructionInfo.m_additionalDampingFactor;
			m_additionalLinearDampingThresholdSqr = constructionInfo.m_additionalLinearDampingThresholdSqr;
			m_additionalAngularDampingThresholdSqr = constructionInfo.m_additionalAngularDampingThresholdSqr;
			m_additionalAngularDampingFactor = constructionInfo.m_additionalAngularDampingFactor;

			if (m_optionalMotionState != null)
			{
				m_optionalMotionState.GetWorldTransform(ref m_worldTransform);
			}
			else
			{
				SetWorldTransform(ref constructionInfo.m_startWorldTransform);
			}

			m_interpolationWorldTransform = m_worldTransform;
			m_interpolationLinearVelocity = Vector3.Zero;
			m_interpolationAngularVelocity = Vector3.Zero;

			//moved to btCollisionObject
			m_friction = constructionInfo.m_friction;
			m_restitution = constructionInfo.m_restitution;

			SetCollisionShape(constructionInfo.m_collisionShape);
			m_debugBodyId = uniqueId++;

			SetMassProps(constructionInfo.m_mass, constructionInfo.m_localInertia);
			SetDamping(constructionInfo.m_linearDamping, constructionInfo.m_angularDamping);
			UpdateInertiaTensor();
			m_rigidbodyFlags = RigidBodyFlags.BT_NONE;
			m_constraintRefs = new List<TypedConstraint>();

			m_deltaLinearVelocity = Vector3.Zero;
			m_deltaAngularVelocity = Vector3.Zero;
			m_invMass = m_inverseMass * m_linearFactor;
			m_pushVelocity = Vector3.Zero;
			m_turnVelocity = Vector3.Zero;

		}
Пример #3
0
		///btRigidBody constructor using construction info
		public RigidBody(RigidBodyConstructionInfo constructionInfo)
		{
			SetupRigidBody(constructionInfo);
		}
Пример #4
0
		///btRigidBody constructor for backwards compatibility. 
		///To specify friction (etc) during rigid body construction, please use the other constructor (using btRigidBodyConstructionInfo)
		public RigidBody(float mass, IMotionState motionState, CollisionShape collisionShape, Vector3 localInertia)
		{
			RigidBodyConstructionInfo cinfo = new RigidBodyConstructionInfo(mass, motionState, collisionShape, localInertia);
			SetupRigidBody(cinfo);
		}