Ordem de cálculo e iterações para motores de física
-
05-07-2019 - |
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?
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