Amélioration de la méthode d'intégration
This commit is contained in:
parent
c74e23ae28
commit
5ded22e012
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue