begin process at 2013 05 24 10:23:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR UN TRÈS PROCHAIN JEU 3D

BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR UN TRÈS PROCHAIN JEU 3D


 Information sur la source

Note :
Aucune note
Catégorie :OpenGL Classé sous :opengl, qt, jeu, 3d, jeux Niveau :Initié Date de création :25/07/2011 Date de mise à jour :25/07/2011 17:02:54 Vu / téléchargé :6 745 / 692

Auteur : envi33

Ecrire un message privé
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Bonjour à tous,
Voici un moteur 3D gérant les textures tous formats (supporté par QT) et contient un loader de fichier .obj que j'ai écrit personnellement.
Il permet d'illustrer l'utilisation de deux QGLWidget en même temps et comment se servir de QT pour nous aider à gérer pas mal de fonction (chargement de texture, interface avec l'openGL, etc...).

Vous pouvez vous déplacer à votre guise dans l'environnement, le détruire, sauter sur les caisses, utiliser l'arme à disposition, etc.
Le fichier de map se trouve dans le répertoire de base en .txt.

Vous aurez besoin pour lancer l'exe des 3 fichiers dll :
-QtCore4.dll
-QtGui4.dll
-QtOpenGL4.dll
Et si vous ne voulez pas vous embeter il y a ici le zip beaucoup plus fournis (avec le point EXE, les dll et les fichiers blender 3D) :
http://envi3d.wikeo.net/


Je tenais à poster ce code avant qu'il ne devienne vraiment trop compliqué quand j'y ajouterais la gestion totale de la mission capture de drapeau ainsi que le multijoueur :D


 Conclusion

J'espère que vous apprécierais la clarté et le nombre de commentaire du code.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

25 juillet 2011 17:02:57 :
EDIT1 : Petite modification de la description

 Sources de la même categorie

Source avec Zip AMÉLIORATION DE BOIDS : SIMULATION DE VOLS D'OISEAUX par frappfrapp
Source avec Zip Source avec une capture BOIDS : SIMULATION DE VOLS D'OISEAUX par valchek
OBJECTMARKER par Kekettetm
Source avec Zip Source avec une capture INFOS IMAGE POUR OPENGL par nikau
Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec une capture OPENGL - JEU DE BILLARD EN 3D PAS FINI par acx01b
Source avec Zip Source avec une capture FPS EN RÉSEAU par D6R26H59P
Source avec Zip LABYRINTHE EN 3D par acx01b
Source avec Zip Source avec une capture JEU OTHELLO 3D EN OPENGL POUR WINDOWS ET LINUX EN OPEN SOURC... par chfauve59

Commentaires et avis

Commentaire de envi33 le 25/07/2011 09:38:21

N'hésitez pas à donner votre appréciation global et/ou me dire si le moteur fonctionne bien chez vous!
Merci ;)

Commentaire de CptPingu le 25/07/2011 11:13:55 administrateur CS

Bonjour.

Le projet est sympa. J'aime bien l'idée de la minicarte. C'est un très bon début. Si tu veux faire un moteur, peut être qu'il serait pratique d'en faire une bibliothèque, en essayant de bien séparer C++/OpenGL et Qt ?

Je n'ai malheureusement pas encore pu compiler et tester cette source. En revanche, j'ai lu le code source, et j'ai quelques critiques à te proposer.
A noter que j'ai vais écrire beaucoup de choses négatives, mais ça ne va absolument pas dire que ton projet n'est pas bien. Bien au contraire. Pour progresser, il faut pointer ce qui ne va pas, pas ce qui va bien.

