Войти
ПрограммированиеФорумФизика

2D-движок столкновений (на основе импульсов) (3 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 4 517 Следующая »
#30
20:17, 19 янв. 2005

GeForce FX5200
CPU: 1.548 Ghz
running time: 297 sec
average: 881/sec
worst: 321/sec


#31
9:22, 20 янв. 2005

Хе хе. А кто говорил про реальное притяжение? Я же сказал - притягиваются равномерно - сила притяжения не зависит от расстояния.

Это секрет :-) Вообщем, я пришел к такой идее - я позволяю телам "заходить" друг в друга и подобные контакты (которые внутри тела) получают веса. Веса растут пока контакт находится внутри тела, чем дальше, тем больше. Так что я просто решаю удары по всем контактам с учетом весов...

#32
9:48, 20 янв. 2005

Блин, как странно. На работе стоит компьютер P4 1.8 Ghz, 50 тел - тормоза! Около 15 просчетов в секунду. Дома - Athlon XP 2 Ghz. Та же программа - 100 просчетов в секунду......... не понимаю в чем дело - то ли у athlon лучше сопроцессор, то ли кеш большой, который здесь влияет то ли что-то еще....
загадка...

#33
13:18, 22 янв. 2005

Gregory_krovosos
А не хочешь статейку замутить? Многим было бы очень интересно, мне, например. Лучше, конечно, там еще и про 3D сказать что-нибудь.
Я просто сейчас тоже физикой занят. А на геймдеве вообще нет статей по физике.

#34
16:34, 22 янв. 2005

Celeron Tualatin 1300
Sapphire R9600

***

CPU: 1.218 Ghz
running time: 126 sec
average: 561/sec
worst: 171/sec

#35
17:24, 22 янв. 2005

Круто! Других слов нет))

CPU: 2.433 Ghz
running time: 154 sec
average: 719/sec
worst: 159/sec

#36
20:33, 22 янв. 2005

CPU: 2.021 Ghz
running time: 164 sec
average: 233/sec
worst: 66/sec

#37
14:44, 24 янв. 2005

Окончательная версия (более-менее):

http://www.gamedev.ru/download/?id=1727

Исправлен ряд ошибок, добавлена возможность настраивать демку и "таскать" объекты.

Bazzilic

насчет статьи - 3D я не занимаюсь - ну пока, по крайней мере. Хотя думаю можно этот движок перенести в 3D...

Если только описать принципы работы этого движка - это можно...

#38
9:58, 25 янв. 2005

Number of bodies: 40
CPU: 1.844 Ghz
running time: 102 sec
average: 597/sec
worst: 143/sec
Прикольная демка. Мне понравилась=) Думаю написание статьи было бы очень кстати.

#39
19:32, 25 янв. 2005

2 Bazilic

Вот статьи (если интересно - могу директ-линки поискать)

1. По CollisionDetection

- на www.magic-software.com есть куча кода и статейка Dynamic Collision Detection using OBB-trees (универсальный метод, можно просто по OBB) поискать
- много еще, главное не лениться искать

2. По физике (твёрдых тел)
- David Baraff (у него куча работ, он один из людей, принёсших физику в комп. графику)
- Michael Cline (из последнего - 2003 год) Post Stabilization for rigid body simulation with contact and constraints
-  или его же PhD thesis - есть все - от выписывания уравнений до алгоритмизации процесса
- Anitescu (тоже - новый простой метод, идеи близкие к тем, что в ODE)

2 All

Актуально обсудить процесс создания физ. движка. Просто про игровые движки в целом вроде уже заходил разговор, а об интеграции с физикой были только обсуждения и выбор АПИ. Пока сам писал подобное, столкнулся со след. проблемами : пока не написана система CollisionDetection (а это не просто :) ), самое интересное , что можно промоделировать - это маятник или чего-то в невесомости (не уччитывая столкновения); если же пытаться отлаживать все сразу (интегрирование уравнений движения и столкновения), то результат не впечатляет (визуально) и как правило ошибки при определении столкновений сильно влияют на качество интегрирования.

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

#40
20:19, 25 янв. 2005

Vinil
Спасибо, очень содержательный пост. Давно таких не видел =)
Буду читать...

Gregory_krovosos
Дело в том, что на геймдеве.ру вообще нет статей по теме.

#41
22:55, 25 янв. 2005

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

#42
9:41, 26 янв. 2005

сделано очень качественно.

GF2 mx200 32mb
Number of bodies: 40
CPU Celeron: 0.935 Ghz
running time: 102 sec
average: 256/sec
worst: 51/sec

