Не могу создать тримеш OgreBullet.

Я использую Ogre и Bullet для проекта, и в настоящее время у меня есть камера от первого лица с формой столкновения капсулы. Я создал модель пещеры (которая будет основной частью уровня) и импортировал ее в свою игру. Сейчас я пытаюсь создать OgreBulletCollisions::TriangleMeshCollisionShape пещеры.

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

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

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

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


person Nathan    schedule 24.11.2011    source источник
comment
это не работает..... как это не работает? Не компилируется? Это не показывает ожидаемое поведение? Он падает? Пони появились?   -  person Bart    schedule 24.11.2011
comment
Извиняюсь. Он компилируется, но форма Capsule проходит прямо через форму пещеры. Также у меня включены контуры отладки, и вокруг меша пещеры ничего не рисуется.   -  person Nathan    schedule 24.11.2011


Ответы (2)


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

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

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

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

person baldy    schedule 29.11.2011
comment
Спасибо за предложение, но я попытался использовать caveBody->setStaticShape(caveNode, tri, 0.1, 0.8, caveNode->getPosition());, и это все равно не сработало. - person Nathan; 30.11.2011

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