CGAL - Столкновение сетки - Как избежать смежных треугольников

Это продолжение моего предыдущего вопроса, который был решен.

Я пытаюсь разработать метод столкновения сетки, чтобы исключить взаимопроникновения. По этой причине я начал работать с CGAL, и у меня есть первая рабочая попытка, внимательно следя за этот пример («Пример поиска пересекающихся трехмерных треугольников»).

Однако кажется, что он обнаруживает все случаи смежных треугольников как столкновения (и теперь кажется довольно очевидным, что метод будет делать это).

Есть ли способ обнаружить действительные столкновения только несоседних треугольников? В идеале метод обнаружения столкновений должен позаботиться об этом до создания выходных данных, избегая, таким образом, необходимости отфильтровывать конечный вектор сталкивающихся треугольников и вычислительную нагрузку, связанную с этим.

По структуре мои треугольники - треугольник-суп, т.е. хранится в векторе без определенного порядка.


person dim_tz    schedule 07.04.2014    source источник


Ответы (1)


Я нашел следующее решение (хотя я не уверен, что оно оптимальное):

В функции обратного вызова проверки столкновений

  • Сначала прочтите идентификаторы треугольников

id1 = a.handle () - coll_Triangles.begin ();

id2 = b.handle () - coll_Triangles.begin ();

  • Проверить, являются ли треугольники вырожденными (если это правда, вернуть)

a.handle () - ›is_degenerate ()

  • Проверьте ID вершин треугольников. Если у них общий идентификатор вершины, верните

это очевидно, здесь не псевдокод :)

  • Только если вышесказанное верно, проведите фактический тест на пересечение треугольников.

CGAL :: do_intersect (* (a.handle ()), * (b.handle ())

  • Если последняя команда вернет истину, значит, у вас сталкиваются два несмежных треугольника. Поздравляю :)

Do_intersect должен выполняться на последнем этапе после всех остальных тестов, иначе вычислительная нагрузка будет довольно большой и напрасной.

Еще одно возможное ускорение - использование полуоткрытых ящиков вместо закрытых. Я обнаружил, что во время жадных проверок между всеми парами треугольников это приводит к ускорению (~ 50%), но я предполагаю, что это может привести к отсутствию некоторых столкновений (например, в случае касания).

CGAL::Box_intersection_d::HALF_OPEN
CGAL::Box_intersection_d::CLOSED
person dim_tz    schedule 07.04.2014