我无法在OgreBulletDynamics包装器中查找函数。 我试图使用bullet wiki中的示例来检测2个rigibodies之间的碰撞 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,我无法找到OgreBullet中btCollision的位置。
在contactTest示例中,它正在创建一个派生自public btCollisionWorld :: ContactResultCallback的结构体?
但我不能通过OgreBulletDynamics RigidBody,因为它无法从OgreBulletDynamics :: RigidBody转换为btRigidBody。
从哪里可以访问OgreBulletDynamics中的btCollisionWorld?
由于
答案 0 :(得分:1)
虽然我迟到了回答这个问题,但它可能对其他人有所帮助。对于OgreBullet
中的碰撞检测,您需要依赖Bullet的官方API。我假设你有Ogre3d提供的应用程序的基本架构。每当有一个排队等待显示的帧时,就会调用此方法bool frameRenderingQueued(const Ogre::FrameEvent &fe);
。当然,你正在做其他一些事情。我从Collision Callbacks and Triggers:
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,否则为假。
此外,如果你想在Node上进行一些操作,这个btCollisionObject代表,你需要为此做一些额外的事情。当您创建RigidBody时:
OgreBulletDynamics::RigidBody *defaultBody = new
OgreBulletDynamics::RigidBody("Body_Name", mBulletWorld);
然后只需在此defaultBody中添加您创建的节点,如下所示:
defaultBody->getBulletObject()->setUserPointer((void *) node);
然后像这样检索它:
Ogre::SceneNode *node = (Ogre::SceneNode *) obA->getUserPointer();
现在你有节点,你可以用它做任何事情。
欢呼: - )