2012-10-21 9 views
7

Desidero rilevare quando una (sfera) tocca un altro oggetto (obiettivo) e desidero conoscere l'impulso di quel contatto.BulletPhysic: contatti forza/impulso

so tre modi per rilevare i contatti

gContactAddedCallback 

o

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 
      } 
     } 
    } 

o

Controllare la lineare e variazione di velocità angolare. (Non è chiaro se c'è stato un contatto e quale oggetto ha effettuato la modifica di velocità, è stato oggetto o di smorzamento, gravità o qualche campo di forza.


Vorrei avere le informazioni di contatto per includere i contatti impulso. Ho notato che alcuni contatto risolto in 1 frame simulazione altro take 2 frame e impulso è due volte inferiore. (Ho ottenuto il debug del codice.) Sarei perfetto per ottenere 1 notifica di contatto con impulso totale

Nessuno dei metodi che ho elencato mi danno informazioni complete per il contatto Qualche volta spara quando la palla vola vicino al bersaglio e anche se non la tocca.

Qual è il modo previsto per farlo?

Tali informazioni potrebbero essere utilizzate per riprodurre il suono di impatto o avviare un'animazione se l'energia dei contatti è elevata.

+1

pt.getAppliedImpulse() – rraallvv

+0

pt.getAppliedImpulse() - ho perso questo! aggiungi una risposta e la contrassegnerò come tale. Grazie – Max

risposta

3

Questo codice dovrebbe puntare nella direzione su 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

Mi dispiace. Non posso contrassegnarlo ha risposto. Do solo +1. Ho provato pt.getAppliedImpulse() e non funziona. Spesso ha 0 impulso totale anche quando vedo che è successo nella simulazione e le mie velocità cambiano significativamente. o numContacts è zero. – Max

Problemi correlati