2015-10-13 2 views
3

Я много искал, но обнаружил, как проверять столкновение для объектов 2d .. для моего текущего проекта я хочу проверить коллизии в 3d (я использую модели obj) - я мог бы вероятно, что-то выясняет, что проблема заключается в том, что я знаю только центральную точку каждого объекта.Обнаружение столкновений Java с 3d obj-моделями

Есть ли способ получить границы объекта, чтобы я мог проверить, касается ли это границей другого объекта? Какой был бы лучший способ получить эту информацию?

Edit: Некоторые больше информации, которая может помочь:

Я использую LWJGL 2.8,

мои объекты OBJ файлы,

я могу получить положение, масштаб и поворот объекта

EDIT: Это то, что я нашел на YouTube: https://www.youtube.com/watch?v=Iu6nAXFm2Wo&list=PLEETnX-uPtBXm1KEr_2zQ6K_0hoGH6JJ0&index=4

+0

Вы используете какую-либо библиотеку или фреймворк, или просто хотите использовать код в java? Ответ в значительной степени зависит от того, как вы представляете свои 3D-объекты. – Sebastian

+0

ну, я использую lwjgl для материала openGL .. Файлы obj - это только вершинные координаты, которые составляют сетку. Я действительно не знаю, достаточно ли информации, если вам что-то еще нужно знать, просто скажите мне .. – DisasterCoder

+0

У вас есть информация о вершинах для вашей модели, по крайней мере? При этом вы просматриваете все вершины и находите min и max для каждого измерения, и с этим вы можете создать ограничивающий прямоугольник, используемый позже для обнаружения. – Sebastian

ответ

0

Что вы имеете называется triangle soup [1]: вы получили вершинную позицию (, текстуру и нормальную) информацию, сгруппированную с информацией о треугольниках. То, что вы можете сделать, это пересечь каждый треугольник из одной сетки с другой сеткой. Вы можете сделать это либо грубой силой (путем тестирования всех остальных треугольников каждый раз), либо создать space partitioning data structure, чтобы ускорить ваши перекрестки.

E.g. постройте Octree на сетку и проведите по листьям в одном из них: для каждого из этих листьев проверьте свою ограничительную рамку на листья в другом дереве и для каждой из этих пар столкновений переберите все треугольники внутри любой из этих пар друг против друга (или проверяйте только те из сетки A, которые находятся в сетке B, если вам не нужны самопересечения).

Существуют библиотеки для таких видов алгоритмов, как OpenMesh или Bullet, например. Но я знаю только один порт для Java: JBullet.

EDIT: Если вас интересуют только приблизительные столкновения, вы можете выбросить всю информацию о треугольниках и построить ограничивающий объем из своих вершин (например, выровненный по оси прямоугольник - это только min и max для всех вершинных позиций, ориентированная коробка построена аналогично, но сначала вы должны найти достаточно хорошую ориентацию, сфера - a bit more involved, и, наконец, вы имеете выпуклую сетку, которая использует те же самые виды тестов пересечения, что и обычная сетка, но меньше оригинальной и выпуклый, что позволяет оптимизировать общий тест пересечения).

[1]: есть other kinds of 3D representations, которые записывают информацию о том, как связаны треугольники. Вы можете представить себе только два пересекающихся треугольника в сетке A и сетке B, а затем начать поиск пересекающихся треугольников только в окрестности начального пересечения ... эти алгоритмы гораздо более активны, но для сеток, которые деформируются, имеют то преимущество, что вы не нужно перестраивать структуру данных разбиения пространства каждый раз, как вам приходится делать с супами треугольника.

+0

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

+0

@DisasterCoder попробует JBullet, но также приветствую тяжелую часть программирования: не имея качественных обучающих программ по жестким алгоритмам, это трехмерная компьютерная графика в двух словах;) – BeyelerStudios

+0

О, спасибо .. ну, я нашел учебник, который поможет мне сделать то, что я хотите - это не сложно, вам просто нужно знать, где искать;) спасибо за вашу помощь! – DisasterCoder

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