Tôi đang cố gắng sử dụng Bullet Physics để chỉ phát hiện va chạm. Tôi không cần nó để di chuyển bất kỳ đối tượng cho tôi hoặc xử lý rendering với callbacks. Tôi chỉ muốn cập nhật vị trí đối tượng mỗi khung hình và sử dụng nó để cho tôi biết khi nào tôi có xung đột. Để có được ví dụ đơn giản nhất, tôi đang cố gắng tìm va chạm giữa các đối tượng với btBoxShape làm hình dạng của chúng. Mọi thứ đều chạy tốt mà không có sự cố hoặc rò rỉ bộ nhớ rõ ràng, nhưng tôi không bị va chạm vì vậy tôi phải phạm một số sai lầm ở đâu đó. Tôi sẽ cố gắng giữ nó ngắn gọn như tôi có thể mà không để lại bất cứ điều gì quan trọng.Đạn Vật lý Ví dụ Va chạm Đơn giản
Dưới đây là chức năng thiết lập thế giới của tôi:
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));
Ngay bây giờ tôi có người chơi và kẻ thù đối tượng của loại btCollisionObject *. Tôi đang thiết lập chúng như sau:
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);
Tôi thực chất là điều tương tự với đối tượng kẻ thù của mình.
Sau đó mỗi khung để cập nhật tất cả các đối tượng của tôi với một cái gì đó như thế này:
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
}
Và cuối cùng, đây là cấu trúc xác định kết quả callback của tôi:
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;
}
}
tôi đã xem xét rất nhiều các bản trình diễn, nhưng dường như họ rời khỏi phong trào lên Bullet, và vì tôi đang di chuyển các nhân vật với tốc độ cài đặt mà không có bất kỳ vật lý đặc biệt nào khi chúng va chạm, tôi gặp rắc rối khi thích ứng với các ví dụ trong ứng dụng của mình. Kết quả gọi lại thực sự đến từ bài đăng này trên diễn đàn: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6816 Đó là về việc sử dụng lưới hình tam giác, nhưng dường như gần nhất với những gì tôi đã cố gắng triển khai.
Dù sao, nếu bạn đọc bài này đến nay, cảm ơn bạn !! Bất kỳ lời khuyên hoặc liên kết bạn có thể phụ tùng sẽ được rất nhiều đánh giá cao.
"Tôi chỉ muốn cập nhật vị trí đối tượng mỗi khung hình và sử dụng nó để cho tôi biết khi nào tôi có xung đột." Điều đó nói chung là không hợp lý về cách một hệ thống * vật lý * hoạt động. Bạn nên cố gắng làm việc với công cụ vật lý của mình, chứ không phải * chống lại nó. Nếu bạn có các ký tự di chuyển với tốc độ đã đặt, thì bạn nên thực sự để hệ thống vật lý của bạn di chuyển chúng. Nó có thể làm điều đó tốt. –
vâng, tôi ước tôi có thể gắn thẻ câu trả lời này là câu trả lời. Sau khi đọc điều này và nhìn vào nó một số chi tiết, tôi nhận ra rằng tôi chỉ có thể tự mình phát hiện va chạm bằng cách sử dụng khối lượng giới hạn và một số phép toán. Cảm ơn! – Aztal
Đầu vào và đầu ra là gì? Ví dụ: cho mỗi khung Input = position + speed (mỗi bước) của tất cả các đối tượng Output = cặp đối tượng nào va chạm vào điểm nào trong không gian? Và bạn cập nhật vị trí/tốc độ theo cách thủ công bằng phương pháp tùy chỉnh? –