Запросы на поиск столкновений
Кроме самого факта столкновения тел иногда требуется получить список граней, которые участвуют в столкновении, как показано на рис. 25.2.2, или выделить группы тел, между которыми искать столкновения не требуется. Для этого предусмотрен набор типовых классов, наследников от cdet_query, настроенных на запрос подробностей столкновения:
Структура cdet_query_result – самый простой и быстрый вариант, отвечающий на вопрос имеются ли столкновения в контрольной группе тел. Именно эта структура используется в качестве параметра по умолчанию для CheckCollisions.
Структура cdet_first_collided – выдает первую найденную пару граней столкновения.
Структура cdet_collided_faces – выдает список граней, участвующих в столкновениях, в виде упорядоченного множества пар std::pair<cdet_app_item, const MbRefItem*>, где первый элемент пары –твердотельная модель клиентского приложения, второй элемент пары – грань, принадлежащая модели. Также с помощью метода cdet_collided_faces::Group можно сгруппировать объекты контрольного набора тел так, что бы искать только пересечения между группами.
Метод cdet_collided_faces::Group() объединяет в группу пару тел; для объединения в группу n тел необходимо вызвать cdet_collided_faces::Group n-1 раз для первого и всех остальных тел группы.
В параграфе Настройка запроса на поиск столкновений описано, как с помощью наследования от cdet_query пользователь геометрического ядра может настроить собственные запросы, однако, в большинстве случаев необходимые запросы можно осуществить с помощью класса cdet_collided_faces. Для этого необходимо завести экземпляр cdet_collided_faces и применить его в качестве параметра CheckCollisions. Перед этим можно настроить фильтр поиска с помощью методов cdet_collided_faces::Group и cdet_collided_faces::ExcludeGroup. При необходимости фильтр поиска можно сбросить с помощью вызова cdet_collided_faces::Reset и перенастроить фильтр заново.
Метод
cdet_collided_faces::Group(cdet_app_item fst, cdet_app_item snd)
объявляет группу тел, элементы которой не проверяются на столкновение друг с другом.
Входными параметрами метода являются fst и snd – пара тел, которые уже состоят в группах или впервые объединяются в группу.
Данный метод объединяет в одну группу два тела или присоединяет одно тело к группе другого тела. Таким образом, для того, чтобы объединить n тел в группу необходимо вызвать cdet_collided_faces::Group n-1 раз для первого и всех остальных тел группы.
Метод
cdet_collided_faces::ExcludeGroup(cdet_app_item member)
исключает все элементы группы из поиска на столкновения.
Входным параметром метода является member – любое тело, участник группы, элементы которой исключаются.
Данный метод отключает группу из любых проверок на столкновение. Его рекомендуется применять для временного отключения проверки тел на столкновения без полного удаления из набора с помощью MbCollisionDetectionUtility::RemoveItem так как последующее добавление с помощью AddItem займет больше вычислительного времени, чем отменить исключение с помощью cdet_collided_faces::Reset. Для исключения набора тел из проверки на столкновения допускается многократно вызвать метод ExcludeGroup для всех элементов набора либо предварительно объединить все исключаемых тела в группу, а затем один раз вызвать ExcludeGroup для любого тела группы.
Метод
cdet_collided_faces::Reset()
отменяет результаты всех вызовов Group и ExcludeGroup. Метод применяется, если требуется перенастроить группы и исключения для однажды заданной структуры запросов cdet_collided_faces.