2010-01-29 3 views
15

Вот моя проблема. Я создаю игру, и мне интересно, как это делать. У меня есть несколько примеров для анализа и поиска лучшего решения.Столкновения в реальном мире

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

У меня есть 2 типа сетки, для которых я должен сделать соударений:

1) Статические Сетки (т.е. перемещаться по экрану, но не имеет какую-либо анимации)

2) кожура/Boned Сетка (анимированный)

на самом деле у меня есть это решение (вполне Hacky: |)

Прежде всего у меня есть испытание на некоторый ограничивающий объем, который охватывает полный m esh (капсула в моем случае), после:

1) Для статических сеток я делю их вручную в блоках (на моделере), и для каждого из этих блоков я использую тест сферы/AABB. (работает отлично, но его немного грязно, чтобы срезать каждую сетку: P) (я попробовал автоматическую систему, чтобы разделить сетку через плоскости, но это дает плохие результаты :()

2) Для анимированной сетки ATM i ' m разделение сетки во время выполнения на x блоков (где x - количество костей). Каждый блок содержит вершину, для которой эта кость является основным фактором. (Иногда работает, иногда дает очень плохие результаты: |.)

Пожалуйста, обратите внимание, что разрыв сетки выполняется во время загрузки, а не каждый раз (в противном случае она будет работать как слайд-шоу: D)

И вот вопрос:

Какая самая разумная идея использовать для этих двух корпусов? Любой материал для меня, чтобы изучить эти методы? (с некоторыми исходными кодами и пояснениями будет еще лучше (язык не важен, когда я понимаю алгоритм, реализация проста)) Можете ли вы аргументировать, почему это решение лучше других? Я слышал много разговоров о kd-tree, octree и т. Д., Тогда как я понимаю их структуру, я пропускаю их полезность в сценарии обнаружения столкновений.

Большое спасибо за ответы !!!

EDIT: Попытка найти пример K-Dop с некоторым объяснением в сети. Все еще ничего не нашли. :(Любые подсказки? Меня интересует, КАК K-Dop может быть эффективно протестирован с другими типами ограничивающих объемов и т. Д. ... но документация в сети кажется крайне недостаточной. :(

ответ

4

Наиболее распространенными подходами, используемыми во многих современных играх AAA, является упрощенное столкновение «k-DOP» для StaticMeshes и упрощенное представление физического тела для SkeletalMeshes.

Если вы используете Google для «столкновения kDOP» или «многогранники дискретной ориентации», вы должны найти достаточное количество ссылок. Это, главным образом, ограниченный объем, определенный из нескольких плоскостей, которые перемещаются извне в сетку, пока не произойдет столкновение треугольника. «K» в kDOP определяет, сколько из этих плоскостей используется, и в зависимости от вашей геометрии и вашего «k» вы получите действительно хорошие аппроксимации с этим.

Для SkeletalMeshes наиболее известная техника ist определяет простую геометрию, прикрепленную к определенным костям. Эта геометрия может быть полем или сферой. Эта модель столкновения, чем может использоваться для довольно точного обнаружения столкновений анимированных сеток.

Если вам требуется столкновение с треугольником, то «Теорема о разделительной оси» - это поисковый запрос google по вашему выбору. Это полезно для конкретных случаев, но 75% ваших потребностей обнаружения столкновения должны быть покрыты вышеупомянутыми методами.

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

+0

Хороший ответ. Много вещей, чтобы посмотреть. Завтра я дам хороший поиск и некоторую работу по их реализации и сообщаю об этом в этой статье. На данный момент +1 !!! Спасибо – feal87

+0

Я ищу все сети, но до сих пор не нашел ОДИН рабочий пример с объяснениями K-Dop. Существует только много теоретических статей (оплата за просмотр). : | Любые подсказки? :( – feal87

+0

D-Collide представляет собой библиотеку столкновений с открытым исходным кодом, которая реализует kDop, поэтому это может стоить взглянуть на пример реализации. http://d-collide.ematia.de/ Этот gamedev.net потоки охватывают множество деталей реализации: http://www.gamedev.net/community/forums/topic.asp?topic_id=430895&whichpage=1� – DarthCoder

5

До создания комплекса обнаружение столкновений, вы должны выполнять основные обнаружения.

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

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

Как и в случае программирования игр, существует множество способов обнаружения столкновений. Мой совет станет простым.Возьмите куб и подстройте свои подпрограммы, а затем теоретически вы сможете использовать любую другую модель. Что касается примеров, я бы проверил gamedev.net, так как у них есть интересные статьи. Многое или мое домашнее обнаружение столкновений - это комбинация многих методов, поэтому я не могу рекомендовать окончательный ресурс.

+2

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

2

Ответ на вопрос сводится к , насколько вам точен?

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

Механизм развития физики игры основывается на искусстве приближения (я скрывался в математике и физике форума GameDev.net много лет назад).

Мое мнение, что вам понадобится какой-то ограничивающий эллипсоид, связанный с каждым объектом. Объект может быть общим многомесячным объектом, сеткой или сеткой subesh. Это должно обеспечить «приличное» количество приближений.

+0

Я имею в виду, это нормально для простых объектов. (сфера, капсула, OOBB, AABB, эллипсоид, что угодно) Если я хочу создать дерево столкновений для сложного объекта (космического корабля или человека), мне нужно будет разделить сетку на несколько частей. Это основной вопрос. Каков наилучший способ разделить сетки и использовать их в системе?У меня есть моя собственная система, поэтому я могу перемещать данные по своему усмотрению, но я хотел бы знать, что является наиболее распространенным принятым методом, поэтому я не могу избежать попыток бесполезных вещей. – feal87

+0

@ feal87: Я не знаю общий/принятый метод. Но я бы сгенерировал эллипсоид в метаданных во время создания объекта для каждого «достаточно интересного» объекта и его подобъектов, позволяя рекурсии для уточнения деталей. –

+0

+1 для искусства приближения! Итак, истинно ... – Nate

2

Pick Christer Ericson's книга, Real-Time Collision Detection. Он подробно обсуждает эти вопросы.

При чтении статей помните, что в реальном приложении для игры вы будете работать в трудных пределах памяти и времени - вы получите 16,6 мс за кадр, и все! Поэтому будьте осторожны с любыми статьями или документами, которые серьезно не обсуждают память и процессорный след его алгоритма.

+0

Спасибо за предложение, я буду изучать его в будущем, если не найду ничего в сети. – feal87

+0

+1 - Я прочитал эту книгу на работе, и это очень полезно. – xan

+0

+1 Для книги Кристера. Это отличная ссылка и охватывает больше областей, чем следует из названия. – zebrabox

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