Пример #1
0
        public void Init()
        {
            #region MUNDO_FISICO //Creamos el mundo fisico por defecto.
            collisionConfiguration = new DefaultCollisionConfiguration();
            dispatcher             = new CollisionDispatcher(collisionConfiguration);

            GImpactCollisionAlgorithm.RegisterAlgorithm(dispatcher);
            constraintSolver     = new SequentialImpulseConstraintSolver();
            overlappingPairCache = new DbvtBroadphase();
            dynamicsWorld        = new DiscreteDynamicsWorld(dispatcher, overlappingPairCache, constraintSolver, collisionConfiguration)
            {
                Gravity = new TGCVector3(0, -20f, 0).ToBsVector
            };
            #endregion

            var texture = TgcTexture.createTexture(D3DDevice.Instance.Device, GameModel.mediaDir + "texturas\\terrain\\NormalMapMar.png");
            //Creamos shapes y bodies.

            #region PISO
            //El piso es un plano estatico se dice que si tiene masa 0 es estatico.
            var floorShape       = new StaticPlaneShape(TGCVector3.Up.ToBsVector, 0);
            var floorMotionState = new DefaultMotionState();
            var floorInfo        = new RigidBodyConstructionInfo(0, floorMotionState, floorShape);
            floorBody = new RigidBody(floorInfo);
            dynamicsWorld.AddRigidBody(floorBody);

            //Cargamos objetos de render del framework.
            var floorTexture = TgcTexture.createTexture(D3DDevice.Instance.Device, GameModel.mediaDir + "modelos\\Textures\\Canionero.jpg");
            floorMesh = new TgcPlane(new TGCVector3(0, 500, 0), new TGCVector3(400, 0f, 400), TgcPlane.Orientations.XZplane, floorTexture);
            #endregion

            #region CAJA
            //Se crea una caja de tamaño 20 con rotaciones y origien en 10,100,10 y 1kg de masa.
            var boxShape     = new BoxShape(10, 10, 10);
            var boxTransform = TGCMatrix.RotationYawPitchRoll(MathUtil.SIMD_HALF_PI, MathUtil.SIMD_QUARTER_PI, MathUtil.SIMD_2_PI).ToBsMatrix;
            boxTransform.Origin = new TGCVector3(0, 600, 0).ToBsVector;
            DefaultMotionState boxMotionState = new DefaultMotionState(boxTransform);
            //Es importante calcular la inercia caso contrario el objeto no rotara.
            var boxLocalInertia = boxShape.CalculateLocalInertia(1f);
            var boxInfo         = new RigidBodyConstructionInfo(1f, boxMotionState, boxShape, boxLocalInertia);
            boxBody = new RigidBody(boxInfo);
            dynamicsWorld.AddRigidBody(boxBody);

            //Es importante crear todos los mesh con centro en el 0,0,0 y que este coincida con el centro de masa definido caso contrario rotaria de otra forma diferente a la dada por el motor de fisica.
            boxMesh = TGCBox.fromSize(new TGCVector3(20, 20, 20), texture);

            #endregion

            #region BOLA
            //Se crea una esfera de tamaño 1 para escalarla luego (en render)
            //Crea una bola de radio 10 origen 50 de 1 kg.
            var ballShape     = new SphereShape(10);
            var ballTransform = TGCMatrix.Identity;
            ballTransform.Origin = new TGCVector3(0, 200, 0);
            var ballMotionState = new DefaultMotionState(ballTransform.ToBsMatrix);
            //Podriamos no calcular la inercia para que no rote, pero es correcto que rote tambien.
            var ballLocalInertia = ballShape.CalculateLocalInertia(1f);
            var ballInfo         = new RigidBodyConstructionInfo(1, ballMotionState, ballShape, ballLocalInertia);
            ballBody = new RigidBody(ballInfo);
            dynamicsWorld.AddRigidBody(ballBody);

            sphereMesh = new TGCSphere(1, texture.Clone(), TGCVector3.Empty);
            //Tgc no crea el vertex buffer hasta invocar a update values.
            sphereMesh.updateValues();

            #endregion

            callback = new MyContactResultCallback(dispatcher, dynamicsWorld, floorBody);// boxBody);
        }
Пример #2
0
 public void AddContactPairTest(RigidBody firstBody, RigidBody secondBody, ContactResultCallback callback) =>
 dynamicsWorld.ContactPairTest(firstBody, secondBody, callback);
Пример #3
0
	    ///contactTest performs a discrete collision test between colObj against all objects in the btCollisionWorld, and calls the resultCallback.
	    ///it reports one or more contact points for every overlapping object (including the one with deepest penetration)
	    void	contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback);
Пример #4
0
	    ///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected.
	    ///it reports one or more contact points (including the one with deepest penetration)
	    void	contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback);
Пример #5
0
		///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected.
		///it reports one or more contact points (including the one with deepest penetration)
		void contactPairTest( btCollisionObject colObjA, btCollisionObject colObjB, ContactResultCallback resultCallback )
		{
			btCollisionObjectWrapper obA = BulletGlobals.CollisionObjectWrapperPool.Get();
			obA.Initialize( null, colObjA.getCollisionShape(), colObjA, -1, -1 );
			btCollisionObjectWrapper obB = BulletGlobals.CollisionObjectWrapperPool.Get();
			obB.Initialize( null, colObjB.getCollisionShape(), colObjB, -1, -1 );

			btCollisionAlgorithm algorithm = m_dispatcher1.findAlgorithm( obA, obB, null );
			if( algorithm != null )
			{
				btBridgedManifoldResult contactPointResult = BulletGlobals.BridgedManifoldResultPool.Get();
				contactPointResult.Initialize( obA, obB, resultCallback );
				//discrete collision detection query
				algorithm.processCollision( obA, ref obA.m_collisionObject.m_worldTransform
					, obB, ref obB.m_collisionObject.m_worldTransform
					, getDispatchInfo(), contactPointResult );

				//algorithm.~btCollisionAlgorithm();
				m_dispatcher1.freeCollisionAlgorithm( algorithm );
				BulletGlobals.BridgedManifoldResultPool.Free( contactPointResult );
			}
			BulletGlobals.CollisionObjectWrapperPool.Free( obA );
			BulletGlobals.CollisionObjectWrapperPool.Free( obB );
		}
Пример #6
0
		///contactTest performs a discrete collision test against all objects in the btCollisionWorld, and calls the resultCallback.
		///it reports one or more contact points for every overlapping object (including the one with deepest penetration)
		void contactTest( btCollisionObject colObj, ContactResultCallback resultCallback )
		{
			btVector3 aabbMin, aabbMax;
			colObj.getCollisionShape().getAabb( ref colObj.m_worldTransform, out aabbMin, out aabbMax );
			btSingleContactCallback contactCB = new btSingleContactCallback( colObj, this, resultCallback );

			m_broadphasePairCache.aabbTest( ref aabbMin, ref aabbMax, contactCB );
		}
Пример #7
0
			internal btSingleContactCallback( btCollisionObject collisionObject, btCollisionWorld world, ContactResultCallback resultCallback )
			{
				m_collisionObject = ( collisionObject );
				m_world = ( world );
				m_resultCallback = ( resultCallback );
			}
Пример #8
0
			internal void Initialize( btCollisionObjectWrapper obj0Wrap, btCollisionObjectWrapper obj1Wrap, ContactResultCallback resultCallback )
			{
				base.Initialize( obj0Wrap, obj1Wrap );
				m_resultCallback = ( resultCallback );
			}
Пример #9
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(ContactResultCallback obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }