Как я могу расширить btCollisionAlgorithm, чтобы разрешить столкновение с воксельным ландшафтом?

8

Я использую Bullet и пытаюсь создать алгоритм столкновения, который генерирует точки соприкосновения с поверхностью на основе куба вместе с соответствующим ответом на столкновение. Я также планирую расширить это, чтобы включить формы не-коробки, но это не является жизненно важным в данный момент. Я обнаружил, что использование треугольной сетки - слишком большая проблема с ОЗУ для больших карт.

Я попробовал процедуру, изложенную здесь Byte56 , однако у меня есть ряд вопросов относительно реализации этого с помощью Bullet:

  • Как вы генерируете форму столкновения для мира? Вы используете нестандартную форму? Что вы собираетесь m_shapeTypeна нем?
  • Или вы все еще используете форму коробки размером с мир?
  • Как вы обеспечиваете освобождение контактных точек?
  • Как именно вы модифицируете processCollision?

Что я сделал:

  • Я создал terrainShape that extendsbtBoxShape , the only difference being thatm_shapeType = CUSTOM_CONVEX_SHAPE_TYPE`, чтобы я мог зарегистрировать новый алгоритм столкновения с диспетчером для объектов только с этой формой.
  • Я расширил btRigidBodyкласс таким же образом, как и Byte56 в его вопросе (см. Ссылку во 2-м абзаце), однако checkCollisionWith(CollisionObject * co)возвращает true, если какой-либо воксель в AABB of coне является эфирным.
  • Я расширил btCollisionAlgorithmкласс аналогичным образом btCompoundCollisionAlgorithm, processCollisionвыполнив следующее:

    1. Проверьте сталкивающиеся объекты, переданные в качестве аргументов, и определите, какая территория, а какая - сущность.
    2. Очистить многообразия от любых дочерних алгоритмов.
    3. Вызов resultOut->setPersistantManifold(resultOut)
    4. Создайте новые формы ящиков и преобразуйте их в AABB, занятом сталкивающимся объектом, и затем вызовите m_dispatcher->findAlgorithm. Сохраните форму, преобразование и найденный алгоритм в структуре дочернего алгоритма для каждого вокселя в AABB.
    5. Перебирать все дочерние алгоритмы, вызывая proccessCollision.
    6. Выполните итерацию по всем дочерним алгоритмам, удаляя любые теперь за пределами AABB сталкивающейся сущности. (звонит ~btCollisionAlgorithm()тогда m_dispatcher->freeCollisionAlgorithm())
    7. Вызов resultOut->refreshContactPoints().

Что работает: processCollisionвызывается всякий раз, когда AABB игрока пересекается с не воздушными вокселями.

Что не так: реакция на столкновение просто странная ... Сущность игрока начинает подниматься вверх. Если он входит во что-то, он сильно отскакивает. Иногда он не может продолжать двигаться по одной оси после того, как во что-то вошел. Я подозреваю, что происходит то, что точки контакта не освобождаются после реакции на столкновение, возможно, из-за того, что сущность игрока всегда находится в AABB объекта мира. Мне любопытно посмотреть, лаю ли я правильное дерево по отношению к processCollision?

SnapperTT
источник
Вы вообще с этим разобрались? У меня очень похожая проблема.
Тимоксли
Немного опоздал, извините, я не видел вашего вопроса. Если вы еще не поняли это, пробовали ли вы отладочный чертеж ваших физических тел? AABB, который вы используете для обнаружения столкновения, не ограничивает физическое тело, которое вы используете. Таким образом, к тому времени, когда вы обнаружите столкновение, ваш объект уже находится внутри него. Это объясняет, почему ваши реакции на столкновения такие странные.
MichaelHouse
1
Смотрите мой последний ответ на мой вопрос: gamedev.stackexchange.com/questions/27405/…
MichaelHouse

Ответы:

1

К сожалению, я не смог получить достоверные результаты с помощью метода, описанного в ответе, на который вы ссылаетесь . Подобно вам, я получал бы странные плавающие события или ситуации, когда удаление вокселя приводило к тому, что объекты, плавающие на них, оставались плавающими в воздухе, или странные колеблющиеся перья падали на землю. Я отказался от этой стратегии для новой стратегии.

Я начал создавать собственные сетки столкновений для каждого участка воксельной местности. Я делаю это с BvhTriangleMeshShape. Это работает довольно хорошо:

введите описание изображения здесь

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

MichaelHouse
источник