碰撞后移除物体(子弹物理)
我有这样的设置用于碰撞检测:
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 *),我认为这是碰撞的两个物体。 我试过这个:
bullet->bt_dynamicsWorld->removeCollisionObject(colObj0Wrap->getCollisionObject());
但是这给出了一个错误:类型为const的参数btCollisionObject *与参数类型btCollisionObject *不兼容*
我如何从世界上移除这两个身体?
导致不兼容的区别是const btCollisionObject*
的const限定符。
在碰撞或任何调度过程中,我从未试图移除物体,我怀疑它会完美地工作。
由于您正在进行手动接触测试,因此您可以尝试使用const_cast
运算符移除碰撞对象: bullet->bt_dynamicsWorld->removeCollisionObject(const_cast<btCollisionObject*>(colObj0Wrap->getCollisionObject()));
但是再次强调,现在可能无法正常工作,或者在更改了模拟步骤之后。
相反,我会通过ContactResultCallback
在另一个容器中defeatedZombies
zombies
,从bt_dynamicsWorld
和zombies
(分别在模拟步骤结束或分别嵌套循环)中收集“死亡”僵尸。
上一篇: remove bodies after collision (bullet physics)
下一篇: Torque in Bullet