RK4, Dérivés, Comprendre la physique des jeux


8

Gafferon Games a un excellent article sur l'intégration RK4 pour les simulations de physique du bâtiment qui peut être trouvé ici: Bases de l'intégration

Personnellement, mes connaissances en mathématiques et en physique pourraient être améliorées. Je me sens à l'aise dans le domaine des mathématiques vectorielles, du trigonomètre, de certaines statistiques (j'ai dû utiliser des formules de régression linéaire pour les logiciels, etc.) et, fondamentalement, de la plupart des choses du niveau secondaire au collège.

Maintenant à la question, j'ai lu cet article, téléchargé la source associée et débogué ligne par ligne pour essayer de comprendre ce qui se passe et j'ai toujours l'impression que je n'obtiens clairement pas ce que je regarde. J'ai cherché sur Internet en essayant de trouver les versions "pour les nuls", franchement j'apprends un peu différemment et regarder des formules toute la journée en mettant l'accent sur la mémorisation ne va pas le couper car j'ai besoin de comprendre ce qui se passe donc je peut être flexible en l'appliquant.

Voici donc ce que je pense comprendre jusqu'à présent, mais j'espère que quelqu'un d'autre pourra me clarifier ou me corriger complètement. Le RK4 utilise un pas d'Euler, puis base celui-ci pour avancer dans le temps pour calculer plusieurs pas d'Euler plus essentiellement (?) Et détermine à l'aide d'une somme pondérée quelle est la meilleure position et la meilleure vitesse pour la prochaine image?

De plus, cette méthode d'accélération (convertie en AS3):

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

prend une masse (10) et une force (1) constantes? et renvoie un calcul bizarre, je ne sais pas pourquoi ... - masse * position - force * vitesse? quelle?

Ensuite, pour ma dernière confusion, dans les méthodes d'évaluation qui ressemblent à (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;
}

Nous stockons un nouvel état avec le pas de temps, puis définissons une dérivée à retourner ... Je comprends en quelque sorte cela car il est utilisé dans le processus d'approximation, mais qu'est-ce que c'est!:

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. 

Nous définissons le changement de sortie dérivé en position sur la nouvelle vitesse des états? Hein?

Enfin, cette simulation de test s'exécute en faisant ceci:

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

Nous établissons donc un nouvel état avec une valeur de position de 100 et une vitesse de 0? Quel est l'intérêt de cette simulation si nous n'avons pas de vitesse ...

Quoi qu'il en soit, inutile de dire que je suis assez confus et que j'ai dérivé de la planète Terre. En espérant que quelqu'un là-bas puisse clarifier cela pour moi.


Si les jeux sont ce que vous recherchez, RK4 est une exagération et, en raison de son rapport coût / stabilité, ce n'est pas non plus le meilleur choix pour ces changements brusques et brusques de votre accélération. Si vous cherchez une discussion sur le type d'intégrateurs qui vaut la peine d'être choisi, ainsi que sur la façon de construire un simulateur plutôt simpliste, je peux recommander un rapport technique sur exactement ces problèmes: arxiv.org/pdf/1311.5018v1.pdf
teodron

1
Intéressant, je vais prendre un café et relire ça! Personnellement, je suis intéressé à comprendre autant que possible de la simulation de base à la simulation avancée. J'en ai fait pas mal de très basiques actuellement, mais c'est purement une quête de connaissances afin que je puisse améliorer ma flexibilité en tant que développeur. Merci pour la référence, l'appréciez grandement!
Bennett Yeates

Réponses:


6

RK4 est un exemple d' intégrateur numérique . L'intégration d'Euler est un concept similaire, mais il est beaucoup moins précis. L'intégration numérique n'est pas exacte, mais beaucoup mieux pour un ordinateur à gérer dans une situation en temps réel comme un jeu. La raison pour laquelle vous utilisez RK4 au lieu d'Euler est que RK4 prend en compte l'intégration des deuxième et troisième dérivées (accélération et secousse), et s'adapte ainsi beaucoup mieux à la solution analytique.

RK4 est essentiellement une expansion de la série Taylor de l'équation différentielle qui définit l'accélération en termes de déplacement et de vitesse. Cela vous permet d'intégrer des forces qui dépendent de ces quantités, comme dans les contraintes et même la gravitation universelle. Les extensions de la série Taylor sont utiles dans la programmation car les ordinateurs peuvent les évaluer très efficacement.

La accelerationfonction utilisée est un exemple est un simple système de ressort amorti, non gravitationnel. kest la constante du ressort de Hooke et best utilisée pour amortir le système (éliminer l'énergie). Pour à peu près toutes les contraintes liées aux ressorts dans votre moteur, vous voudrez les amortir car les erreurs numériques peuvent provoquer une énorme accumulation d'énergie, provoquant l'explosion de la simulation. Si vous utilisiez l'intégration d'Euler, ce serait bien pire.

En ce qui concerne acceleration(), un moteur physique plus complet calculera les accélérations linéaires et angulaires en fonction des forces (couples). Les forces à additionner pourraient inclure la gravité (constante ou basée sur la gravitation universelle), la flottabilité et les ressorts (la plupart des contraintes peuvent être modélisées à l'aide de ressorts rigides).

Il est facile de répondre à votre troisième question. En cinématique, il existe trois grandeurs de base: le déplacement (position), la vitesse et l'accélération. L'accélération est la dérivée de la vitesse, qui est la dérivée du déplacement (les deux par rapport au temps). Un dérivé est simplement la vitesse à laquelle quelque chose change. Derivative.dxsignifie "le dérivé de State.x".

Étant donné que la simulation suppose que le ressort est ancré à l'origine et a une longueur de repos nulle, un déplacement de 100 signifie que la particule commencera à osciller. La simulation de test se termine lorsque la particule ne bouge pas et est proche de l'origine.


Une autre description est que vous pouvez considérer RK4 comme une expansion de taylor vers l'équation différentielle.
RandyGaul

Ceci est une excellente réponse et a vraiment révélé quelques trous dans mes connaissances en physique. Pouvez-vous fournir quelques références à un bon point de départ pour comprendre ce qu'est un système de ressort amorti, les couples, etc.? Je crois que je manque définitivement de ces mécaniques plus avancées. Votre réponse me clarifie vraiment beaucoup, d'autant plus que je viens tout juste de commencer les polynômes de Taylor.
Bennett Yeates


Parfait, la khanacademy était l'endroit où je pensais.
Bennett Yeates
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.