我正在使用Ogre和Bullet进行项目,目前我的第一人称相机设置了胶囊碰撞形状。我已经创建了一个洞穴模型(它将作为关卡的主要部分)并将其导入我的游戏中。我现在正在尝试创建洞穴的OgreBulletCollisions::TriangleMeshCollisionShape
。
到目前为止,我所获得的代码是这样但它不起作用。它编译但胶囊形状直接穿过洞穴形状。此外,我还有调试轮廓,并且没有在洞穴网格周围绘制。
Entity *cave = mSceneMgr->createEntity("Cave", "pCube1.mesh");
SceneNode *caveNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
caveNode->setPosition(0, 10, 250);
caveNode->setScale(10, 10, 10);
caveNode->rotate(Quaternion(0.5, 0.5, -0.5, 0.5));
caveNode->attachObject(cave);
OgreBulletCollisions::StaticMeshToShapeConverter *smtsc = new OgreBulletCollisions::StaticMeshToShapeConverter();
smtsc->addEntity(cave);
OgreBulletCollisions::TriangleMeshCollisionShape *tri = smtsc->createTrimesh();
OgreBulletDynamics::RigidBody *caveBody = new OgreBulletDynamics::RigidBody("cave", mWorld);
caveBody->setStaticShape(tri, 0.1, 0.8);
mShapes.push_back(tri);
mBodies.push_back(caveBody);
欢迎任何建议。
澄清。它编译但胶囊形状直接穿过洞穴形状。此外,我有调试轮廓,并且没有在洞穴网格周围绘制
答案 0 :(得分:1)
我使用了你的代码并获得了完全相同的结果 - 我的车辆直接通过了trimesh。
查看以下示例:
ogrebullet/Demos/src/OgreBulletListener.cpp
似乎不是在呼叫:
caveBody->setStaticShape(tri, 0.1, 0.8);
你需要调用:
caveBody->setStaticShape(caveNode, tri, 0.1, 0.8, Ogre::Vector3( position_x, position_y, position_z ));`
当我进行此更改时,碰撞按预期工作
答案 1 :(得分:0)
最后我不得不使用btScaledBvhTriangleMeshShape
。所以我的代码现在看起来像
OgreBulletCollisions::StaticMeshToShapeConverter *smtsc =
new OgreBulletCollisions::StaticMeshToShapeConverter();
smtsc->addEntity(cave);
OgreBulletCollisions::TriangleMeshCollisionShape *tri = smtsc->createTrimesh();
OgreBulletDynamics::RigidBody *caveBody = new OgreBulletDynamics::RigidBody("cave", mWorld);
btScaledBvhTriangleMeshShape *triShape = new btScaledBvhTriangleMeshShape((btBvhTriangleMeshShape*)(tri->getBulletShape()), btVector3(150, 150, 150));
caveBody->setStaticShape(triShape, 0.0, 5, Vector3::ZERO, rotationQuaternion);
caveBody->setDebugDisplayEnabled(true);