2013-12-07 3 views
2

У меня есть установки, как это для обнаружения столкновения:удалить тела после столкновения (физики пули)

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

, но это дает ошибку: аргумент типа сопзЬ btCollisionObject * несовместим с парами типа btCollisionObject *

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

ответ

4

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

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

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

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

+0

В настоящее время я собираюсь использовать первое предложение, поскольку срок выполнения проекта - завтра, и, похоже, он работает нормально. Однако второй имеет смысл. – b0Gd4N