Обнаружение столкновений с использованием MeshGeometry3D - PullRequest
3 голосов
/ 19 августа 2009

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

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

Ответы [ 4 ]

0 голосов
/ 06 октября 2016

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

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

0 голосов
/ 19 августа 2009

Добавить к ответу Рида (на основании моего ответа здесь ):

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

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

0 голосов
/ 25 августа 2009

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

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

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

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

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

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

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

0 голосов
/ 19 августа 2009

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

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

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

...