2016-06-06 3 views
1

J'essaie de programmer une simulation de physique du corps rigide très simple (en utilisant C++ et OpenGL) à des fins d'apprentissage (veuillez également m'excuser à l'avance, mais l'anglais n'est pas ma langue maternelle).Comment dois-je structurer ma simulation/rendu de physique très simple?

Maintenant, jusqu'à présent mes cours sont structurés comme ceci:

classe Agent:

  • entité mobile dans la simulation
  • contient des variables typiques comme la position, la vitesse, la vitesse maximale, etc etc

classe Obstacle:

  • entité fixe dans la simulation (comme les murs)

classe de simulation:

  • contient une liste de tous les objets Agent et Obstacle et mettre à jour leur état à chaque tic-tac de la boucle de programme

classe Renderer:

  • initialiser OpenGL Responsable
  • La méthode de mise à jour prend un pointeur sur l'objet de simulation et restitue l'état à l'écran.

Maintenant, tout fonctionne, mais je vais avoir des problèmes sur la façon de structurer mon nouveau programme à mettre en œuvre les fonctionnalités suivantes:

  • Des trucs comme vertex, des textures et qui Shader à utiliser est actuellement codé en dur dans le moteur de rendu. Je voudrais pouvoir changer ceux-ci sur une base par objet d'agent mais je reconnais que ces variables n'ont aucune place dans la classe d'agent ni dans la classe de simulation. Où devrais-je garder la trace de ceux-ci? Je voudrais ajouter quelques trucs de débogage/visualisation dans le programme. Par exemple, avec un agent sélectionné, le programme trace un point après une certaine distance parcourue (par exemple: 1 point toutes les 2 unités parcourues) afin que je puisse avoir une sorte de trace pour visualiser où l'agent est allé. Quelle classe serait responsable de:

    1. suivi dont l'un est l'agent sélectionné
    2. Création et points de suivi sur la base de la distance de l'agent sélectionné parcouru et la position
    3. la décoloration Finalement et que la suppression des points anciens Je ne pense pas que ni la classe Simulation ni la classe Render devraient avoir la responsabilité de suivre ces données supplémentaires (idéalement, le rendu ne devrait être conscient des points que pour les rendre).

Désolé pour le poste de longue haleine, mais j'ai essayé de résoudre ces problèmes pour deux semaines, mais rien de bon à l'esprit.

Je sais que je pourrais probablement atténuer ces problèmes en utilisant une architecture Entity Component Systems mais je préfère vraiment le garder aussi simple que possible.

Répondre

0

Les architectures Entity/Component sont ce dont vous avez besoin je suppose. Il y a beaucoup de choses à ce sujet sur Internet et je vous encourage à google le chercher sur stack overflow et gamedev stackexchange.

Un exemple (pas le seul et peut-être pas bon pour vous, mais il est un exemple) pourrait être quelque chose comme

struct Entity 
{ 
    int m_Id; 
}; 

struct PhysicsComponent { 
    unsigned long m_Flags; 
    // Some data 
}; 
struct GraphicsComponent { 
    Texture m_Texture; 
    Mesh m_Mesh; 
    // Some other data 
}; 

Actor actors[MAX_ACTORS]; 
Wall walls[MAX_WALLS]; 
GraphicsComponent graphics_components[MAX_GRAPHICS_COMPONENTS]; 

void UpdatePhysics(float dt) { 
    // Do you logic stuff, using your flags and so on 
} 

void Render() { 
    // Render your stuff by retrieving position/orientation via entities ID 
}