RK4, Derivadas, Entendendo a Física dos Jogos

8

A Gafferon Games tem um ótimo artigo sobre integração RK4 para criar simulações de física, que pode ser encontrado aqui: Noções básicas sobre integração

Pessoalmente, meus conhecimentos de matemática e física poderiam melhorar. Sinto-me à vontade no campo da matemática vetorial, trigonométricas, algumas estatísticas (eu tive que usar fórmulas de regressão linear de linha para software etc.) e basicamente a maioria das coisas no ensino médio até a faculdade do primeiro ano.

Agora, para a pergunta, li este artigo, baixei a fonte associada e depurei linha por linha para tentar entender o que está acontecendo e ainda sinto que claramente não estou entendendo o que estou vendo. Eu pesquisei na internet tentando encontrar as versões "For Dummies", francamente eu aprendo um pouco diferente e olhando as fórmulas o dia todo com ênfase na memorização não é suficiente, pois preciso entender o que está acontecendo, então pode ser flexível aplicando-o.

Então, aqui está o que acho que entendi até agora, mas espero que outra pessoa possa me esclarecer ou me corrigir completamente. O RK4 usa uma etapa de Euler, depois baseia isso para avançar no tempo para calcular várias etapas mais essencialmente de Euler (?) E determina, usando uma soma ponderada, qual a melhor posição e velocidade para o próximo quadro?

Além disso, esse método de aceleração (convertido em AS3):

private function acceleration(state:State, time:Number):Number
{
    const k:int = 10;
    const b:int = 1;
    return - k*state.x - b*state.v;
}

leva uma massa constante (10) e força (1)? e retorna um cálculo estranho. Não faço idéia do porquê ... - massa * posição - força * velocidade? que?

Então, para minha última confusão, nos métodos de avaliação que se parecem com (AS3):

private function evaluateD(initial:State, time:Number, dtime:Number, d:Derivative):Derivative
{
    var state:State = new State();
    state.x = initial.x + d.dx*dtime;
    state.v = initial.v + d.dv*dtime;
    var output:Derivative = new Derivative();
    output.dx = state.v;
    output.dv = acceleration(state, time+dtime);
    return output;
}

Armazenamos um novo estado com a etapa do tempo e depois definimos uma derivada para retornar ... Eu meio que entendo isso porque é usado no processo de aproximação, mas o que é isso !:

output.dx = state.v;
output.dv = acceleration(state, time+dtime); 

// ok I get we are getting the new velocity since v = a * t, obviously I   
// don't what acceleration() is returning though. 

Definimos a mudança de saída derivativa na posição para a nova velocidade dos estados? Hã?

Por fim, esta simulação de teste é executada fazendo o seguinte:

var state:State = new State();
state.x = 100;
state.v = 0;

t = 0;
dt = 0.1;

while (Math.abs(state.x)>0.001 || Math.abs(state.v)>0.001)
{
    trace(state.x, state.v);
    integrate(state, t, dt);
    t += dt;
}

Então, estamos definindo um novo estado com um valor posicional de 100 e uma velocidade de 0? Qual é o objetivo desta simulação se não tivermos velocidade ...

De qualquer forma, escusado será dizer que estou bastante confuso e saí do planeta Terra. Esperar que alguém lá fora possa esclarecer isso para mim.

Bennett Yeates
fonte
Se você procura os jogos, o RK4 é um exagero e, devido à sua relação custo x estabilidade, não é a melhor opção para as mudanças bruscas e bruscas na sua aceleração. Se você estiver procurando por uma discussão sobre o tipo de integradores que vale a pena escolher, além de como criar um simulador bastante simplista, recomendo um relatório técnico sobre exatamente esses problemas: arxiv.org/pdf/1311.5018v1.pdf
Teodron
11
Interessante, vou pegar um café e ler isso de novo! Pessoalmente, estou interessado em entender o máximo possível da simulação básica à avançada. Atualmente, fiz alguns muito básicos, mas isso é puramente uma busca de conhecimento para que eu possa aumentar minha flexibilidade como desenvolvedor. Obrigado pela referência, agradeço muito!
Bennett Yeates 02/02

Respostas:

6

RK4 é um exemplo de um integrador numérico . A integração de Euler é um conceito semelhante, mas é muito menos preciso. A integração numérica não é exata, mas é muito melhor para um computador lidar em uma situação em tempo real, como um jogo. O motivo pelo qual você usa o RK4 em vez do Euler é que o RK4 leva em consideração a integração das segunda e terceira derivadas (aceleração e empurrão) e, portanto, se adapta muito melhor à solução analítica.

RK4 é essencialmente uma expansão da série de Taylor da equação diferencial que define aceleração em relação ao deslocamento e velocidade. Isso permite integrar forças que dependem dessas quantidades, como restrições e até gravitação universal. As expansões da série Taylor são úteis na programação, pois os computadores podem avaliá-las com muita eficiência.

A accelerationfunção usada é um exemplo: um sistema simples de mola amortecida, não gravitacional. ké a mola constante de Hooke e bé usada para amortecer o sistema (remover energia). Para praticamente todas as restrições relacionadas à mola em seu mecanismo, você deve amortecê-las, pois erros numéricos podem causar um enorme acúmulo de energia, causando a explosão da simulação. Se você estivesse usando a integração do Euler, isso seria muito pior.

Com relação a acceleration(), um mecanismo de física mais completo calculará acelerações lineares e angulares com base em forças (torques). As forças a serem somadas podem incluir gravidade (constante ou baseada na Gravitação Universal), flutuabilidade e molas (a maioria das restrições pode ser modelada usando molas rígidas).

Sua terceira pergunta é fácil de responder. Na cinemática, existem três quantidades básicas: deslocamento (posição), velocidade e aceleração. Aceleração é a derivada da velocidade, que é a derivada do deslocamento (ambos em relação ao tempo). Um derivado é apenas a taxa na qual algo muda. Derivative.dxsignifica "a derivada de State.x".

Como a simulação assume que a mola está ancorada na origem e tem um comprimento de descanso igual a zero, um deslocamento de 100 significa que a partícula começará a oscilar. A simulação de teste termina quando a partícula não está se movendo e está próxima da origem.

jmegaffin
fonte
Outra descrição é que você pode pensar em RK4 como uma expansão de taylor para a equação diferencial.
RandyGaul
Esta é uma ótima resposta e realmente expôs alguns buracos no meu conhecimento de física. Você pode fornecer algumas referências a um bom ponto de partida para entender o que é um sistema de molas amortecidas, torques etc.? Acredito que definitivamente não tenho essas mecânicas mais avançadas. Sua resposta realmente esclarece muito para mim, especialmente quando eu comecei recentemente nos polinômios de Taylor.
Bennett Yeates
Eu tentaria aqui: khanacademy.org/science/physics
jmegaffin
Perfeito, a khanacademy era onde eu estava pensando.
Bennett Yeates