Domanda

Sto scrivendo un motore fisico che utilizza l'integrazione di Verlet e non riesco a far funzionare correttamente alcuni vincoli. Alcuni (come un vincolo di legame / saldatura) sono extra "fradici". e non sono abbastanza rigidi, mentre altri (come un vincolo di area) sono extra rimbalzanti e fanno volare atomi. Il codice per il mio aggiornamento nel mio simulatore di fisica è il seguente:

    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();
        }
    }

Ho provato tutte le combinazioni idfferenti di ordini di aggiornamento e nessuna di aiuto. Ho una vaga idea di qualcosa sull'uso delle iterazioni, ma non ho idea di cos'altro possa aiutare. Qualche suggerimento?

È stato utile?

Soluzione

Hai ragione nelle tue ipotesi di iterazioni.

Eseguendo la parte dell'integratore del verlet più volte in un frame, la simulazione è più rigida e migliore).

Ciò è dovuto a quanto segue: supponiamo di avere 5 atomi uno accanto all'altro e quando l'ultimo atomo si integra, viene spostato un po '. purtroppo viene spostato nell'atomo accanto ad esso. Prende un frame completo, prima che l'integrazione venga eseguita di nuovo e questo viene risolto (a causa dei vincoli). Tuttavia, è probabile che gli atomi vengano nuovamente collocati all'interno degli altri.

quindi per contrastare questo effetto, più iterazioni fai (quindi più volte per frame chiami l'integratore), migliore sarà la simulazione funzionante e conforme ai tuoi vincoli,

tuttavia, noterai che più esegui l'integratore per frame, maggiore sarà la potenza del processore che utilizzerà. Quindi c'è un punto debole da qualche parte che devi trovare manualmente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top