2016-11-14 1 views
0

Dites que j'ai un objet à côté de moi à mon bureau en ce moment, et un objet Java dans le programme sur lequel je travaille. Si je devais laisser tomber l'objet réel, il accélèrerait vers le bas à une vitesse de 9,81 m/s (sans tenir compte de la résistance au vent), donc la vitesse serait de 9,81 m/s/s et la position globale serait de (-) 9,81 m/s/s/s par rapport à l'endroit où il a commencé.Simuler la gravité

Maintenant, si je l'ai écrit un programme java avec mon objet java simulant ce que je ferais comme telle

public class HypotheticalObjectClass(){ 

    double position = 0, velocity = 0; 

    tick(){ 
     velocity += 9.81; 
     position += velocity; 
    } 

} 

Ce programme est précis aussi longtemps que je l'ai appeler tick() une fois par seconde, mais si ça s'appelle plusieurs fois par seconde la position monte en flèche à cause du calcul ou autre ... J'ai l'intention de faire cocher ce programme plusieurs fois par seconde, alors comment je corrigerais le calcul donné uniquement aux valeurs instantanées (vitesse, position, rotation, etc. ...) et, si ce n'est pas possible, quel système dois-je ajouter pour le rendre possible?

Désolé si cette question a déjà été adressée sur ce site, je n'ai aucune idée de comment je la trouverais, et je vous remercie pour votre aide.

Répondre

0

Vous devez connaître le décalage horaire entre vos appels tick, puis vous pouvez adapter l'accélération et la vitesse en fonction.

public class HypotheticalObjectClass(){ 

    double position = 0, velocity = 0; 

    public void tick(double dt) { 
     velocity += 9.81 * dt; 
     position += velocity * dt; 
    } 

} 

Si accelaration est units/s^2 et vitesse units/s alors dt est la différence de temps en secondes entre les appels de fonction. Donc, si vous l'appelez une fois par seconde, vous devriez l'appeler obj.tick(1.0). Cependant, la meilleure idée est de mesurer le temps entre les appels parce que, comme vous l'avez mentionné, la différence de temps n'est pas toujours exactement la même.

Notez que cette méthode est assez inexacte, mais elle est souvent suffisante. Pour plus d'informations sur la simulation physique, voir: http://gafferongames.com/game-physics/integration-basics/

+0

J'ai un système pour chronométrer les appels ailleurs dans le programme, mais le problème actuel est beaucoup plus confus et difficile à voir. Si je devais le faire cochez 30 fois par seconde, la première fois cela ajouterait 1/30ème de 9.81m/s à la vélocité, puis ajouterait la vélocité à la position, ce qui est génial. Mais la deuxième fois que ça s'appelle ça ajoute 1/30ème de 9.81 à la vélocité, puis 2/30ème à la position, qui est alors déjà aux 3/30ème de 9.81, à la 8ème coche elle a déjà atteint la bonne position et continuera à dépasser radicalement. Il perd sa précision à cause de la rapidité avec laquelle la position s'accumule. – jotnova

+1

L'intégration numérique n'est jamais précise à 100%. Lisez l'article donné si vous avez besoin de quelque chose de mieux. – Rames

+0

Oh, désolé, j'ai complètement raté la dernière partie. – jotnova