gpt4 book ai didi

c++ - OgreBullet RigidBOdy 碰撞检测

转载 作者:太空宇宙 更新时间:2023-11-04 11:42:22 26 4
gpt4 key购买 nike

我无法在 OgreBulletDynamics 包装器中查找函数。我正在尝试使用 bullet wiki 中的示例检测 2 个刚体之间的碰撞 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?

谢谢

最佳答案

虽然我回答这个问题晚了,但它可能会对其他人有所帮助。对于 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); 方法的最后调用此方法即可。每次如果发生碰撞,你都会将 collide 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();

现在你有了节点,你可以用它做任何事情。

干杯:-)

关于c++ - OgreBullet RigidBOdy 碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20887724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com