2012-10-21 4 views
7

Je souhaite détecter quand une (balle) touche un autre objet (cible) et je souhaite connaître l'impulsion de ce contact.BulletPhysic: contacts force/impulsion

Je sais trois façons de détecter les contacts

gContactAddedCallback 

ou

int numManifolds = m_dynamicsWorld->getDispatcher()->getNumManifolds(); 
    for (int i=0;i<numManifolds;i++) 
    { 
     btRigidBody* obA = static_cast<btRigidBody*>(contactManifold->getBody0()); 
     btRigidBody* obB = static_cast<btRigidBody*>(contactManifold->getBody1()); 
     // May be there is contact obA and obB 

     btPersistentManifold* contactManifold = m_dynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i); 
     int numContacts = contactManifold->getNumContacts(); 
     for (int j=0;j<numContacts;j++) 
     { 
      btManifoldPoint& pt = contactManifold->getContactPoint(j); 
      if (pt.getDistance()<0.f) 
      { 
       // One contact point is inside of another object 
       // But some contacts are ignored 
      } 
     } 
    } 

ou

Vérifiez linéaire et le changement de vitesse angulaire. (Pas clair s'il y avait un contact et quel objet fait le changement de vitesse, est-ce objet ou d'amortissement, la gravité ou d'un champ de force.


Je souhaite avoir des informations de contact pour inclure l'impulsion de contacts. J'ai remarqué que certains contact résolu dans une simulation de trame autre prendre 2 images et l'impulsion est deux fois plus faible (je l'ai eu le code de débogage.) Je serais parfait pour obtenir 1 notification de contact avec l'impulsion totale

Aucune des méthodes que j'ai énumérées ne me donne information complète pour le contact Il se déclenche quand la balle vole près de la cible et ne la touche même pas

Quelle est la manière anticipée de le faire? Ces informations pourraient être utilisées pour jouer un son d'impact ou démarrer une animation si l'énergie des contacts est élevée.

+1

pt.getAppliedImpulse() – rraallvv

+0

pt.getAppliedImpulse() - J'ai raté celui-ci! ajouter une réponse et je vais le marquer comme tel. Merci – Max

Répondre

3

Ce code doit vous indiquer sur la direction es posible

// some global constants needed 

enum collisiontypes { 
    NOTHING   = 0, // things that don't collide 
    BALL_BODY  = 1<<2, // is ball 
    TARGET_BODY  = 1<<3 // is target 
}; 

int ballBodyCollidesWith = TARGET_BODY | BALL_BODY; // balls collide with targets and other balls 
int targetBodyCollidesWith = BALL_BODY; // targets collide with balls 

// ... 
// bodies creation 

dynamicsWorld->addRigidBody(ballBody, BALL_BODY, ballBodyCollidesWith); 

dynamicsWorld->addRigidBody(targetBody, TARGET_BODY, targetBodyCollidesWith); 

//... 
// find out whether a ball collides with a target 

int numManifolds = m_dynamicsWorld->getDispatcher()->getNumManifolds(); 
for (int i=0;i<numManifolds;i++) 
{ 
    btRigidBody* obA = static_cast<btRigidBody*>(contactManifold->getBody0()); 
    btRigidBody* obB = static_cast<btRigidBody*>(contactManifold->getBody1()); 
    // May be there is contact obA and obB 

    // ignore bodies that are not balls or targets 
    if (
     (!(obA->getCollisionFlags() | BALL_TYPE) && !(obB->getCollisionFlags() | BALL_TYPE)) // there is no BALL_TYPE colliding 
     || 
     (!(obA->getCollisionFlags() | TARGET_TYPE) && !(obB->getCollisionFlags() | TARGET_TYPE)) // there is no TARGET_TYPE colliding 
     ) 
     continue; // no more searching needed 

    btPersistentManifold* contactManifold = m_dynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i); 
    int numContacts = contactManifold->getNumContacts(); 
    for (int j=0;j<numContacts;j++) 
    { 
     btManifoldPoint& pt = contactManifold->getContactPoint(j); 

     printf("%f\n", pt.getAppliedImpulse()); // log to see the variation range of getAppliedImpulse and to chose the appropriate impulseThreshold 
     if (pt.getAppliedImpulse() > impulseThreshold) 
     { 
       // increase score or something 
       break; // no more searching needed 
     } 
    } 
} 

+2

Je suis désolé. Je ne peux pas marquer cela a répondu. Je donne seulement +1. J'ai testé pt.getAppliedImpulse() et cela ne fonctionne pas. Il y a souvent 0 impulsion totale même quand je vois que cela s'est passé en simulation et que mes vitesses changent de manière significative. ou numContacts est zéro. – Max

Questions connexes