【问题标题】:remove bodies after collision (bullet physics)碰撞后移除物体(子弹物理)
【发布时间】:2026-01-27 11:10:01
【问题描述】:

我有这样的碰撞检测设置:

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);
     }
  }

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

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

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

但这会报错:const btCollisionObject* 类型的参数与 btCollisionObject* 类型的参数不兼容

我如何从世界上移除这两个身体?

【问题讨论】:

    标签: c++ physics collision bullet


    【解决方案1】:

    导致不兼容的区别在于const btCollisionObject*的const限定符。

    我从未尝试在碰撞或任何调度期间移除对象,我怀疑它是否能完美运行。

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

    相反,我会通过ContactResultCallback 在另一个容器defeatedZombies 中收集“死”僵尸,以便从bt_dynamicsWorldzombies 中延迟移除(分别在模拟步骤或嵌套循环结束时) .

    【讨论】:

    • 暂时我将使用第一个建议,因为项目截止日期是明天,它似乎工作得很好。但是,第二个更有意义。