Pergunta

Eu estou escrevendo um motor de física que utiliza a integração Verlet, e eu não posso obter algumas restrições ao direito do trabalho. Alguns (como um vínculo / solda restrição) são extra "encharcado" e não são suficientes duro, enquanto outros (como uma restrição de área) são extra insufláveis ??e enviá átomos voadores. O código para o meu étodo atualização no meu simulador de física é assim:

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

Eu tentei todas as combinações idfferent de ordens de atualização e nenhuma ajuda. Eu tenho uma vaga idéia de algo sobre o uso de iterações mas não tenho idéia o que mais ajudaria. Alguma sugestão?

Foi útil?

Solução

Você está correto em suas suposições de iterações.

Ao executar o integrador parte Verlet várias vezes em um quadro, o mais duro e melhores trabalhos de simulação).

Isto é devido ao seguinte: dizer que você tem 5 átomos próximos uns aos outros, e quando o último átomo fica integrado, ele é movido um pouco. infelizmente, ele é movido i ao átomo ao lado dele. É preciso um quadro completo, antes da integração é feito de novo e este é fixo (devido às restrições). Como sempre, as chances são, os átomos de novo são colocados dentro dos outros.

de modo a contrariar este efeito, os mais iterações você faz (assim quanto mais vezes por quadro você chamar o integrador), melhor será a simulação vai funcionar e estar de acordo com suas limitações,

No entanto, você vai notar que quanto mais você corre o integrador por quadro, mais poder de processamento que irá utilizar. Portanto, há um algum lugar sweet spot que você tem que encontrar manualmente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top