2013-05-27 2 views
0

Quelle est la bonne façon de retirer un corps rigide, je fais tout cela pour la supprimer:Retrait d'un corps rigide, mais toujours obtenir des collisions pour elle

void removeRigidBody(btDynamicsWorld* pDynamicsWorld, btRigidBody* rb) 
{ 
    pDynamicsWorld->removeRigidBody(rb); 
    delete rb->getMotionState(); 
    delete rb; 
} 

Cependant, l'objet apparaît toujours dans pDynamicsWorld->getCollisionObjectArray() après Je fais un pDynamicsWorld->stepSimulation

Assez étrangement cela ne se produit pas sur ARM, juste x86.

+0

Pourrait être un bug, avez-vous posé cette question sur les forums officiels? – zeller

+0

@zeller Je n'ai pas, donc c'est la bonne méthode autant que vous le savez? – weston

+0

@zeller J'ai demandé maintenant: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=9129 Merci – weston

Répondre

0

C'était, comme la plupart des bogues juste une erreur stupide. Désolé pour ceux qui ont pris le temps de le lire.

L'erreur était en fait dans certains java qui appelaient removeRigidBody par jni.

if (body.id > 0) { 

Le id est en fait un casting int de l'adresse btRigidBody, donc bien sûr tout entier != 0 pourrait être une adresse valide. Sur le x86, les adresses se sont avérées être < 0 qui, sur l'autre appareil, se trouvait être> 0.

+1

Donc, c'était vraiment un bug. Juste pas dans la balle mais dans votre code :) – zeller

1

En fait, c'est ce que j'ai trouvé. La publication du code dans les commentaires aurait l'air horrible, c'est pourquoi la réponse à la place.

 //remove the rigidbodies from the dynamics world and delete them 
    int i; 
    for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) 
    { 
      btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; 
      m_dynamicsWorld->removeCollisionObject(obj); 
      delete obj; 
    } 

Vous supprimez ainsi le corps des objets de collision.

+0

Merci, je l'ai essayé, mais 'removeRigidBody' appelle' removeCollisionObject' de toute façon (dans 'btDiscreteDynamicsWorld'), donc ça ne fait aucune différence. – weston

+0

J'ai demandé à quelqu'un sur notre forum local gamedev qui utilise bullet v281 et il a dit que ce n'était clairement pas un comportement normal. Bien que ce soit aussi loin que je peux aider, j'espère que vous obtiendrez votre réponse aux forums de balle. – zeller

+0

merci pour votre effort, c'était un bug stupide, s'il vous plaît voir ma réponse pour plus de détails. – weston

Questions connexes