2012-10-21 30 views
7

Tôi muốn phát hiện khi một (bóng) chạm vào một đối tượng khác (mục tiêu) và tôi muốn biết xung của liên hệ đó.BulletPhysic: lực liên lạc/xung

Tôi biết ba cách để phát hiện địa chỉ liên lạc

gContactAddedCallback 

hoặc

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

hoặc

Kiểm tra tuyến tính và thay đổi vận tốc góc. (Không rõ liệu có sự tiếp xúc và những gì đối tượng thực hiện thay đổi tốc độ, là nó phản đối hoặc giảm xóc, lực hấp dẫn hoặc một số lĩnh vực có hiệu lực.


Tôi muốn có thông tin liên lạc bao gồm địa chỉ liên lạc xung. tôi nhận thấy rằng một số liên lạc giải quyết trong 1 khung mô phỏng khác có 2 khung hình và xung là hai lần thấp hơn. (Tôi đã nhận nó gỡ lỗi mã.) Tôi sẽ là hoàn hảo để có được 1 thông báo liên lạc với tổng xung. Tổng số:

Không có phương pháp nào tôi liệt kê Một thời gian nó bắn khi quả bóng bay gần mục tiêu và thậm chí không chạm vào nó.

Cách dự kiến ​​để làm điều đó là gì?

Thông tin như vậy có thể được sử dụng để phát âm thanh tác động hoặc bắt đầu một số hoạt ảnh nếu năng lượng liên hệ cao.

+1

pt.getAppliedImpulse() – rraallvv

+0

pt.getAppliedImpulse() - Tôi bỏ lỡ thế này! thêm câu trả lời và tôi sẽ đánh dấu nó như vậy. Cảm ơn bạn – Max

Trả lời

3

Mã này nên chỉ bạn ở trên hướng 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

Tôi xin lỗi. Tôi không thể đánh dấu nó đã trả lời. Tôi chỉ cho +1. Tôi đã thử nghiệm pt.getAppliedImpulse() và nó không hoạt động. Nó thường có tổng xung 0 ngay cả khi tôi thấy rằng nó đã xảy ra trong mô phỏng và tốc độ của tôi thay đổi đáng kể. hoặc numContacts là số không. – Max

Các vấn đề liên quan