Динамика пули 3 не работает для несферы - PullRequest
0 голосов
/ 10 июня 2018

У меня есть простая программа, которая порождает шары, которые можно сбросить на некоторой местности, которая работает отлично.Но попытка добавить блок приводит к экстремальному падению производительности и к блоку, который не падает.

Вот полный код кода пули

  // 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.

1 Ответ

0 голосов
/ 10 июня 2018

Ух ты, я понял это.btMatrix3x3() не создает единичную матрицу (либо нули, либо неинициализированные).Так что вращение / трансформация не были правильными.Использование btMatrix3x3::getIdentity() решило проблему.

Итак, похоже, что правильное преобразование вращения не требуется для физических расчетов на сферах (в некотором роде имеет смысл), что только добавило моей путаницы.

...