2009-08-19 3 views
3

Я создаю CAD-программу, создавая объекты modelvisual3D. Как выполнить обнаружение столкновения между моими объектами (modelvisual3d) с помощью MeshGeometry3D. Нужно ли сравнивать каждый треугольник в движущемся объекте с неподвижными объектами?Обнаружение столкновений с использованием MeshGeometry3D

Каким будет мой лучший способ обнаружения столкновения?

ответ

0

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

В 3D-библиотеке WPF нет встроенного обнаружения столкновений. Если вам нужна высокая точность, вам нужно сравнить каждый треугольник.

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

0

Чтобы добавить ответ Рида (основано на моем answer here):

После того как вы ликвидировали большинство ваших объектов с помощью ограничительной рамки/сферы для ограничительной рамки тест/сфера вы должны проверить треугольники тестового объекта (ы) против ограничивающего блока/сферы другого объекта перед проверкой столкновений треугольника/треугольника. Это устранит намного больше случаев.

Чтобы исключить столкновение, вам нужно будет проверить все треугольники в тестовом объекте, но чтобы найти случай, когда вам нужно спуститься к случаю треугольника/треугольника, вам нужно всего лишь найти первый треугольник который взаимодействует с ограничивающей рамкой/сферой другого объекта.

0

Посмотрите на теорему SAT (Теорема о разделительных осях), это самый быстрый и простой из них.

Теория об этом заключается в том, что если вы можете нарисовать линию, которая разделяет треугольники, то они не сталкиваются.

Как говорится, первый сделат Аабб раннее обнаружение, а когда два объекта сталкиваются, проверить каждый полигон объекта А против каждого полигона объекта B.

Начиная с 2D, чтобы проверить, если два многоугольника сталкиваются, вам получить экстенты из них в возможных осях (в этом случае X и Y), если эти экстенты пересекаются, то полигоны сталкиваются.

На этой странице вы можете найти очень хорошее объяснение о том, как он работает и как его применять: http://www.metanetsoftware.com/technique/tutorialA.html

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

Кроме того, этот метод разрешает коллизию для движущихся объектов, давая также импульс столкновения (разрешаем относительную угловую скорость, вытесняя скорость B от скорости A, таким образом проблема сводится к движущемуся объекту и статическому, и добавьте скорость по оси, которую вы тестируете, в степень полигона A, если они пересекаются, оставьте первоначальную протяженность многоугольника, и вы получите импульс коллизии).

0

Другим вариантом является использование BulletSharp, обертки C# известного Bullet Physics Engine. В этом случае вам нужно будет написать функции для создания (вогнутой) формы столкновения из MeshGeometry3D.

По моему опыту, он работает очень хорошо, хотя динамическое столкновение между вогнутыми формами не поддерживается. В качестве обходного пути вам необходимо использовать выпуклую декомпозицию.

Смежные вопросы