Structure d'un moteur

Utilisateur anonyme - 25 janv. 2007 à 18:48
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 25 janv. 2007 à 21:32
   Bonjour à tous. Je suis un debutant en c++ et en programmation 3d, mais j'avance très vite grâce à d'excellents sites que j'ai trouvé. Sinon je programmais déjà en java donc je ne suis pas un neophyte complet en programmation . Voici pour l'intro.

   Voulant progresser dans les domaines c++ et programmation 3d j'ai décidé de faire moi même un moteur 3d, qui resterait très modeste, rassurez vous je ne compte pas refaire ogre en mieux lol.
Eh oui, je pense que réinventer la roue est très utile pour progresser en c++ et pour ensuite mieux se servir d'un véritable moteur 3d performant, ou pour coder des jeux 3d très basiques simplement grâce à un moteur que je connaîterais par coeur puisque c'est moi qui l'aurait codé .
    Mon moteur serait codé en 3d avec opengl puisque j''ai trouvé d'excellents tutoriaux dessus, de plus il serait en accord parfait avec la sdl pour l'implementation de opengl, en effet les deux sont portables.

   Venons aux problèmes : j'ai cherché de la documentation sur comment bien structurer un moteur 3d et je n'ai trouvé que peu d'informations qui m'ont conduit à la structure et l'organisation suivante de mon moteur. En effet je ne veux pas commencer à coder sans savoir clairement où je vais, sinon je risquerais de me planter à un moment et de devoir tout refaire parce que je n'avais pas prévu un truc.

    Structure du moteur en très résumé :  (la vrai structure du moteur est plus complète que ça sur papier rassurez vous (texture, lumiere,...)

une classe principal nommé Rendu serait le gestionnaire de base du moteur. Ce serait le noeud principal qui comprendrait donc des coordonnées et une orientation précise dans l'espace. Cette classe dériverait d'autres classes comme celle de la gestion de la caméra ou la classe Affichage. En clair, je cree un noeud (une instance de la classe Rendu), je le place, je creer un cube par ex à cet endroit avec une camera, et des que je bouge les coordonnes de ma classe rendu, je redessine tous les objets liees à ma classe (mon noeud),  la camera et le cube bougent donc en meme temps.

Le problème se situe au niveau de ma classe que j'ai nommé Affichage. En clair elle récupéreait des vertex qui formeraient des polygones pour faire des objets 3d. Mais comment les envoyer à ma classe Rendu (mon noeud) pour qu'elle affiche ces solides. Sous forme de tableau à 3 dimensions (x y z) ou bien sous forme de structure struct Vertex et struct Polygon.

De plus une fonction renvoyant une structure n'existe pas, ou bien comment faire ?
Enfin si je fais un AfficheCube(largeur,longueur,profondeur,...) pour afficher un cube par exemple, et que j'arrive à renvoyer les coordonnées à Rendu, qui les stockeraient dans une structure ou un tableau pour els afficher, si je fais une deuxieme fois un AfficheCube(largeur,...), il va supprimmer le premier et le remplacer par le deuxieme; puisque je n'aurais qu'une seule structure ou tableau à 3 dimensions dans rendu où seront enregistrées les coordonnées.

Où alors peut etre que ma structure du moteur est totalement erroné, dans ce cas si vous pouviez m'aiguiller vers une bonne structure pour un moteur 3d, car la doc la dessus est tres dur a trouver même en anglais.

Merci d'avoir pris le temps de tout lire, je sais sûrement que je n'ai pas dû être clair sur certains points mais mon problème est dur à expliquer.

Merci d'avance à ceux qui prendront le temps de me répondre



++ et bonne prog

11 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
25 janv. 2007 à 19:06
je sais pas si tu as deja vu ce lien http://loulou.developpez.com/tutoriels/moteur3d/ mais ca peut t'aider je pense. bon courage pour la programmation de ton moteur.
++
0
Utilisateur anonyme
25 janv. 2007 à 19:19
Effectivement je connais ce lien, mais malheureusement je pense qu'il est encore d'un niveau trop élevé pour moi. J'ai regardé pour m'inspirer de certaines classes et un peu de la structure mais il m'aidera beaucoup plus un peu plus tard, quand j'aurais plus d'experience avec la programmation 3d.

Merci quand même

++ et bonne prog
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 janv. 2007 à 20:11
Salut,
Tu dis :
"De plus une fonction renvoyant une structure n'existe pas, ou bien comment faire ?"
On peut bien sur renvoyer une struct par valeur ou par ref (pointeur).

En général tu aura une classe Objet3d contenant les vertices, les positions, les distances, les vitesses ect...
Et une fonction de rendu qui bouclera sur tous les objets Objet3d et les affichera après les avoir trié.
Donc tu aura un tableau d'objet3d[] dans ta classe Affichage.

Si tu es intéressé par un mini moteur d'affichage sans lib externes (tout fait à la main) :http://www.cppfrance.com/codes/VIEWER3D-CPLUSPLUS-WIN32-LIT-FICHIERS-ASE-3DSMAX_39484.aspx

Ce n'est pas un moteur pour faire des jeux mais d'affichage simplement.
0
Utilisateur anonyme
25 janv. 2007 à 20:32
Cette idée est bonne comme je disais, mais le problème reste de renvoyer à la classe Rendu les positions les distances les coordonnées,... 
avec un tableau [] d'objet3d comme tu dis, mais on ne connait pas sa taille puisque l'utilisateur pourra rajouter autant d'objet qu'il le souhaite, alors comment l'initialiser ? En lui donnant une valeur limite comme 50 objets maximum ou existe-t-il des tableaux dynamiques en c++

Enfin ces tableaux d'objets 3d pointeront sur des structure de vertex ou sur des tableaux 3d contenant les coordonnees x, y et z des vertex ? Je pense que les structures sont plus pratiques à utiliser mais j'attends vos avis

++ et bonne prog

PS : si tu pouvais me donner un exemple de code renvoyant un nouveau pointeur sur une structure dès que la fonction est appelé

par ex: dès que affichecube est appelé, il crée une nouvelle instance d'une structure struct vertex  et y stocke les vertex, ...

Parce que le problème est que des que affichecube sera appelé deux fois, il creera le meme pointeur vers la structure, et donc on ne resout pas le probleme puisqu'on supprimme l'ancien pointeur pour mettre les coordonnes du nouveau solide dans le nouveau pointeur de la structure

Ou alors j'ai vraiment rien compris au principe (mais c'est pas grave je suis la pour apprendre lol
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 janv. 2007 à 20:52
Je pense que tu fais une erreur de logique dans ton raisonnement.
afficheCube ne doit pas exister !

// construit un objet 3d (cube ou sphere ou n'importe)
Objet3d monObjet3d(x, y, z, ect....);

et :

afficheObjet(monObjet3d); // n'importe quel objet

Sur la base d'une struct ou class

struct objet3d
{
      int nombreFace;
      VERTEX vertices;
      int x, y, z;
      float dist;
      ect...
};
0
Utilisateur anonyme
25 janv. 2007 à 21:02
Donc en fait je cree une structure nouvel objet que je cree si j'ai bien compris ?

Merci beaucoup, si c'est ca je vais m'orienter vers cette piste

++ et bonne prog
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 janv. 2007 à 21:07
Non, elle est créée qu'une seule fois !
Ses attributs interne changent, mais pas l'instance de cette struct.
C'est le principe d'un objet à état changeant.
0
Utilisateur anonyme
25 janv. 2007 à 21:14
Mais si je cree un cube que j'affiche, puis je modifie les attributs internes de mon instance de la structure, j'affiche une sphere maintenant , et maintenant j'aimerais afficher le premier cube en changeant juste la position, je dois tout reecrire puis que j'ai modifié ses attributs avec le deuxieme objet que j'ai affiche

Je ne peux plus retrouve toutes ses valeurs ?

++ et bonne prog
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 janv. 2007 à 21:20
Mais non,
y'a une instance de la struct pour 1 cube, une instance pour une sphere, une instance pour n'importe quel objet ect....

objet3d mesObjets[1000];

mesObjets[0] = cube;
mesObjets[1] = sphere;

afficheObjetUnitaire(mesObjet[0])
{
      // affiche le cube
}

afficheObjetUnitaire(mesObjet[1])
{
      // affiche sphere
}

modifi le cube :  mesObjets[0].coord.x = 10;

afficheObjetUnitaire(mesObjets[0])
{
      // affiche cube modifié
}
0
Utilisateur anonyme
25 janv. 2007 à 21:23
Ok c'est bien ce que j'avais comrpis au debut, j'ai du mal m'exprimé.

Merci encore de ton aide, je vais pouvoir commencer tout doucement le codage.

++ et bonne prog
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
25 janv. 2007 à 21:32
Regardes le lien que je t'ai donné, car normalement on construit un objet 3d grace à un fichier (trop de données pour etre écrite à la main)

Si tu as 3dStudioMax, mon viewer lit les fichier ase ou ascii de tout objet 3d même complexe.

Cela pourra peut etre t'aider.

Bonne continuation.
0
Rejoignez-nous