Порядок расчета и итераций для физических движков - PullRequest
3 голосов
/ 21 октября 2009

Я пишу физический движок, который использует интеграцию Verlet, и я не могу заставить некоторые ограничения работать правильно. Некоторые (например, ограничение соединения / сварного шва) являются слишком «сырыми» и недостаточно жесткими, в то время как другие (например, ограничение площади) являются слишком прыгучими и отправляют атомы в полет. Код моего обновления в моем симуляторе физики выглядит так:

    ProcessRemovedItems();
    ProcessAddedItems();
    _colliderManager.Update(timestepSize);
    foreach (Atom atom in _atomList)
    {
        atom.Update(timestepSize);
    }
    for (int i = 0; i < _iterations; i++)
    {
        foreach (IConstraint constraint in _constraintList)
        {
            constraint.Update();
        }
    }

Я перепробовал все бездействующие комбинации заказов на обновление, и ни одна из них не помогла. У меня есть смутное представление об использовании итераций, но я понятия не имею, что еще поможет. Есть предложения?

1 Ответ

3 голосов
/ 21 октября 2009

Вы правы в своих предположениях итераций.

При многократном выполнении части интегратора verlet в кадре, чем жестче и лучше работает симуляция).

Это связано со следующим: скажем, у вас есть 5 атомов рядом друг с другом, и когда последний атом интегрируется, он немного перемещается. к сожалению, он перемещается в атом рядом с ним. Требуется полный кадр, прежде чем интеграция будет выполнена снова, и это исправлено (из-за ограничений). Однако, скорее всего, атомы снова помещены в другие.

чтобы противостоять этому эффекту, чем больше итераций вы выполняете (тем больше раз за кадр вы называете интегратор), тем лучше будет работать симуляция и соответствовать вашим ограничениям,

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

...