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); }
public void AddContactPairTest(RigidBody firstBody, RigidBody secondBody, ContactResultCallback callback) => dynamicsWorld.ContactPairTest(firstBody, secondBody, callback);
///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);
///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);
///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 ); }
///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 ); }
internal btSingleContactCallback( btCollisionObject collisionObject, btCollisionWorld world, ContactResultCallback resultCallback ) { m_collisionObject = ( collisionObject ); m_world = ( world ); m_resultCallback = ( resultCallback ); }
internal void Initialize( btCollisionObjectWrapper obj0Wrap, btCollisionObjectWrapper obj1Wrap, ContactResultCallback resultCallback ) { base.Initialize( obj0Wrap, obj1Wrap ); m_resultCallback = ( resultCallback ); }
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); }