OgreBullet RigidBOdy обнаружение столкновений

У меня проблемы с поиском функций в оболочке OgreBulletDynamics.
Я пытаюсь обнаружить столкновение между двумя рибибодами, используя пример из пули вики
http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Callbacks_and_Triggers
В примере контактной информации он хочет

btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());

Объект btCollision работает только с btRigidBody, а не с OgreBulletDynamics :: RigidBody, и я не могу найти, где находится btCollision в OgreBullet.

В примере с contactTest создается структура, полученная из public btCollisionWorld :: ContactResultCallback?

но я не могу пройти мимо OgreBulletDynamics RigidBody, потому что он не может конвертировать из OgreBulletDynamics :: RigidBody в btRigidBody.

Где я могу получить доступ к btCollisionWorld в OgreBulletDynamics?

Спасибо

1

Решение

Хотя я и поздно отвечаю на этот вопрос, но это может помочь другим. Для обнаружения столкновений в OgreBullet вам нужно полагаться на официальные API Bullet. Я предполагаю, что у вас есть базовая архитектура приложения, предоставляемая Ogre3d. Есть метод bool frameRenderingQueued(const Ogre::FrameEvent &fe); этот метод вызывается каждый раз, когда имеется очередь для отображения. И конечно, вы делаете в этом другие вещи. Просто скопируйте приведенную ниже функцию, поскольку я взял эту функцию из Столкновения и обратные вызовы:

void MainApp::checkCollisions()
{
btCollisionWorld *collisionWorld = mBulletWorld->getBulletCollisionWorld();
btDynamicsWorld *dynamicWorld = mBulletWorld->getBulletDynamicsWorld();

int numManifolds = collisionWorld->getDispatcher()->getNumManifolds();
bool collide = false;
for (int i=0;i<numManifolds;i++)
{
btPersistentManifold* contactManifold =  collisionWorld->getDispatcher()->getManifoldByIndexInternal(i);
btCollisionObject* obA = (btCollisionObject *) contactManifold->getBody0();
btCollisionObject* obB = (btCollisionObject *) contactManifold->getBody1();

int numContacts = contactManifold->getNumContacts();
for (int j=0;j<numContacts;j++)
{
btManifoldPoint& pt = contactManifold->getContactPoint(j);
if (pt.getDistance()<0.f)
{
const btVector3& ptA = pt.getPositionWorldOnA();
const btVector3& ptB = pt.getPositionWorldOnB();
const btVector3& normalOnB = pt.m_normalWorldOnB;
collide = true;
std::cout << "Collision Body A: " << obA->getCollisionShape()->getName() << std::endl;
std::cout << "Collision Body B: " << obB->getCollisionShape()->getName() << std::endl;
}
}
}

// this is label for debugging
mInfoLabel->setCaption("Collision = " + Ogre::StringConverter::toString(collide));
}

просто вызовите этот метод в bool frameRenderingQueued(const Ogre::FrameEvent &fe); метод в самом конце. Каждый раз, когда происходит столкновение, вы будете сталкивать bool со значением true, иначе false.

Более того, если вы хотите выполнить какую-либо операцию с узлом, который представляет этот объект btCollisionObject, для этого нужно сделать что-то дополнительное. когда вы создаете RigidBody, как:

OgreBulletDynamics::RigidBody *defaultBody = new
OgreBulletDynamics::RigidBody("Body_Name", mBulletWorld);

затем просто добавьте созданный вами узел в этот defaultBody следующим образом:

defaultBody->getBulletObject()->setUserPointer((void *) node);

затем получите это так:

Ogre::SceneNode *node = (Ogre::SceneNode *) obA->getUserPointer();

теперь у вас есть узел, вы можете делать с ним все что угодно.

ура 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector