Не могу создать OgreBullet Trimesh - PullRequest
1 голос
/ 24 ноября 2011

Я использую Ogre и Bullet для проекта, и в настоящее время у меня настроена камера от первого лица с Capsule Collision Shape. Я создал модель пещеры (которая будет служить основной частью уровня) и импортировал ее в свою игру. Я сейчас пытаюсь создать 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);

Любые предложения приветствуются.

Чтобы уточнить. Он компилируется, но форма капсулы проходит прямо через форму пещеры. Также у меня есть схемы отладки, и вокруг сетки пещеры не нарисовано ничего

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Я использовал ваш код и получил точно такой же результат - мой автомобиль проехал прямо через триместр.

Глядя на примеры в:

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 ));`

Когда я внес это изменение, столкновения работают, как и ожидалось

0 голосов
/ 08 января 2012

В конце концов мне пришлось использовать 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);
...