C++ & SDL = Moteur 3D :)
Notre prof de C++ nous a donné un TP afin de découvrir l'orienté objet à travers un projet sympa : afficher un cube en 3D et le faire tourner.
Bon perso je connais le C++ depuis ma première année de DUT donc c'était les doigts dans le nez concernant le développement des classes, j'ai même fait un peu d'héritage et de lecture de fichier^^
Revenons au projet : l'objectif est de gérer un objet 3D de 1200 points, chaque point possédant 3 coordonnées (x,y,z) car on travail dans l'espace. Mais ce n'est pas tout, il fallait aussi transformer les coordonnées 3D(notre objet) en coordonnées 2D(écran) ! Et enfin, chose la plus dure : appliquer des matrices de rotation d'axe X, Y ou Z sur les points de notre objet afin de le faire tourner !
Vous l'avez bien compris, le but n'était pas d'utiliser une API 3D (directx, opengl, ...) qui gère elle même les rotations et l'affichage en 2D de vos objets, mais bien une API 2D afin de nous même calculer les coordonnées des points sur l'écran :)
Bref le TP m'avait l'air assez sympa, car j'ai rarement eu l'occassion de faire un truc aussi fun (animé, graphique, ...), ormis de créer des fichiers d'images de fractales.
J'ai choisi d'utiliser la SDL afin de réaliser le TP, il y'a un excellent tutorial sur le site du zero pour prendre en main cette librairie.
Explication pour un point de programmation :
Comme précisé à la partie 4 de cette page, "la SDL ne propose aucune fonction pour dessiner pixel par pixel. Mais on a le droit de l'écrire nous-même :)"
Donc je tiens à préciser que tout le code SDL présent dans mes sources provient du site du zéro [merci les gars], hormis peut être une ou deux lignes concernant les évènements claviers, mais j'ai commenté à ce moment là.
Pour enlever le "fullscreen" si ca vous embête, ou bien si vous voulez admirer l'utilisation CPU (j'suis chou une star) pendant l'exécution, il suffit d'enlever " | SDL_FULLSCREEN" dans l'appel de la fonction "SDL_SetVideoMode", dans le haut de main.cpp
Ami(e) développeur(se), je t'invite à lire ou relire sushi (oO), afin de savoir comment faire proprement les directives pré-processeur #include et autres using namespace std; :)
Euh ... ah oui les sources, me semblait bien avoir oublié un truc!
J'ai utilisé l'IDE Dev-C++, j'ai mis le projet entier dans le zip, avec le .exe compilé et le fichier SDL.dll nécessaire lors de l'éxécution.
Version 1 : Regarder "A LIRE.txt" avant de lancer le .exe
Version 2 : Version similaire sauf que :
-la rotation de chaque objet ne s'effectue pas en fonction du centre du repère mais du centre de l'objet
-matrices de translation + rapides
-ajout voiture :)
Fichiers à voir :
explication_rotation-translation.jpg
voiture1.txt
voiture2.txt
Pour infos j'ai obtenu ces coordonnées avec 2 modèles de voiture de Trackmania (grand fan, team Szchm0p!) grâce à Blender, un super logiciel de modélisation 3D gratuit :)
N'hésitez pas pour toute question, aussi ridicule soit-elle.
Bon perso je connais le C++ depuis ma première année de DUT donc c'était les doigts dans le nez concernant le développement des classes, j'ai même fait un peu d'héritage et de lecture de fichier^^
Revenons au projet : l'objectif est de gérer un objet 3D de 1200 points, chaque point possédant 3 coordonnées (x,y,z) car on travail dans l'espace. Mais ce n'est pas tout, il fallait aussi transformer les coordonnées 3D(notre objet) en coordonnées 2D(écran) ! Et enfin, chose la plus dure : appliquer des matrices de rotation d'axe X, Y ou Z sur les points de notre objet afin de le faire tourner !
Vous l'avez bien compris, le but n'était pas d'utiliser une API 3D (directx, opengl, ...) qui gère elle même les rotations et l'affichage en 2D de vos objets, mais bien une API 2D afin de nous même calculer les coordonnées des points sur l'écran :)
Bref le TP m'avait l'air assez sympa, car j'ai rarement eu l'occassion de faire un truc aussi fun (animé, graphique, ...), ormis de créer des fichiers d'images de fractales.
J'ai choisi d'utiliser la SDL afin de réaliser le TP, il y'a un excellent tutorial sur le site du zero pour prendre en main cette librairie.
Explication pour un point de programmation :
Comme précisé à la partie 4 de cette page, "la SDL ne propose aucune fonction pour dessiner pixel par pixel. Mais on a le droit de l'écrire nous-même :)"
Donc je tiens à préciser que tout le code SDL présent dans mes sources provient du site du zéro [merci les gars], hormis peut être une ou deux lignes concernant les évènements claviers, mais j'ai commenté à ce moment là.
Pour enlever le "fullscreen" si ca vous embête, ou bien si vous voulez admirer l'utilisation CPU (j'suis chou une star) pendant l'exécution, il suffit d'enlever " | SDL_FULLSCREEN" dans l'appel de la fonction "SDL_SetVideoMode", dans le haut de main.cpp
Ami(e) développeur(se), je t'invite à lire ou relire sushi (oO), afin de savoir comment faire proprement les directives pré-processeur #include et autres using namespace std; :)
Euh ... ah oui les sources, me semblait bien avoir oublié un truc!
J'ai utilisé l'IDE Dev-C++, j'ai mis le projet entier dans le zip, avec le .exe compilé et le fichier SDL.dll nécessaire lors de l'éxécution.
Version 1 : Regarder "A LIRE.txt" avant de lancer le .exe
Version 2 : Version similaire sauf que :
-la rotation de chaque objet ne s'effectue pas en fonction du centre du repère mais du centre de l'objet
-matrices de translation + rapides
-ajout voiture :)
Fichiers à voir :
explication_rotation-translation.jpg
voiture1.txt
voiture2.txt
Pour infos j'ai obtenu ces coordonnées avec 2 modèles de voiture de Trackmania (grand fan, team Szchm0p!) grâce à Blender, un super logiciel de modélisation 3D gratuit :)
N'hésitez pas pour toute question, aussi ridicule soit-elle.
Aucun commentaire:
Enregistrer un commentaire