碰撞后移除物体(子弹物理学)

时间:2013-12-07 13:45:28

标签: c++ physics collision bullet

我有一个这样的设置用于碰撞检测:

struct ZombieBulletCallback : public btCollisionWorld::ContactResultCallback
  {
     ZombieBulletCallback(BulletStuff* ptr) : bullet(ptr) {}

     btScalar addSingleResult(btManifoldPoint& cp,
     const btCollisionObjectWrapper* colObj0Wrap,
     int partId0,
     int index0,
     const btCollisionObjectWrapper* colObj1Wrap,
     int partId1,
     int index1)
     {
        // your callback code here
        char strr[256];
        sprintf_s(strr, "zombie-bullet collision \n");
        OutputDebugString(strr);

        // increment points
        bullet->currentPoints += 10;

        // increase the kill counter
        bullet->killCounter += 1;

        // TODO remove bodies

        return 1.f;
     }

     BulletStuff* bullet;
  };

  ZombieBulletCallback zombieBulletCollision(this);

  for (int i = 0; i < zombies.size(); i++) {
     for (int j = 0; j < bullets.size(); j++) {
         bt_dynamicsWorld->contactPairTest(zombies[i], bullets[j], zombieBulletCollision);
     }
  }

我想在检测到碰撞后删除尸体。

struct可以访问colObj0Wrap和colObj1Wrap(类型const btCollisionObjectWrapper *),我认为它是碰撞的2个实体。 我试过这个:

bullet->bt_dynamicsWorld->removeCollisionObject(colObj0Wrap->getCollisionObject());

但这会产生错误:类型为const btCollisionObject *的参数与类型为btCollisionObject *的参数不兼容

如何从世界上移除这两具尸体?

1 个答案:

答案 0 :(得分:4)

导致不兼容的差异是const btCollisionObject*的const限定符。

我从未试图在碰撞或任何调度过程中移除物体,我怀疑它会完美无缺地工作。

由于您正在进行手动接触测试,因此您可以尝试使用const_cast运算符删除碰撞对象:bullet->bt_dynamicsWorld->removeCollisionObject(const_cast<btCollisionObject*>(colObj0Wrap->getCollisionObject()));但是再次强制执行可能无法正常运行,或者在更改之后模拟步骤。

相反,我会通过另一个容器ContactResultCallback中的defeatedZombies收集'死'僵尸,以便从bt_dynamicsWorldzombies延迟删除(在模拟步骤结束时)或者你的嵌套循环。)