Как оптимизировать столкновения твердых тел с помощью Ogre3D и BulletPhysics

Я разрабатываю несколько игр с друзьями, используя Ogre3D и Bullet Physics. Мне удалось заставить нашего игрового персонажа двигаться (просто беги и поворачивайся).

Думаю, я могу реализовать "прыжки" этим классом:

btCollisionWorld::ClosestRayResultCallback res(btFrom, btTo);.

Однако моей большой проблемой является оптимизация столкновений.

Я пытался:

  1. добавление 100~500 объектов Rigidbody (после того, как мы изменили их на mapobject в нашей игре)
  2. один объект staticplanecollision (земля)
  3. односимвольный твердый объект

FPS при простом перемещении по плоскости 60~80 = нормально. Но когда мой персонаж сталкивается с любым другим твердым объектом, FPS падает до 7.

Я понятия не имею, как решить эту проблему. Я не использую DynamicCharacterController или KineticCharacterController. Персонаж управляется функциями setLinearVelocity() и rigidbody->getWorldTransform().setRotation(quat)

Еще немного информации:

PhysicsManager::GetInstance()->getDynamicsWorld()->stepSimulation(evt.timeSinceLastFrame,8);

person humming at park    schedule 22.01.2015    source источник


Ответы (1)


У меня уже была эта проблема раньше, не знаю, ваш ли это случай, но мы реализовывали Damned (игру), и когда мы моделировали кухни, мы использовали сетки печей как объекты коллизии (btDbvtTriangleMeshShape), и каждый раз, когда персонаж подобрался к печке фпс упал...

Решение состояло в том, чтобы использовать простую форму столкновения для каждой плиты (например, btCompound с несколькими ящиками), и проблема с FPS исчезла :)

Надеюсь, ваша проблема похожа на эту, поэтому вы можете решить ее, уменьшив сложность форм столкновения, которые вы используете.

Если это не так, пожалуйста, покажите мне код, который вы запускаете при обработке своего персонажа (также настоятельно рекомендуется использовать KinematicCharacterController, а еще более рекомендуется переход с Bullet на PhysX ;D).

Лучший.

person Aymar Fisherman    schedule 01.04.2015