M1 - Images


TP1 - primitives et transformations



 

prise en main de gKit :

installez gKit et ses dépendances.

compilez la doc avec doxygen.
Elle sera consultable dans html/index.html. Les classes de bases sont documentées dans la partie "modules" de la documentation générée.

compilez tutos/tuto1.cpp et vérifiez que tout fonctionne.


n'oubliez pas qu'il y a des tutos dans la doc...


Partie 1 : triangulation et orientation.

exercice 1 : carré / rectangle

compilez tutos/tuto2.cpp et utilisez la classe Mesh pour décrire un carré. modifiez la fonction init(), pour afficher l'objet, ce sera dans la fonction draw( ).

quelle orientation est la meilleure ?
comment indiquer à openGL celle que vous avez choisi ?

il y a 2 manières d'utiliser les fonctions de Mesh :
Mesh mesh= create_mesh(GL_TRIANGLES);

// 1er triangle
push_vertex(mesh, x, y, z);
push_vertex(mesh, x, y, z);
push_vertex(mesh, x, y, z);

// 2ieme triangle
push_vertex(mesh, x, y, z);
push_vertex(mesh, x, y, z);
push_vertex(mesh, x, y, z);
Mesh mesh= create_mesh(GL_TRIANGLES);

// sommets
unsigned int a= push_vertex(mesh, x, y, z);
unsigned int b= push_vertex(mesh, x, y, z);
unsigned int c= push_vertex(mesh, x, y, z);
unsigned int d= push_vertex(mesh, x, y, z);

// triangle indexes
push_triangle(mesh, a, b, c);

il existe d'autres manières de décrire des triangles indexés, cf GL_TRIANGLE_STRIP et GL_TRIANGLE_FAN.

vérifiez que l'orientation de vos triangles est correcte. par défaut la fonction draw(mesh) affiche les triangles mal orientés avec des hachures oranges.
activez ou désactivez le test d'élimination des faces arrières (back face culling, cf tuto3GL) et changez l'orientation.

remarque : on peut définir une couleur par sommet avec vertex_color(mesh, make_color(r, g, b));

exercice 2 : transformations

et avec 2 carrés ? l'un à coté de l'autre ?

vous pouvez construire 2 meshs avec des coordonnées différentes, mais utiliser les transformations est beaucoup plus souple. cf make_translation( ), make_rotationZ( ) (pourquoi Z ?) dans mat.h...

et fournir 2 transformations différentes aux carrés pour qu'il s'affichent à des endroits différents : cf draw(mesh, model, view, projection), il faut modifier la transformation model...

Mesh mesh= create_mesh( ... );

// ajouter des sommets au mesh
{ ... }

// afficher le premier carre directement, sans transformations
draw(mesh, make_identity(), make_identity(), make_identity());

// afficher le 2ieme, avec une transformation pour le deplacer :
Transform m= make_xxx( ... );

draw(mesh, m, make_identity(), make_identity());


et si on fait tourner le 1er, comment faire bouger le 2ieme afin qu'il conserve la meme position relative ?

il est assez simple de contrôler l'animation au clavier, cf tutos/tuto3.cpp


et si la camera bougeait ? quelle transformation utiliser ?

pour vérifier, modifiez la transformation view de draw(mesh, model, view, projection);


Partie 2 : shaders

utilisez write_mesh(...) pour enregistrer votre carré dans un fichier .obj.

remarque : les couleurs de sommets ne sont pas enregistrées...


compilez shader_kit.cpp

chargez votre objet et tp1.glsl : ./bin/shader_kit tp1.glsl carre.obj (ou ./bin/gKit2light tp1.glsl carre.obj, si vous compilez avec les makefiles).

modifiez la position des sommets du carré en fonction du temps, déclarez uniform float time; dans le shader.

remarque : la liste des uniforms pré-déclarés par shader_kit est dans le tuto compiler un shader program.