虽然我回答这个问题很晚,但它可能会帮助其他人。对于碰撞检测,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,否则为 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();
现在你有了节点,你可以用它做任何事情。
干杯:-)