Я успешно интегрировал библиотеку Bullet Physics в свою систему сущностей / компонентов. Сущности могут сталкиваться друг с другом. Теперь мне нужно дать им возможность столкнуться с ландшафтом, который является конечным и похожим на куб (например, InfiniMiner или его клон Minecraft ). Я только начал использовать библиотеку Bullet Physics вчера, так что, возможно, я упускаю что-то очевидное.
До сих пор я расширил RigidBody
класс, чтобы переопределить checkCollisionWith(CollisionObject co)
функцию. На данный момент это просто простая проверка происхождения, а не использование другой формы. Я повторю это позже. На данный момент это выглядит так:
@Override
public boolean checkCollideWith(CollisionObject co) {
Transform t = new Transform();
co.getWorldTransform(t);
if(COLONY.SolidAtPoint(t.origin.x, t.origin.y,t.origin.z)){
return true;
}
return false;
}
Это прекрасно работает, поскольку обнаруживает, когда происходят столкновения. Однако это не обрабатывает реакцию на столкновение. Кажется, что по умолчанию реакция на столкновение состоит в том, чтобы переместить сталкивающиеся объекты за пределы форм друг друга, возможно, их AABB.
На данный момент форма местности представляет собой просто коробку размером с мир. Это означает, что сущности, которые сталкиваются с местностью, просто стреляют наружу за пределы этой ячейки мирового размера. Таким образом, ясно, что мне нужно либо изменить реакцию на столкновение, либо мне нужно создать форму, которая напрямую соответствует форме местности. Итак, какой вариант лучше и как мне его реализовать? Возможно, есть вариант, о котором я не думаю?
Следует отметить, что местность динамична и часто изменяется игроком.
источник
У меня были некоторые проблемы со стратегией, реализованной в моем другом ответе. Иногда точки соприкосновения соприкасались, было довольно глупо делать формы, отличные от кубов, и иногда это позволяло объектам скользить по местности.
Таким образом, вместо изменения или переопределения любого из классов Bullet, есть альтернативный вариант использования встроенного объекта столкновения Bullet, который будет представлять ландшафт.
BvhTriangleMeshShape
( Док ) представляет собой встроенный в форме, которая представлена в виде треугольника сеткой.Эта сетка может быть сгенерирована одновременно с сеткой для визуализации мира. Это означает, что физический объект может точно соответствовать визуализированному объекту.
Я создаю
RigidBody
для каждого куска в моей местности. Это тело имеет свою форму, установленную наBvhTriangleMeshShape
. Когда ландшафт изменяется, в то же время я перестраиваю визуальное представление фрагмента, я также перестраиваю физическую форму. Затем, когда приходит время буферизовать визуальную форму, я также обмениваю физические формы следующим образом:Это гарантирует, что тело удаляется правильно, очищая точки контакта. Затем его форма меняется, и он снова добавляется.
Для того, чтобы сгенерировать
BvhTriangleMeshShape
каждый чанк, необходимо поддерживатьTriangleIndexVertexArray
( doc ). По сути, это два байтовых буфера. Один с позициями вершин треугольника, а другой - с индексами для построения этих треугольников. Этот массив вершин должен быть сохранен, посколькуBvhTriangleMeshShape
он не создает копию данных.Использование всех встроенных классов физики Bullet, вероятно, быстрее, чем все, что я мог написать, и действительно работает очень быстро. Я не вижу никаких замедлений после реализации этой новой стратегии.
источник
Я не знаком с Bullet Physics, но я использовал ODE. Там, после теста столкновения да-или-нет, проводится более подробный тест столкновения форма-форма, который генерирует набор точек контакта.
В вашем случае ваш мир представляет собой набор коробок, так что вы можете сделать это:
Это не переопределение реакции на столкновение ; это слой до этого. Реакция на столкновение полностью определяется точками контакта, рассчитанными на основе столкновения.
Как я уже сказал, я не знаком с Bullet Physics, поэтому не знаю, подойдет ли его архитектура.
источник