понедельник, 25 апреля 2016 г.

Столкновения в Bullet Physics

Мне необходимо найти точки удара твердого(btRigidBody) и мягкого(btSoftBody) тела.
BulletPhysisc.org объясняет, каким образом в движке реализован поиск столкновений. Для
того, чтобы найти столкновения между двумя телами, необходимо просмотреть все
столкновения, происходящие внутри dynamics_world. Это должно быть сделано в течение
текущего тика моделирования, т.к. контакты столкновения должны быть добавлены и
удалены в течение нескольких подтактов одного такта моделирования. При контакте
объектов можно получить программную обратную связь с помощью группы функций Contact
Callback.


ContactAddedCallback вызывается когда контакт добавлен к просмотру(заметьте, что один и
тот же контакт может быть добавлен много раз, прежде чем будет обработан). Внутри
реализации ContactAddedCallback можно модифицировать некоторые свойства тел(например,
трение) в точке соприкосновения. Заметьте, ContactAddedCallback не появляется в работе при
использовании многопоточных вычислений. Форма определения:

typedef bool (*ContactAddedCallback)(btManifoldPoint& cp, const btCollisionObjectWrapper*
colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId0,int index1);

где cp  точки соприкосновения;
colObj0Wrap, colObj1Wrap  ссылки на взаимодействующие объекты;
partId0, partId0, index0, index1  какието индексы.


Для того, чтобы выходное значение правильно обрабатывалось, необходимо возвращать
false, если не было расчитано трение. Для использования этого обратного вызова нужно
подсоединить файл btManifoldResult.h.

ContactProcessedCallback вызывается неизменно после того, как столкновение начнет
обрабатываться.
typedef bool (*ContactProcessedCallback)(btManifoldPoint& cp,void* body0,void* body1);
cp  точка соприкосновения;
body0,body1  указатели на объекты столкновения (можно привести к btCollisionObject*).
ContactDestroyedCallback вызывается при аннулировании точки контакта.
typedef bool (*ContactDestroyedCallback)(void* userPersistentData);
Эти вызовы требуют подключения btPersistentManifold.h


Также есть btNearCallback, который дает объект типа btCollisionDispatcher.
typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);

где btNearCallback  тип функции обратного вызова;
collisionPair  это объект класса btBroadphasePair, который содержит ссылки на
взаимодействующие объекты и на алгоритм, описывающий их взаимодействие.
dispatcher  это объект класса btCollisionDispatcher, который содерижт указатели на возможные
алгоритмы обсчета столкновений, и, самое главное, в этом классе содержаться точки
столкновения и глубина взаимного прониковения объектов.
dispatchInfo  это объект класса btDispatcherInfo, который содержит вспомогательную
информацию.

Определение вызова находится в файле btCollisionDispatcher.h, для того, чтобы переопределить этот обратный вызов необходимо подключить данный заголовок. Я переопределила у себя ContactAddedCallback, и остальные обратные вызовы этой группы, но они не вызывались при контакте твердого и мягкого тела.

Обратный вызов btNearCallback вызывался при контакте твердого и мягкого тела, но точки  контакта оставались неизвестны.

Для твердых тел и ContactAddedCallback и btNearCallback работали замечательно.
Оказалось, что в алгоритме расчета столкновений твердых и мягких тел функция расчета
точек столкновения еще нереализована.


Итак, сейчас дела обстоят так, что обратный вызов при контакте двух тел(мягкого и
твердого) есть, видимое взаимодействие есть, но точки взаимодействия не записываются в
поле btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr и время столкновения тоже не расчитывается.


Продолжение следует.

Комментариев нет:

Отправить комментарий