Zvz
Да я не про контакты.
Представим что есть два шарика соединённых варевочкой -> они не могут разойтись более чем на длину этой веревки -> появляются ограничения -> уравнения становятся нелинейными
А если они соединены, например, пружиной -> то появляются дополнительные уравнения для движения частей системы.
Вот я и не понимаю... все манипуляции происходят над изолированными, замкнутыми объектами... в какой момент учитываются функции связи? И собственно, как они задаются?
ограничения (также как и контакты, и колизии) обрабатываются - "попарно", контакты в этой модели - это тоже вид ограничений (на непроникновение тел).
какие уравнения становятся "нелинейными"?
закон сохранения импульса и ограничения обрабатываются последовательно.
"все манипуляции" - любое взаимодействие тел - в данном подходе происходит "попарно" (в отличии от, например, LCP).
"связи" накладываемые на скоростные хар-ки тел учитываются (также попарно) после применения импульсов, если "связи" накладываются на положения тел, то они учитываются после интегрирования позиций.
EvilSpirit
Машинка жжот!! Пять балов :)
Zvz
>А что за "всякие проверки скоростей"? Это обработка констрэинтов или она входит в решение контактов?
Это ограничение максимальной скорости + насильная остановка тела, если движется или крутится слишком медленно, чтобы это было заметно секунд за 10.
>Это приближение разумно для обработки контактов, которые сохраняются во времени, но если на след. шаге другие тела колизятся с такими "исключенными", как обрабатываются такие ситуации?
Не не) Исключаются только удары между контактирующими телами. Все остальные бьют их и себя как обычно.
DROnik
>Вы не могли бы пояснить ещё раз? Я не очень уловил... как всё-таки решаются системы тел? Каждая часть интегрируется самостоятельно или вся система целиком?
Самостоятельно. Каждый отдельный контакт решается отдельно. Это делается несколько раз (у меня - к примеру - 11 раз. подобрано эмпирически). Допускаю, что существует более строгий метод, который проверяет насколько сильно стучат контакты и при уменьшении этой величины ниже определенного уровня выходит из цикла ударов по контактам.
Не совсем уяснил. Допустим, у нас образовался контакт (взаимное прониконовение объектов). В этот момент мы считаем импульс и прикладываем его к двум объектам. Далее интегрируем по времени. А вот что делать с контактом на следующем шаге, если взаимное проникновение тел осталось (а этого мне не надо). Каким образом заставить объекты "вытолкнуться" друг из друга ?
4ECHOK
Формула применения импульса по контакту содержит член MIN_V - задающий минимальную скорость разлета точек тел. MIN_V зависит от глубины взаимопроникновения - чем глубже, тем больше требуемая скорость разлета. При правильном подборе констант это гарантирует, что тела не будут заползать друг в друга. И визуально это будет незаметно совершенно - поскольку речь идет о взаимопроникновении на величины порядка 0.1 % от размеров тел.
Если же у тебя стоит задача - не допустить вообще никакого проникновения тел друг в друга - даже на 1e-12, то тебе следует слегка увеличить ограничивающие объемы и применять ту же идею.
Спасибо, идею понял.
Gregory_krovosos
Простите, если повторяюсь, но я не совсем понял насчет столкновений. Если тела сравниваются попарно, то как быть в случае, если столкнулись три тела? И что делать, если на этапе проверки обнаружено столкновение: добавлять его в очередь и продолжать дальше или выходить и применять импульс?
Bionikl
После очередного шага я определяю сколько тел пересеклось и по всем ним ударяю по очереди.
Потом - по контактам.
Не совсем ясно : "по всем ним ударяю по очереди.
Потом - по контактам". Зачем удараять два раза?
Bionikl
Три контакта практически невозможно решить, об этом в свое время уже писал Gregory_krovosos. Например, в ODE решаются все контакты одновременно, но не точно (как по аналитической формуле), а лишь в некотором приближении к такому решению.
Сначала мы ищем пересечения тел, дальше к применяем соответствующие импульсы к тем, которые пересекаются. Я так понял? А "контакты" и "пересечения" это почти одно и тоже?
Bionikl
Чтобы пересечение стало контактом надо определить нормаль, расстояние взаимопроникновения и точку контакта.
К примеру, если расстояние между центрами окружностей меньше суммы их радиусов, то окружности пересекаются.
Однако, этого знания для создания контакта недостаточно - нужны дополнительные вычисления.
Не совсем понятен смысл функции IntersectLines.
Вычисляется персечение прямых, или всё-таки отрезков?
if (fabs(D) < _E) return true; // нет решения
почему true? если нет решения, значит и точки пересечения нет.
А вообще интересует только факт пересечения отрезков без нахождения точки пересечения.
Здорово! Отлично, я бы даже сказал.
Тема в архиве.