Обнаружение вогнутых столкновений в Bullet
Я новичок в Bullet, поэтому заранее прошу прощения, если мои вопросы звучат для вас тривиально.
Мне нужно загрузить набор вогнутых треугольных сеток из файлов.stl и выполнить обнаружение столкновений. Объекты могут быть перемещены пользователем. Из руководства пользователя я прочитал: "СОГЛАСОВАТЬ ТРЕУГОЛЬНЫЕ СЕТИ: Для статического окружения мира очень эффективным способом представления статических треугольных сеток является использование btBvhTriangleMeshShape".
Следовательно, мои вопросы таковы: - может ли Bullet обнаруживать столкновения между объектами вогнутой сетки, смоделированными с помощью BvhTriangleMeshShape? Что такое реальная разница между contactTest и CollisionWorld::PerformDiscreteCollisionDetection() - мне нужно указать другой алгоритм столкновения для вогнутого обнаружения столкновения?
Я работаю с BulletSharp поддерживаемой оболочкой C# Bullet. что я сделал, была настроена моя пуля:
CollisionConfiguration bt_collision_configuration;
CollisionDispatcher bt_dispatcher;
BroadphaseInterface bt_broadphase;
CollisionWorld bt_collision_world;
double scene_size = 500;
uint max_objects = 16000;
bt_collision_configuration = new DefaultCollisionConfiguration();
bt_dispatcher = new CollisionDispatcher(bt_collision_configuration);
float sscene_size = (float)scene_size;
Vector3 worldAabbMin = new Vector3(-sscene_size, -sscene_size, -sscene_size);
Vector3 worldAabbMax = new Vector3(sscene_size, sscene_size, sscene_size);
bt_broadphase = new AxisSweep3_32Bit(worldAabbMin, worldAabbMax, max_objects);
bt_collision_world = new CollisionWorld(bt_dispatcher, bt_broadphase, bt_collision_configuration); [/code]
И загрузите мои объекты CollisionObjects как BvhTriangleMeshShape
,
Чтобы обнаружить столкновения, я использовал:
contactTest(object, callback)
Результатом этого кода является то, что ContactResultCallback::NeedsCollision
Функция вызывается каждый раз, когда пересекаются два ограничивающих прямоугольника, но не обнаруживаются многообразия, если пересекаются 2 сетки.
И во-вторых:
bt_collision_world.PerformDiscreteCollisionDetection();
int numManifolds = bt_collision_world.Dispatcher.NumManifolds;
Используя этот вторичный код, коллекторы вообще не найдены.
1 ответ
Как вы уже прочитали в руководстве, btBvhTriangleMeshShape
может использоваться только для статических объектов. Это означает, что не существует алгоритма столкновения для двух объектов этого типа (потому что, если все они статичны, они не могут столкнуться). Как вы пытались, вы можете проверить пересечение их ограничивающих рамок, но коллизия столкновений никогда не будет создана.
Если вам интересно, какая польза от btBvhTriangleMeshShape
, он предназначен для обнаружения точного столкновения между выпуклыми динамическими объектами и статической вогнутой средой.
Официальное решение, предложенное Bullet, заключается в выполнении выпуклой декомпозиции каждой вогнутой модели, которая используется для движущихся объектов. Предпочтительным методом выпуклого разложения является HACD (Hierarchical Approximate Convex Decomposition)
, Пример можно найти в Bullet Example.
Другой алгоритм стоит попробовать V-HACD (Volumetric Hierarchical Approximate Convex Decomposition)
, который создает фигуры с лучшей топологией, чем предыдущая, но выпуклый корпус менее точен - результирующая форма столкновения больше, чем исходная сетка. Частота ошибок может контролироваться разрешением, но это замедляет процесс.