- Attention code mort (code en commentaire non utilisé)
- Des vrais commentaires en doxygen aurait été sympas (http://0217021.free.fr/portfolio/axel.berardino/articles/ecrire-de-bons-commentaires)
- Lorsque tu initialises des valeurs dans un constructeur de classe, utilise la liste d'initialisation plutôt que de mettre à jour les valeurs dans le corps de ton constructeur.
- Tu peux déclarer des variables où tu veux. Contrairement au C (non 98) tu peux déclarer une variable au milieu du code. Des fois tu utilises aussi des variables temporaires inutiles.
Ex: "distanceDroiteAuPoint" (réécriture)
float Coord3D::distanceDroiteAuPoint(const Coord3D& pointDeLaDroite, const Coord3D& point) const
{
  Coord3D vectDeuxPoints(pointDeLaDroite, point);
  Coord3D prod = crossProduct(vectDeuxPoints);
// On pourrait même mettre:
//  Coord3D prod = crossProduct(Coord3D(pointDeLaDroite, point));
  prod = prod - prod * 2;

  return prod.length() / this->length();
}

- Le "this->" n'est pas nécessaire. Il n'est nécessaire qu'en PHP (et souvent utilisé en Java), mais pas en C++.
- Lorsque tu passes en argument un type pod (int, float, char, etc...), inutile de mettre const devant, vu que la valeur est passée par copie. const float <=> float lors d'un passage d'argument.
- Par convention, on essaie de différencier une variable locale, d'un attribut. Il est d'usage d'ajouter un signe distinctif. (Par exemple: float _x; pour ta classe 3DCoord).
- Les membres en public, c'est moyen... Si tu fais un "getter" et un "setter" inlinés, tu gardes l'encapsulation sans perte de performance.
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Lorsque tu veux créer une énumération, n'utilise pas de #define ! Utilise un "enum" ! Normalement en C++, tu n'as jamais à utiliser un define. Si tu as besoin d'une valeur constante, on créé généralement une variable "static const" correctement typée.
- En génie logiciel, si tu créés une classe "Objet", c'est que tu as soucis de conception. Ici, tu ne fais heureusement pas tout hériter de cette classe. Le nom n'est en revanche pas très judicieusement choisie.
- vector< vector< float > > violent en terme de performance vu que tu connais la taille exact de tes tableaux. Deux solutions:
* Tu fais du C++ "normal" => utilise une classe templatée qui encapsule un tableau statique dont tu fixes la taille.
* Tu fais du C++0X => utilise un std::vector<std::array<float, 3>>
- vector.resize => Attention: resize change la taille externe du tableau, mais pas sa capacité. Ici, vu que tu ne le fais qu'au chargement, il n'y a pas de souci. Mais si tu fais la chose suivante:
- std::vector<float> tab;
tab.resize(1000);
// puis
tab.resize(1);
// Le tableau prend toujours de la place en mémoire.
Pour éviter cela, deux solutions:
* Tu fais du C++ "normal" => utilise le "swap trick" après ton resize: tab.swap(tab);
* Tu fais du C++0X => utilise tab.shrink_to_fit();

- Style: Les booléens ne s'utilisent pas comme des entiers:
* if (_isDead == true) => if (_isDead)
* if (_isDead == false) => if (!_isDead)

- Librairie => Bibliothèque (librairie est une traduction incorrecte de "library")

- if (_typeDeCamera == MINICARTE) [...] if (_typeDeCamera == VUEPRINCIPALE): Quand tu as des enum, utilise un switch plutôt que plein de if.
- gestionArme(Objet *listeObjets[], int nombreObjets) => C'est bizarre de déclarer utiliser un tableau d'Objet, pour n'en utiliser que le premier.
- Objet *liste_objets[50]; => Pourquoi 50 ? Si tu ne connais pas le nombre par avance, un tableau dynamique serait peut être adapté.

Commentaire de envi33 le 25/07/2011 16:58:00

Et bien, je n'en attendais pas autant, je te remercie beaucoup pour toutes ces indications qui vont beaucoup m'aider, et je vais de ce pas améliorer mon code pour la version finale.

Encore merci!

Commentaire de envi33 le 25/07/2011 20:14:11

@CptPingu
J'ai pu modifier tout le code (et apprendre pas mal de chose en passant) pour la prochaine version, mais je bute sur les vector :

- Pourquoi y a-t-il un soucis avec la déclaration :
vector< vector< float > > _tableauMesh;
Je pensais que cette ligne ne consommait rien en mémoire étant donné que je lui donne pas le nombre de case?

Commentaire de CptPingu le 26/07/2011 00:07:37 administrateur CS

> - Pourquoi y a-t-il un soucis avec la déclaration :
> vector< vector< float > > _tableauMesh;
> Je pensais que cette ligne ne consommait rien en mémoire étant donné que je lui donne pas le nombre de case?

J'ai du mal m'exprimer. Il n'y a pas de problème avec la déclaration. Il y a un souci d'utilisation mémoire supplémentaire lors de l'utilisation.
En effet, un std::vector, en interne, ne s'amuse pas à faire un realloc à chaque fois que tu changes sa taille. A chaque fois que sa taille dépasse sa capacité (capacité = sa taille interne), il double sa capacité. Avec cette technique, tu limites grandement les allocations. En contrepartie, tu peux très bien te retrouver avec une taille de 1000 et une capacité de 3000 (exemple bidon, attention [1]). Donc si tu as plein de vector de vector, inutile de te faire un dessin...
Néanmoins, avec un resize (taille) + reserve (capacité) on peut s'en sortir. Mais autant utiliser un tableau statique plutôt qu'un vector dynamique, si tu cherches à représenter un tableau statique !

[1] Généralement, les implémentations de STL (oui, il y en a plusieurs qui existent), utilisent la technique de puissance de deux. La capacité passe de 1,2,4,8,16,32,64,etc...
Ex: resize(5) => capacité 8
resize (260) => capacité 512.

Commentaire de envi33 le 26/07/2011 10:49:28

Ok j'ai compris! Je continue les modifs!

Commentaire de buno le 26/07/2011 13:49:29 administrateur CS

Hello,
Très bonne source! Très bonne remarques également de CptPingu.

Commentaire de opossum_farceur le 26/07/2011 17:07:17

Hi!

Compilation réussie avec Qt4.70+minGW sous Win7 32 bits.
Exécution ok!

Le code :
Mon intérêt s'est focalisé sur la méthode "OpenGLWidget::paintGL", qui est le centre opérationnel de toute application reposant sur QGLWidget.
Je vois que la scène est entièrement recalculée à chaque image : pour l'instant ton application ne fait pas grand chose, les ressources sont donc suffisantes, mais plus tard?
Les moyens d'optimiser ces calculs existent, l'un d'entre eux s'appelle " Vertex Buffer Objects" ou "VBO", dont la mise en oeuvre est rationalisée dans la classe de Qt "QGLBuffer".
Ces techniques d'optimisation reposent cependant sur l'existence de tableaux/vecteurs à une dimension.
Des déclarations telles que :
std::vector< std::vector< std::vector< float > > > _tableauMesh
sont donc satisfaisantes pour l'esprit mais impropres à un usage orienté "optimisation".
Sur ce sujet, un document récent à potasser :
http://gbelz.developpez.com/remi-achard/gpu-avance-avec-qt/
Ah, je vois que tu as créé une classe "Coord3D", c'est tout à ton honneur, mais connais-tu l'existence de la classe " QVector3D" ? (et sa fonction static "QVector3D::normal", qui fait des merveilles pour le calcul des normales).
Bonne continuation...

Commentaire de envi33 le 26/07/2011 18:17:32

Eh bien je ne m'attendais pas à autant de bon conseil!

- En effet je n'ai pas intégré les VBO par manque de connaissances, mais je crois que je vais devoir inévitablement m'y plonger :D, surtout si Qt me vient en aide...
- Et je n'avais pas pensé à la classe QVector3D, je vais certainement y gagner, ne serais-ce qu'en simplicité, tu as raison.

(merci pour le test d'exécution!)

Commentaire de LeFauve42 le 01/08/2011 13:46:54

Bonjour,

J'ai survole une partie du code, tres clair et tres bien commente :o) mais j'ajoute ma petite remarque :
Dans ton whellEvent(), tu verifies que la nouvelle vitesse est entre 0 et 6 avant d'appeler joueur->setVitesse().
En toute rigueur, si tu respectes le paradigme de la programmation objet c'est dans setVitesse() que tu devrais faire ce test. C'est en effet l'objet joueur qui sait quelles vitesses sont valides ou pas pour lui (et si tu fais du polymorphysme avec plusieurs classes derivees de joueur (par exemple si tu peux jouer un bonhomme, un tank ou un avion), chacune peut avoir un comportement different sans que tu ais desoin d'adapter le code principal du programme).

J'ai aussi une petite remarque sur une des remarques de CptPingu :
> Lorsque tu passes en argument un type pod (int, float, char, etc...), inutile de mettre
> const devant, vu que la valeur est passée par copie. const float <=> float lors d'un
> passage d'argument.

Je ne suis pas d'accord. Const est surtout la pour faciliter la maintenance et la relecture du code. Quand je vois qu'une fonction prend un argument "const", je sais qu'il est constant, sans avoir a reflechir si dans ce language la il est de toutes facons passe en recopie ou pas.
Ca aide aussi si par erreur quelqu'un essaie de modifier cet argument dans la fonction.
Avec le const, ca va generer une erreur de compilation, et il sera donc facile de trouver/corriger l'erreur. Sans le const, ca va compiler correctement, mais la valeur ne sera pas modifiee dans la fonction appelante. D'ou un bug bizarre lors de l'execution qui a toutes les chances de passer inapercu jusqu'a la livraison :o)

