Initiation à la librairie graphique VTK Telecom Bretagne, Février 2011 Jean CHAOUI Objectif : Être capable de créer une scène 3D simple composée de quelques primitives géométriques et de pouvoir modifier, de manière non interactive ici, différents paramètres (couleurs, position, taille, éclairage, caméra, placage de texture). Vous trouverez la documentation à l'adresse suivante : http://www.vtk.org/doc/release/5.0/html/classes.html Table des matières 1. Générer un makefile...2 2. Créer une scène...3 3. Définition et utilisation d'une classe scene...7 4. Propriétés des acteurs...8 5. Caméra...10 6. Lumière...11 7. Texture...12 1. Générer un makefile Pour générer un makefile paramétrant par défaut les chemins liés à VTK, nous utiliserons le logiciel CMake (http://www.cmake.org). Ce logiciel permet de lier, de manière relativement simple, différents fichiers sources et librairies participant à un projet. Pour générer la base du projet, suivez les étapes suivantes : 1. Créer un dossier pour mettre tous les fichiers relatifs au TP. 2. Copier dans ce dossier les fichiers CMakeLists-pc-iti.txt et main.cxx depuis le dossier zippé sur http://perso.telecom-bretagne.eu/jeanchaoui/vtk_tp/ 3. Renommer le fichier CmakeLists-pc-iti.txt en CMakeLists.txt 4. Ouvrir une console et placer vous dans le répertoire. 5. Taper "ccmake.", sans les guillemets. 6. Taper "c", sans les guillemets. 7. Taper "c", sans les guillemets. 8. Taper "g", sans les guillemets. Le makefile est généré. 9. Taper "make", sans les guillemets, pour compiler. 10. Taper "./tpvtk", sans les guillemets, pour exécuter. Le message Hello VTK doit apparaitre dans la console.
2. Créer une scène Modifier le fichier main.cxx en suivant les recommandations suivantes. A chaque étape ne pas oublier de sauvegarder le fichier puis de compiler à l'aide de la commande "make", sans les guillemets. Vous ne verrez quelque chose qu'à l'issue de l'étape 5. Etape 1 : ouvrir une fenêtre VTK et créer un renderer int main() { // a renderer and and render window vtkrenderer *renderer = vtkrenderer::new(); renderer->setbackground(0.7,0.7,0.7); // couleur d'arrière plan vtkrenderwindow *renderwindow = vtkrenderwindow::new(); renderwindow->render(); } Etape 2 : créer un objet géométrique #include <vtkspheresource.h> int main() { // a renderer and and render window vtkrenderer *renderer = vtkrenderer::new(); renderer->setbackground(0.7,0.7,0.7); vtkrenderwindow *renderwindow = vtkrenderwindow::new(); //create sphere geometry vtkspheresource *sphere = vtkspheresource::new(); sphere->setradius(1.0); sphere->setthetaresolution(18); sphere->setphiresolution(18); renderwindow->render(); } Etape 3 : transformer l'objet géométrique en objet graphique #include "vtkpolydatamapper.h" #include <vtkspheresource.h>
int main() { // a renderer and and render window vtkrenderer *renderer = vtkrenderer::new(); renderer->setbackground(0.7,0.7,0.7); vtkrenderwindow *renderwindow = vtkrenderwindow::new(); //create sphere geometry vtkspheresource *sphere = vtkspheresource::new(); sphere->setradius(1.0); sphere->setthetaresolution(18); sphere->setphiresolution(18); // map to graphics library vtkpolydatamapper *map = vtkpolydatamapper::new(); // permet le rendu surfacique map->setinput(sphere->getoutput()); renderwindow->render(); } Etape 4 : créer un actor et l'ajouter à la scène #include <vtkproperty.h> #include <vtkactor.h> #include <vtkpolydatamapper.h> #include <vtkspheresource.h> int main() { // a renderer and an render window vtkrenderer *renderer = vtkrenderer::new( ); renderer->setbackground(0.7,0.7,0.7); vtkrenderwindow *renderwindow = vtkrenderwindow::new( ); //create sphere geometry vtkspheresource *sphere = vtkspheresource::new( ); sphere->setradius(1.0); sphere->setthetaresolution(18); sphere->setphiresolution(18); // map to graphics library vtkpolydatamapper *map = vtkpolydatamapper::new( ); map->setinput(sphere->getoutput( )); // actor coordinates geometry, properties, transformation vtkactor *asphere = vtkactor::new( ); asphere->setmapper(map); asphere->getproperty( )->SetColor(0,0,1); // sphere color blue // add the actor to the scene renderer->addactor(asphere);
} renderwindow->render( ); Etape 5 : interagir avec la scène #include <vtkrenderwindowinteractor.h> #include <vtkproperty.h> #include <vtkactor.h> #include <vtkpolydatamapper.h> #include <vtkspheresource.h> int main() { // a renderer and and render window vtkrenderer *renderer = vtkrenderer::new(); renderer->setbackground(0.7,0.7,0.7); vtkrenderwindow *renderwindow = vtkrenderwindow::new(); // an interactor vtkrenderwindowinteractor *iren = vtkrenderwindowinteractor::new(); iren->setrenderwindow(renderwindow); //create sphere geometry vtkspheresource *sphere = vtkspheresource::new(); sphere->setradius(1.0); sphere->setthetaresolution(18); sphere->setphiresolution(18); // map to graphics library vtkpolydatamapper *map = vtkpolydatamapper::new(); map->setinput(sphere->getoutput()); // actor coordinates geometry, properties, transformation vtkactor *asphere = vtkactor::new(); asphere->setmapper(map); asphere->getproperty( )->SetColor(0,0,1); // sphere color blue // add the actor to the scene renderer->addactor(asphere); renderwindow->render(); //begin mouse action iren->start(); } Remarque : il est possible de visualiser la surface ou le maillage d'un objet en appuyant respectivement sur «s» (surfacic) et «w» (wireframe). 3. Définition et utilisation d'une classe scene
Afin de profiter de la programmation orientée objet que permet VTK, nous allons rajouter à notre projet deux fichiers définissant et implémentant la classe scene : scene.h et scene.cxx. Ils sont disponibles à http://perso.telecom-bretagne.eu/jeanchaoui/vtk_tp/. Après les avoir récupérer, il faut les rajouter au Makefile. Pour cela nous allons utiliser de nouveau CMake. 1. Ouvrir le fichier CMakelists.txt avec un éditeur de texte. 2. Remplacer # SOURCES SET(sceneVtk_SRCS main.cxx ) par # SOURCES SET(sceneVtk_SRCS scene.cxx main.cxx ) 3. Sauvegarder. 4. Taper "ccmake.", sans les guillemets. 5. Taper "c", sans les guillemets. 6. Taper "g", sans les guillemets. Le nouveau makefile est généré. 7. Taper "make", sans les guillemets. Remarque : dès que vous voulez créer une nouvelle classe mynewclass, créez un fichier mynewclass.h et mynewclass.cxx en vous inspirant de la classe scene. Puis rajouter la ligne mynewclass.cxx en suivant les étapes 1 à 7 précédentes. Exercice 1 : Ajouter les «include» nécessaires dans le fichier header pour supprimer les erreurs lors de la compilation. Compléter la méthode sphere( ) grâce à ce qui a été fait précédemment de sorte à afficher une sphère. 4. Propriétés des acteurs 4.1. Transformations géométriques Deux des principales méthodes de la classe vtkactor sont SetPosition( ) et RotateX( ) - ainsi que RotateY( ) et RotateZ( ). Consulter la documentation en ligne http://www.vtk.org/doc/release/5.0/html/classes.html Exercice 2 : 1. Ajouter un plan dans la scène en utilisant vtkplanesource (compléter la méthode plan()). Pour définir un plan, utiliser les méthodes SetOrigin( ), SetPoint1( ) et SetPoint2( ). 2. Appliquer des translations sur la sphère de sorte à créer une animation (compléter la méthode animateobject()). 3. Appliquer des rotations sur le plan de sorte à créer une animation (compléter la méthode animateobject()). 4.2. Couleur La méthode SetColor( ) de la classe vtkproperty a 3 paramètres correspondant aux 3 composantes RGB (Red Green Blue) de la couleur. Les paramètres varient entre 0 et 1. myactor->getproperty( )->SetColor(0,1,0) modifie la couleur en vert.
Exercice 3 : 1. Modifier la couleur de la sphère en rouge. 2. Modifier la couleur du plan en vert. 4.4. Ombrage Les trois façons de calculer les ombres sont Flat, Gouraud et Phong. Exercice 4 : 1. Remplacer la sphère et le plan par deux cylindres parallèles, de même couleur. 2. renderer->setbackground(1,1,1). Ainsi le fond sera blanc. 3. Appliquer une calcul d'ombre (Flat et Phong) différent sur chacun des cylindres. 4.5. Opacité5 : Appliquer une opacité différente sur chacun des deux cylindres. 4.6. Représentation Un même objet peut être représenté sous forme de points, sous forme de fil de fer ou sous forme de facettes. Exercice 6 : Représenter l'un des cylindres sous forme de points, le second sous forme de fil de fer et le troisième sous forme de facettes. 5. Caméra Une scène VTK inclut une caméra prédéfinie. Il est toutefois possible d'en modifier les paramètres via la commande renderer->getactivecamera( ) En vous référant à la documentation de la classe vtkcamera, effectuer une suite de rotations azimuthales. 6. Lumière Il est possible de mettre jusqu'à 8 sources lumineuses dans une scène VTK. Pour cela, il faut utiliser vtklight *light = vtklight::new( ); light->setposition(2,2,2); light->setintensity(1); renderer->addlight(light); Exercice 8 : En vous inspirant du code précédent, créer un éclairage tournant autour des trois cylindres. 7. Texture Le placage de texture est possible sous VTK. Il consiste à plaquer une image sur l'objet désiré. Exercice 9 : 1. Effacer les cylindres et dessiner un nouveau plan. 2. Copier l'image http://perso.telecom-bretagne.eu/jeanchaoui/vtk_tp/
3. Charger l'image. vtkbmpreader* reader = vtkbmpreader::new( ); reader->setfilename("road.bmp"); 4. Créer une texture. vtktexture* texture = vtktexture::new( ); texture->setinput(reader->getoutput( )); 5. Appliquer la texture au plan. planeactor->settexture(texture);
Examen L'objectif de l'examen est de créer une scène intégrant tous les éléments découverts jusqu'à présent. Cette scène doit représenter une salle d examen scanner (CT scan) d'un hôpital. Cette salle doit être composée au minimum d'un appareil scanner (CT-scan), la table du patient, de trois lampes intégrant des lumières. Une animation de caméra permettra de se déplacer dans la salle. Sur la table du scanner devra reposer un modèle 3D de corps humain. Au cours d'une animation, la table de patient avec le corps devront bouger et pénétrer dans le gantry du CT-scan et au moment où le patient passera entièrement dans le scanner, l'image d une coupe scanner devra s'afficher sur l'écran de l'imageur. Pour le reste vous êtes entièrement libres. L'originalité tant du graphique que du scénario sera prise en compte dans la note finale. Un effort devra être effectué sur la conception de la scène du point de vue de la programmation: essayez de tirer profit de la programmation objet en créant des classes. Par ailleurs le code devra être commenté. Après vous être assuré que votre programme compile et s'exécute, vous devrez nous remettre : Les sources :.cxx,.h Le fichier CmakeLists.txt Les fichiers annexes nécessaires (textures, modèles 3D,...). Par email à l adresse suivante : jean.chaoui@telecom-bretagne.eu Copie à john.puentes@telecom-bretagne.eu Sous forme d'un seul fichier compressé (zip, rar, tar.gz,...) Avant le lundi 14 Mars 2011. Toute soumission ne respectant ces contraintes ne sera considérée ni évaluée.