2016-10-17 18 views
0

私は、プレイヤーが近づくと消える単純なドアを実装しようとしています。問題は、ベアリングが世界から取り除かれた後でも、ドアがまだプレーヤーをブロックしているということです。すべてのフレームでBullet Physicsで世界から取り除いた後でもリジッドボディが衝突しています

、私は次のようにします。

  1. プレーヤーと配置されたセンサのオブジェクト間の衝突があった場合、すべての衝突

  2. を通じてシミュレーション

  3. 反復ティックドアの近くで、この方法を使用してドアを取り外します。

    self.dynamicsWorld->removeCollisionObject(object.collisionBody);

奇妙なことは、シーン内の発射物を完全に取り除くことです。これは、他の身体と接触した後には削除されます。ここで

は世界が設定されている方法は次のとおりです。

btDefaultCollisionConfiguration* collisionConfiguration; 
btCollisionDispatcher* dispatcher; 
btBroadphaseInterface* overlappingPairCache; 
btSequentialImpulseConstraintSolver* solver; 
btDiscreteDynamicsWorld* dynamicsWorld; 


collisionConfiguration = new btDefaultCollisionConfiguration(); 
dispatcher = new btCollisionDispatcher(collisionConfiguration); 
overlappingPairCache = new btDbvtBroadphase(); 
solver = new btSequentialImpulseConstraintSolver; 
dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration); 
dynamicsWorld->setGravity(btVector3(0, 0, gravity)); 

そして、ここではドアが設定されている方法は次のとおりです。

float mass = 0; 
bool isDynamic = false; 

btBoxShape* shape = new btBoxShape(size); 

btTransform transform; 
transform.setIdentity(); 
btVector3 localInertia(0, 0, 0); 
if (isDynamic) { 
    shape->calculateLocalInertia(mass, localInertia); 
}else{ 
    mass = 0; 
} 
btDefaultMotionState* motionState = new btDefaultMotionState(transform); 
btRigidBody::btRigidBodyConstructionInfo cInfo(mass, motionState, shape, localInertia); 
btRigidBody* body = new btRigidBody(cInfo); 

btTransform transform; 
body->getMotionState()->getWorldTransform(transform); 
transform.setOrigin(position); 
body->getMotionState()->setWorldTransform(transform); 

self.dynamicsWorld->addRigidBody(body); 

私はすでにこのオブジェクトに非アクティブ化を無効にし、それをAAダイナミックを作る試してみました質量のないオブジェクトですが、結果は同じです。

どのように私は世界から静的オブジェクトを削除して実際に動作させるのですか?弾丸物理オブジェクトを削除する

答えて

0

、第1の運動状態および衝突形状を削除する必要があり、その後、剛体は世界から除去されなければならないとのようにそれ自体を削除:

void InceptionPhysics::deleteShape(btRigidBody* rigidBody) { 
    delete rigidBody->getMotionState(); 
    delete rigidBody->getCollisionShape(); 
    m_dynamicsWorld->removeRigidBody(rigidBody); 
    delete rigidBody; 
} 

場合あなたはしない、あなたはリークで終わる。 VLD(Visual Leak Detector)を使用してそれらを追跡することができます。

関連する問題