> Блин, как странно. На работе стоит компьютер P4 1.8 Ghz, 50 тел - тормоза! Около 15 просчетов в секунду. Дома - Athlon XP 2 Ghz. Та же программа - 100 просчетов в секунду.........

Ничего удивительного, Athlon 1333 ~ P4 1.7 + атлон быстрее с float работает.

#43
12:43, 26 янв. 2005


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

что касается самого устройства движка - нужен во-первых, точный collision detection. далее идеи довольно просты - удар становится контактом, если рядом нет контактов - но предварительно сам удар наносится. если есть рядом контакты - удар не наносится, близкие контакты удаляются, а удар становится контактом. далее на каждом шаге смотрим - является ли контакт "проникающим" и постепенно увеличиваем его вес, если так и есть, чтобы он "вылезал" из тел. вес увеличивает "расталкивающую силу" контакта. Решение удара или контакта - это расчет импульса, зависящего от относительной скорости точек тел в месте контакта и его приложение к телам, если он положительный (если отрицательный - тела по нормали контакта начнут "притягиваться"), в формуле расчета этого импульса присутствует E = коэф. относительный скорости тел по нормали контакта после приложения импульса. E = 0.0 - точки тел после удара двигаются одинаково - тела "слипаются", удар абсолютно неупругий, поглощается энергия. E = 1.0 - относительная скорость точек тел меняет знак на противоположный - абсолютно упругий удар. Соот-но для контактов E = 0.0, а для ударов E вообще говоря зависит от материалов, например E = 0.75 это нечто более менее похожее на удар железа об железо.

Найти формулы для импульсных контактов в инете - проще простого.

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

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

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

Внутренний цикл движка выглядит следующим образом за время t:

- применяем все внешние силы к телам за время t, это изменяет их скорость V.x, V.y и угловую W.
- далее считаем, что внешние силы на тела больше _не_ действуют и тела двигаются прямолинейно и равномерно (и вращаются также)

begin:
- while (t > 0)

- "решаем" контакты (см. далее)

- берем малый промежуток времени dt

разумеется следует рассчитывать это время, пример:
если максимальная скорость тела в движке - max_v и два тела минимального радиуса min_r летят с этой скоростью навстречу друг другу, то за время dt их
относительное смещение не должно превысить R/2, иначе выталкивание заклинит - нормали сойдут с ума.
то есть s = v * t, min_r/2 = max_v * max_dt, max_dt = 0.5 * min_r / max_v, то есть если мы в этой ситуации "шагнем" по времени больше чем max_dt, то тела
"зайдут" друг в друг слишком сильно.

но я забил на это :-) и  просто зафиксировал dt = 5 ms и разумно ограничил максимальную скорость тел (и угловую тоже)

- двигаем все тела в течение некоторого времени dt (контакты, кстати, тоже двигаются вместе с телами, если кто-то еще не догадался ;)

- смотрим пересечения тел между собой, которые делим на 2 группы:

a) есть контакты по этим же поверхностям рядом ("рядом" - ес-но зависит от размера тел)
b) нету

Далее:
- a) - это не удар! это - контакт. добавляем в контакты, ближние контакты - вычищаем. новый контакт получает максимальный вес вычищенных контактов

- b) - а вот это самый настоящий удар! так что:
  > тела отводим назад
  > "бьем"
  > удар становится контактом
  >  идем в begin (время - не изменилось, мы стоим на месте по времени!)

- итак у нас нету ситуации b)? - отлично теперь можно уменьшить t на dt и опять пойти в begin

"Решение контактов".

Разумеется это самое хитрое. Могу лишь сказать, как это делаю я в своем движке, не уверен, что стою на самом правильном пути.
Итак вначале по каждому контакту смотрим - "внутренний" он или нет. Если да - увеличиваем его вес.
Далее смотрим, если контакт "разорван", то удаляем его (но только если он не внутренний)
Далее, несколько раз подряд "соударяем" контакты (то есть удар с E = 0.0 и плюс некие манипуляции с весом контакта, чтобы увеличить расталкивание).

Все.


Вот. Как это работает - см. демку...

#44
14:52, 26 янв. 2005

Извините за постоянный постинг файлов, но вчера пришла в голову идея, движок переработан и стал намного стабильней. Для примера создал настройки с гравитацией и если не считать "пляску", то все остальное выглядит достаточно достоверно.

Также эту версию компилировал в VC toolkit 2003, реальная прибавка в скорости 10-20% гарантирована...

Для отключения гравитации в collisions.ini параметр K_GRAVITY_FORCE поставьте в 0

Для полной невесомости: K_POOL_FORCE - тоже в 0.

http://www.gamedev.ru/download/?id=1737

Страницы: 1 2 3 4 517 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.