Bref, si techniquement c'est vrai que ca ne change rien avec ces types, ce n'est pas inutile d'utiliser const quand meme.

Eric

Commentaire de envi33 le 02/08/2011 01:16:36

Je suis tout à fait d'accord LeFauve42, maintenant que j'ai ajouté les VBO je vais changer ça ;)

Commentaire de tatarus le 04/08/2011 13:39:40

bonjour
Compilation OK

mais a lexecution :
     + Support OpenGL : OK
     ----->ERREUR 01 ; Chargement du fichier map : FAILED
     ..\Desktop\Envi3D-build-desktop\debug\Envi3D.exe s'est terminé avec le code -1073741819

Commentaire de envi33 le 04/08/2011 21:54:47

Tatarus je pense qu'il n'a juste pas trouvé le chemin du fichier map (listeObjets.txt), le programme est écrit pour être exécuter dans le répertoire source (celui où il y a le fichier map, et QtCreator le fait généralement automatiquement. Le tien doit l'exécuter dans le dossier debug, il te suffit de changer cela dans la config (à gauche projets->tab 'executer'->repertoire de travail). Ou de déplacer le .exe dans le dossier source...

Y-a-t-il aussi des erreurs juste après avec tous les chargements de fichiers?
Merci!

Commentaire de Actares1456 le 15/08/2011 09:56:21

Bonjour envi33.
Enfait la question peut parraître bête mais j'ai aucunne idéée de ce que je dois mettre en".exe" et non plus comment le faire. Enfait je suis un débutant débutant mais je m'interesse beaucoup au millieux de la programation donc ça serait sympa que tu m'explique! Sinon j'ai jeté un oeil à tes codes. Je vais pas te cacher que la plupart des codes sont trops complex pour moi,mais de ce que je comprend, pour moi, c'est juste trop "balaize"!
Continue c'est extra!

Commentaire de envi33 le 16/08/2011 01:05:45

Bonsoir Actares1456!
Si tu veux juste le lancer facilement télécharge plutôt le zip complet sur le site officiel du projet, il n'y a plus qu'à dézipper et à lancer le .exe:
http://envi3d.wikeo.net/

Et je t'assure que je ne suis pas un crack de la programmation, il y a juste beaucoup de C++, ce qui ne rend pas la lecture facile, et des commandes opengl et qt. Tout ça s'apprend avec un peu d'entrainement sur le siteduzero.com!
C'est un très bon site pour commencer et ne pas s'embourber dans des codes inutiles et ennuyants^^
Bon courage à toi!

(pour donner des nouvelles, j'en suis à 80% de la version 2 du jeu, avec l'éditeur de carte, la course au drapeau et les ennemi pour vous barrer la route à coup de tir de barrage. En effet j'utilise à présent complètement les classe qVector et qVector3D et j'ai finis de tout transformer en VBO! A bientôt et merci pour tous vos conseils!)

Commentaire de Actares1456 le 16/08/2011 12:19:43

Merci enfiniment, si j'ai pris un peu de temps avant de te répondre c'est que j'était sur un projet. Enfait j'étrait entrain de concevoir un petit code en c++ et Managed pour un détécteur de mouvement avec la webcam. J'en suis encore qu'a la création du squelette mais comme je suis encore un débutant débutant, ça me prend un peu de temps pour trouver/écrire/... Si non j'ai regarder comme tu m'as dit et je trouve ça toujour trop "balaize"!XD

Commentaire de envi33 le 16/08/2011 12:29:11

Lol merci beaucoup ;) bonne chance pour le détecteur de mouvement, c'est une super projet!

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Objects 3D Opengl [ par mastave ] Comment inclure dans un fenêtre OpenGl un fichier 3D DXF ou3DS??? un ptit jeu [ par BLaFarD ] euh, je viens de me pondre un petit moteur 3d de merde en opengldonc, si qlqun veut me filer des model 3d k'il a fait (sous 3dsmax si possible), bah, Moteur 3d OpenGL [ par Stormy ] Salut. Je recherche des personnes motives pour travailler sur un moteur 3d sous OpenGL. Les bases sont deja etablies (Detection de collisions, sons, m projet jeu voiture 3D [ par supergrey ] Bonjour a tous.Dans le cadre de notre dernier projet de développement, nous proposons au modéliste 3D un partenariat des plus simples.En effet nous vo OpenGl et objets 3D [ par mshn ] bonjour, est ce qu'on peux céer des objets 3D sous OpenGl, et les manipuler (animer et déplacer) par programme en utilisant un environnement de C++ ? nous faisont un jeux dbz en 3d [ par ghyslain ] nous faisont un jeux dbz en 3dnous avons besoins de quelqu'un qui apprenne ourenforce les connaissance du reste de l'équipe (opengl, moteur 3d...)nous nous faisont un jeux dbz en 3d [ par ghyslain ] nous faisont un jeux dbz en 3dnous avons besoins de quelqu'un qui apprenne ourenforce les connaissance du reste de l'équipe (opengl, moteur 3d...)nous nous faisont un jeux dbz en 3d [ par ghyslain ] nous faisont un jeux dbz en 3dnous avons besoins de quelqu'un qui apprenne ourenforce les connaissance du reste de l'équipe (opengl, moteur 3d...)nous Charger un model 3D en C++ avec opengl [ par smoove5198 ] Bonjour,j'essaye depuis un moment de charger un model 3D avec opengl en C++, pour ca j'utilise le seul format de fichier que je connaisse et dont j'ai


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,552 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales