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 * Correction positionnelle : pourcentage de correction
* et seuil de correction * et seuil de correction
*/ */
static constexpr float CORRECTION_PERCENTAGE = .5f; static constexpr float CORRECTION_PERCENTAGE = .8f;
static constexpr float CORRECTION_THRESHOLD = .05f; static constexpr float CORRECTION_THRESHOLD = .01f;
/** /**
* Masse par défaut d'un objet * Masse par défaut d'un objet

View File

@ -41,10 +41,23 @@ public:
virtual void draw(sf::RenderWindow& window, ResourceManager& resources); virtual void draw(sf::RenderWindow& window, ResourceManager& resources);
/** /**
* Met à jour l'objet juste avant le dessin d'une frame * Met à jour la vitesse de l'objet selon les
* Reçoit l'état actuel du moteur * 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 * Récupère la boîte englobante de l'objet
@ -56,13 +69,6 @@ public:
*/ */
virtual unsigned int getTypeId() = 0; 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 * Récupère l'accélération de l'objet
*/ */

View File

@ -64,12 +64,7 @@ void Engine::addObject(Object& object) {
} }
void Engine::update() { void Engine::update() {
// demande la mise à jour de tous les objets du jeu // gestion des collisions entre les objets
for (unsigned int i = 0; i < state.objects.size(); i++) {
state.objects[i]->update(state);
}
// gère les collisions entre les objets
for (unsigned int i = 0; i < state.objects.size(); i++) { for (unsigned int i = 0; i < state.objects.size(); i++) {
Object* objA = state.objects[i]; Object* objA = state.objects[i];
@ -78,6 +73,21 @@ void Engine::update() {
objA->collide(*objB); 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() { void Engine::draw() {

View File

@ -1,7 +1,6 @@
#include "object.hpp" #include "object.hpp"
#include "constants.hpp" #include "constants.hpp"
#include "collision.hpp" #include "collision.hpp"
#include <iostream>
Object::Object(float x, float y) : Object::Object(float x, float y) :
acceleration(0, 0), velocity(0, 0), position(x, 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) { void Object::updateVelocity(EngineState& state, float delta) {
// intégration des forces appliquées sur l'objet dans la vitesse
acceleration = getForces(state) * getMassInvert(); acceleration = getForces(state) * getMassInvert();
velocity += acceleration * Constants::PHYSICS_TIME; velocity += acceleration * delta;
}
// intégration de la vitesse dans la position void Object::updatePosition(EngineState& state, float delta) {
position += velocity * Constants::PHYSICS_TIME; position += velocity * delta;
} }
void Object::collide(Object& obj) { void Object::collide(Object& obj) {
@ -105,6 +104,14 @@ void Object::collide(Object& obj) {
return; 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(); sf::Vector2f rel_velo = obj.getVelocity() - getVelocity();
float dot_normal = rel_velo.x * normal.x + rel_velo.y * normal.y; float dot_normal = rel_velo.x * normal.x + rel_velo.y * normal.y;