удалить тела после столкновения (физика пули)

У меня есть такая настройка для обнаружения столкновений:

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 *

Как мне удалить эти 2 тела из мира?

2

Решение

Разница, которая вызывает несовместимость, заключается в том, что const квалификатор const btCollisionObject*,

Я никогда не пытался удалять объекты во время столкновения или какой-либо отправки, и я сомневаюсь, что это будет работать безупречно.

Поскольку вы проводите ручные тесты контактов, вы можете попытаться удалить объект столкновения, используя const_cast оператор: bullet->bt_dynamicsWorld->removeCollisionObject(const_cast<btCollisionObject*>(colObj0Wrap->getCollisionObject())); но опять же, принудительное применение, которое может работать некорректно сейчас или после изменений в шагах симуляции.

Вместо этого я собираю «мертвых» зомби через ContactResultCallback в другом контейнере defeatedZombies для отложенного удаления из bt_dynamicsWorld а также zombies (в конце шага симуляции или ваших вложенных циклов соответственно).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]