Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Isaac - Un très simple Physics Engine  (Lu 4121 fois)

0 Membres et 1 Invité sur ce sujet

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Isaac - Un très simple Physics Engine
« le: Avril 29, 2012, 11:37:00 pm »
Salut,

Actuellement je développe un Game Engine réutilisable pour mon jeu de plateformes. J'avais besoin de gérer quelques éléments de physique basiques. J'ai d'abord décidé d'utiliser Box2D, mais il y avait trop de choses et ce n'était pas facile à intégrer avec mon Game Engine. Alors j'ai acheté un livre sympa pour créer un Physics engine pour la 3D, qui était très bien. Mais y'avait des choses bien compliquées ou inutiles pour la 2D. alors j'ai décidé de l'utiliser comme base ou référence por faire mes propres classes, qui seraient faciles à intégrer à mon Game Engine utilisant SFML.

Je n'ai pas réinventé la roue, c'est vraiment de la physique trèèèèèès basique, ça peut gérer :
- Implémente les corps solides e leur fixtures attachées
- Générer des forces sur les corps avec la possibilité à l'utilisateur d'ajouter ses propres forces non-triviales (déjà inclus : gravité, force de traction)
- Intègre les positions, forces, vitesses et accélérations linéaires
- Gère les collisions entre deux corps ayant des Fixtures conexes en utilisant le théorème de l'axe séparateur
- Une très très très simple gestion des rotations, vitesses/accélérations angulaires mas sans être très réaliste


Exemple de code :

// A Register of global forces to apply. Will be included in a "Physic" or "World" general class :
isaac::ForceRegistry registry;
// A gravity generator :
isaac::GravityGenerator gravity(isaac::Vector2(0.f, 150.f));

// Add a body
isaac::Body cube;
cube.setPosition(300, 320);
cube.setMass(500);
    // Fixtures
        isaac::Fixture f1;
        f1.RelativePosition = isaac::Vector2(0,0);
        f1.Shape = &cubeShape; // Just a sf::RectangleShape
cube.addFixture("base",f1); // There is a key string, I think about removing it

// Applies forces
registry.add(&cube, &gravity);

// Main loop :
sf::Clock clock;
float timestep = 0.f;
while(1)
{
     // Events...
     registry.updateForces(timestep);
     cube.intergrate(timestep);

     // Draw, using the shape or a body method to get all fixtures
}



Une courte vidéo :

http://www.dailymotion.com/video/xqh60v_isaac-simple-physics-engine_videogames


Il reste encore des bugs, des fonctions à documenter et des choses à faire, donc pour le moment je ne fournis rien de plus