我正在嘗試將Bullet物理用於碰撞檢測。我不需要它爲我移動任何對象或使用回調來處理渲染。我只想更新每一幀的對象位置,並使用它來告訴我何時發生碰撞。爲了得到最簡單的例子,我試圖找出btBoxShape作爲其形狀的對象之間的碰撞。一切運行良好,沒有崩潰或明顯的內存泄漏,但我沒有碰撞,所以我必須在某處犯一些錯誤。我會盡可能簡短地保持這一點,而不會留下任何重要的東西。子彈物理最簡單的碰撞示例
這裏是我的世界設定功能:
collisionConfig = new btDefaultCollisionConfiguration();
dispatcher = new btCollisionDispatcher(collisionConfig);
overlappingPairCache = new btDbvtBroadphase();
solver = new btSequentialImpulseConstraintSolver;
dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,
overlappingPairCache, solver, collisionConfig);
dynamicsWorld->setGravity(btVector3(0.0f, -9.8f, 0.0f));
現在我有型btCollisionObject *的玩家和敵人的對象。我設置他們是這樣的:
mPlayerBox = new btBoxShape(btVector3(1,3,1));
mPlayerObject = new btCollisionObject();
mPlayerObject->setCollisionShape(mPlayerBox);
btTransform playerWorld;
playerWorld.setIdentity();
//playerPos is a D3DXVECTOR3 that holds the camera position.
playerWorld.setOrigin(btVector3(playerPos.x, playerPos.y, playerPos.z));
mPlayerObject->setWorldTransform(playerWorld);
mPlayerObject->forceActivationState(DISABLE_DEACTIVATION);//maybe not needed
dynamicsWorld->addCollisionObject(mPlayerObject);
我對我的敵人物體做基本相同的事情。
然後每幀更新我的是這樣的所有對象:
btTransform updatedWorld;
updatedWorld.setIdentity();
updatedWorld.setOrigin(btVector3(position.x, position.y, position.z));
mPlayerObject->setWorldTransform(updatedWorld);
//do the same for my enemies, and then...
dynamicsWorld->performDiscreteCollisionDetection();
//Also tried doing this with stepSimulation(deltaTime, 7), but nothing changed.
//stepSimulation seems to only be for letting Bullet set world Transforms?
//check collisions with player
dynamicsWorld->contactTest(mPlayerObject, resultCallback);
int numManifolds = dynamicsWorld->getDispatcher()->getNumManifolds();
if(numManifolds > 0)
{
//there's a collision, execute blah blah blah
}
最後,這裏是定義我的結果回調結構:
struct rCallBack : public btCollisionWorld::ContactResultCallback
{
btScalar rCallback::addSingleResult(btManifoldPoint& cp, const btCollisionObject*
colObj0, int partId0, int index0, const btCollisionObject* colObj1, int partId1,
int index1)
{
btVector3 ptA = cp.getPositionWorldOnA();
btVector3 ptB = cp.getPositionWorldOnB();
return 0;
}
}
我已經看了很多的演示,但他們似乎大部分都是離開運動到Bullet,並且由於我在設定的速度下移動角色時沒有任何特殊的物理碰撞,所以我無法將這些例子調整到我的應用程序中。結果回調實際上是從這個職位上的論壇傳來: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 這是關於使用三角形網格,但它似乎最接近我試圖實現。
無論如何,如果你讀到這裏,謝謝!任何建議或鏈接,你可以免費將非常感激。
「我只是想每次更新對象的位置,並用它來告訴我什麼時候發生了碰撞。」這通常與*物理*系統的工作原理是相反的。你應該嘗試使用你的物理引擎,而不是*反對*它。如果你的角色以設定的速度移動,那麼你應該真的讓你的物理系統移動它們。它可以做到這一點。 –
是的,我希望我能把這個標記爲答案。在閱讀完這些內容並進一步研究之後,我意識到我可以使用邊界卷和一些數學方法自己進行碰撞檢測。謝謝! – Aztal
什麼是輸入和輸出?例如:對於每一幀輸入=所有對象的位置+速度(每步)輸出=哪對對象在空間中的哪個點碰撞?並且您使用自定義方法手動更新位置/速度? –