Amélioration de la méthode d'intégration

This commit is contained in:
Mattéo Delabre 2016-03-27 23:43:05 +02:00
parent c74e23ae28
commit 5ded22e012
4 changed files with 47 additions and 24 deletions

View File

@ -43,8 +43,8 @@ namespace Constants {
* Correction positionnelle : pourcentage de correction
* et seuil de correction
*/
static constexpr float CORRECTION_PERCENTAGE = .5f;
static constexpr float CORRECTION_THRESHOLD = .05f;
static constexpr float CORRECTION_PERCENTAGE = .8f;
static constexpr float CORRECTION_THRESHOLD = .01f;
/**
* Masse par défaut d'un objet

View File

@ -41,10 +41,23 @@ public:
virtual void draw(sf::RenderWindow& window, ResourceManager& resources);
/**
* Met à jour l'objet juste avant le dessin d'une frame
* Reçoit l'état actuel du moteur
* Met à jour la vitesse de l'objet selon les
* forces qui lui sont appliquées
*/
virtual void update(EngineState& state);
void updateVelocity(EngineState& state, float delta);
/**
* Met à jour la position de l'objet selon sa
* vitesse actuelle
*/
void updatePosition(EngineState& state, float delta);
/**
* Détecte s'il y a collision entre cet objet
* et l'objet passé en paramètre et résoud la collision
* si elle a lieu
*/
void collide(Object& obj);
/**
* Récupère la boîte englobante de l'objet
@ -56,13 +69,6 @@ public:
*/
virtual unsigned int getTypeId() = 0;
/**
* Détecte s'il y a collision entre cet objet
* et l'objet passé en paramètre et résoud la collision
* si elle a lieu
*/
void collide(Object& obj);
/**
* Récupère l'accélération de l'objet
*/

View File

@ -64,12 +64,7 @@ void Engine::addObject(Object& object) {
}
void Engine::update() {
// demande la mise à jour de tous les objets du jeu
for (unsigned int i = 0; i < state.objects.size(); i++) {
state.objects[i]->update(state);
}
// gère les collisions entre les objets
// gestion des collisions entre les objets
for (unsigned int i = 0; i < state.objects.size(); i++) {
Object* objA = state.objects[i];
@ -78,6 +73,21 @@ void Engine::update() {
objA->collide(*objB);
}
}
// intégration des forces dans la vitesse (première moitié)
for (unsigned int i = 0; i < state.objects.size(); i++) {
state.objects[i]->updateVelocity(state, Constants::PHYSICS_TIME / 2);
}
// intégration de la vitesse dans la position
for (unsigned int i = 0; i < state.objects.size(); i++) {
state.objects[i]->updatePosition(state, Constants::PHYSICS_TIME);
}
// intégration des forces dans la vitesse (seconde moitié)
for (unsigned int i = 0; i < state.objects.size(); i++) {
state.objects[i]->updateVelocity(state, Constants::PHYSICS_TIME / 2);
}
}
void Engine::draw() {

View File

@ -1,7 +1,6 @@
#include "object.hpp"
#include "constants.hpp"
#include "collision.hpp"
#include <iostream>
Object::Object(float x, float y) :
acceleration(0, 0), velocity(0, 0), position(x, y),
@ -74,13 +73,13 @@ void Object::draw(sf::RenderWindow& window, ResourceManager& resources) {
}
}
void Object::update(EngineState& state) {
// intégration des forces appliquées sur l'objet dans la vitesse
void Object::updateVelocity(EngineState& state, float delta) {
acceleration = getForces(state) * getMassInvert();
velocity += acceleration * Constants::PHYSICS_TIME;
velocity += acceleration * delta;
}
// intégration de la vitesse dans la position
position += velocity * Constants::PHYSICS_TIME;
void Object::updatePosition(EngineState& state, float delta) {
position += velocity * delta;
}
void Object::collide(Object& obj) {
@ -105,6 +104,14 @@ void Object::collide(Object& obj) {
return;
}
// si les deux objets sont de masse infinie, réinitialisation
// des vitesses en tant que collision
if (getMassInvert() == 0 && obj.getMassInvert() == 0) {
setVelocity(sf::Vector2f(0, 0));
obj.setVelocity(sf::Vector2f(0, 0));
return;
}
sf::Vector2f rel_velo = obj.getVelocity() - getVelocity();
float dot_normal = rel_velo.x * normal.x + rel_velo.y * normal.y;