<- Retour à l'accueil Contact : etienne"at"les-sauvages.fr ->

Simulateur physique : historique

Le principal problème d'un moteur physique, et nous verrons cela plus tard, est le calcul des collisions. Même si nous verrons cela plus tard, nous pouvons mettre en place une structure qui permettra de savoir ce qu'on a croisé sur notre chemin entre deux points.

On a deux possibilités : ou bien on stocke nos grandeurs physique chacune dans son propre tableau, ou bien on stocke l'ensemble des grandeurs physiques dans un tableau temporel. J'ai pris la seconde option pour le moment.

#include 
#include 
#include "grandeur.h"

class Frame
{
public:
	Frame();
	void addValeur(const QString & nom, const Grandeur & v);
	Grandeur valeur(const QString & nom) const;
private:
	int _temps;
	QMap >_valeurs;
};

Alors, oui, Frame n'est pas un template, parce que flemme pour le moment. Il faudra qu'on puisse y mettre un peu n'importe quoi, on verra ça plus tard. Mais du coup, notre classe PointMassif a bien évolué :

class PointMassif : public std::enable_shared_from_this
{
public:
    PointMassif();
    virtual void tick(int temps);
    float masse() const;
    void setMasse(float newMasse);

    QVector3D pos() const;
    void setPos(const QVector3D &newPos);
    QVector3D vit() const;
    void setVit(const QVector3D &newVit);

    QString nom() const;
    void setNom(const QString &newNom);

	QList frames() const;

private:
    QString _nom;
    float _masse;
	QList  _frames;
};

Les fonctions de position et de vitesse sont bien évidemment là pour nous simplifier la tâche. par exemple,

setPos()
se présente comme ça :

void PointMassif::setPos(const QVector3D &newPos)
{
	if (_frames.isEmpty()) _frames << Frame();
	auto p = _frames.last().valeur("position");
	p.setValeur(newPos, 0);
	_frames.last().addValeur("position", p);
}

En gros, on crée une frame si on n'en a pas. On récupère la grandeur appelée "position" dans la dernière frame (a priori on ne manipule pas le passé), on lui met son ordre 0 (l'ordre 1 est la vitesse, l'ordre 2 l'accélération), et on la recolle dans la frame.

Des tests unitaires en guise de conclusion

Puisque, ma foi, c'est un projet perso, il serait bon d'enfin faire ce que bien des professionnels seraient inspirés de faire : le développement par les tests unitaires. Voyons cela dans la page suivante.