У меня есть простая программа, которая порождает шары, которые можно сбросить на некоторой местности, которая работает отлично.Но попытка добавить блок приводит к экстремальному падению производительности и к блоку, который не падает.
Вот полный код кода пули
// create the physics world
auto collisionConfiguration = new btDefaultCollisionConfiguration();
auto dispatcher = new btCollisionDispatcher(collisionConfiguration);
auto broadphase = new btDbvtBroadphase();
auto solver = new btSequentialImpulseConstraintSolver;
auto dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration);
dynamicsWorld->setGravity(btVector3(0, 0, -10));
// create terrain
auto terrainIndices = std::vector<int>(terrainModel.faceData.size() / 11);
std::iota(terrainIndices.begin(), terrainIndices.end(), 0);
auto terrainVertices = terrainModel.faceData;
auto terrainMesh = new btTriangleIndexVertexArray(terrainIndices.size() / 3, terrainIndices.data(), 3 * sizeof(int), terrainVertices.size() / 11, terrainVertices.data(), 11 * sizeof(int));
auto terrainShape = new btBvhTriangleMeshShape(terrainMesh, false);
auto terrainMotionState = new btDefaultMotionState();
auto terrainBody = new btRigidBody(0.0, terrainMotionState, terrainShape);
dynamicsWorld->addRigidBody(terrainBody);
// vvvvvvvvvvvvvvvvvvv new code
// create box
auto boxShape = new btBoxShape(btVector3(0.3, 0.3, 0.3));
//auto boxShape = new btSphereShape(0.3); // this works just fine
auto boxMotionState = new btDefaultMotionState(btTransform(btMatrix3x3(), btVector3(0, 0, 5)));
auto boxBody = new btRigidBody(1.0, boxMotionState, boxShape);
dynamicsWorld->addRigidBody(boxBody);
// bind body to renderable
// ^^^^^^^^^^^^^^^^^^^
// create balls (called later on key press)
auto ballShape = new btSphereShape(0.1);
auto spawnBall = [&]() {
auto ballMotionState = new btDefaultMotionState(btTransform(btMatrix3x3(), btVector3(0, 0, 5)));
auto ballBody = new btRigidBody(1.0, ballMotionState, ballShape);
ballBody->setCcdMotionThreshold(0.1);
ballBody->setCcdSweptSphereRadius(0.2);
dynamicsWorld->addRigidBody(ballBody);
// bind body to renderable
};
while(...)
{
// process input
dynamicsWorld->stepSimulation(1.0f / 144.0f);
// render
}
Я также пытался использовать капсулу с тем же эффектом.Чтобы было ясно, проблема в том, что новый объект, кажется, не ведет себя динамически, если он представляет собой коробку или капсулу, он работает, как ожидается, если это сфера.Начальная позиция намного выше высоты ландшафта.
Любопытно, что падение производительности происходит только после того, как недавно появившиеся шары немного упали.
Это выполняется в Bullet 3 v2.87, скомпилированной из исходного кода в режиме отладки в Visual Studio 2017.