430 likes | 664 Vues
GRAPHISME PAR ORDINATEUR. SIF-1032. Contenu du cours 5. Visualisation 3D Pipeline de visualisation Coordonnées de visualisation Projection orthographique (Voir ORTHO) Piles de matrices (Voir ATOM) LECTURES: Chapitres 5 et 7. Visualisation 3D. Pipeline de visualisation
E N D
GRAPHISME PAR ORDINATEUR SIF-1032
Contenu du cours 5 • Visualisation 3D • Pipeline de visualisation • Coordonnées de visualisation • Projection orthographique (Voir ORTHO) • Piles de matrices (Voir ATOM) • LECTURES: Chapitres 5 et 7
Visualisation 3D • Pipeline de visualisation • La visualisation 3D peut s’apparenter à la prise d’images par caméra • Étapes de capture de photographies • Positionnement de la caméra • Orientation de la caméra • Ajustement de l’ouverture
Visualisation 3D • Pipeline de visualisation • Étapes de transformation des coordonnées du monde 3D aux coordonnées de l’écran 2D • Modélisation de la scène • Transformation des coordonnées du monde en coordonnées de visualisation • spécification de la position de l’observateur • Positionnement du plan de projection • Transformation des coordonnées de visualisation en coordonnées de projection dans le plan de projection • Transformation des coordonnées de projection dans les coordonnées de l’écran
Visualisation 3D • Pipeline de visualisation • Étapes de transformation des coordonnées du monde 3D aux coordonnées de l’écran 2D
Visualisation 3D • Coordonnées de visualisation • Pour définir une vue d’une scène il faut d’abord établir le système de coordonnées de visualisation • De plus, le plan de projection est perpendiculaire à l’axe de visée zv
Visualisation 3D • Coordonnées de visualisation • Étapes de création du système de coordonnées de visualisation • Choix d’une position en coordonnées du monde 3D qui est le point de référence de visualisation • Choix de la direction de l’axe de visualisation zv et l’orientation du plan de visualisation en spécifiant le vecteur normal au plan de visualisation N • Vecteur dans les coordonnées du monde 3D • Sélection d’un point à voir (look-at-point) relatif au système de coordonnées de visualisation
Visualisation 3D • Coordonnées de visualisation • Sélection d’un point look-at-point
Visualisation 3D • Coordonnées de visualisation • Étapes de création du système de coordonnées de visualisation • Choix d’un vecteur V (view-up vector) qui spécifie la direction positive de l’axe yv • Déterminer la direction de l’axe xv par
Visualisation 3D • Coordonnées de visualisation • Détermination du système d ’axes de visualisation • Calcul des vecteurs unitaires uvn et création directe de la matrice de transformation composite • Avec N et V nous pouvons déduire
Visualisation 3D • Coordonnées de visualisation • Transformations des coordonnées du monde 3D aux coordonnées de visualisation
Visualisation 3D • Coordonnées de visualisation • Transformations des coordonnées du monde 3D aux coordonnées de visualisation • Translation du point de référence de visualisation à l’origine du système d’axes du monde 3D • Appliquer des rotations pour aligner les axes des 2 systèmes d’axes Rx: rotation de l’axe zv par rapport à l’axe xw, dans le plan xwzw Ry: rotation de zv par rapport à l’axe yw pour l’amener sur l’axe zw Rz: rotation de yv par rapport à l’axe zw pour l’amener sur l’axe yw
Visualisation 3D • Coordonnées de visualisation • Transformations des coordonnées du monde 3D aux coordonnées de visualisation • Si nous connaissons le vecteur uvn, la matrice de transformation composite devient
Visualisation 3D • Coordonnées de visualisation • Détermination du système d ’axes de visualisation • Avec OpenGL, la matrice de transformation de visualisation Mw,v est déduite par la commande gluLookAt() • gluLookAt(locX,locY,locZ,dirX,dirY,dirZ,upX,upY,upZ • généralement le vecteur up pointe dans la direction y positive donc (0.0f,1.0f,0.0f) • LocX, locY, locZ représente la position de l ’observateur • dirX, dirY, dirZ représente le Look-at point • Positionnement de la caméra (observateur) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(4,4,4,0,1,0,0,1,0);
Visualisation 3D • Projections • Permet de projeter les coordonnées de visualisation 3D sur un plan 2D • Projection parallèle (orthographique) • Projection de points 3D sur le plan de visualisation 2D selon des lignes parallèles • Préservation des proportions relatives mais irréaliste
Visualisation 3D • Projections • Projection parallèle • Projection orthographique • Utilisée en dessin technique
Visualisation 3D • Projections • Projection parallèle • Transformations permettant la projection
Visualisation 3D • Projections • Projection parallèle • Transformations permettant la projection orthographique avec OpenGL • Avec OpenGL, la matrice de transformation de projection (GL_PROJECTION) est déduite par la commande glOrtho() • glOrtho(minX,maxX,minY,maxY,minZ,maxZ) • minX, maxX représente la largeur de la fenêtre • minY, maxY représente la hauteur de la fenêtre • minZ, maxZ représente la profondeur de champ • Création du volume de visualisation glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-3.2,3.2,-2.4,2.4,1,50);
Visualisation 3D • Projections (Exemple ORTHO)
Visualisation 3D • Projections (Exemple ORTHO)
Visualisation 3D • Projections (Exemple ORTHO)
Piles de matrices • Il n ’est pas toujours désirable de réinitialiser la matrice MODELVIEW à l ’identité avant de déplacer des objets • Souvent, nous voulons conserver la matrice courante et la restaurer après avoir déplacé des objets • Cette approche est appropriée lorsque nous avons généré la matrice MODELVIEW à partir des transformations de visualisation • OpenGL maintient des piles de matrices pour les matrices MODELVIEW et PROJECTION
Piles de matrices • Nous pouvons alors conserver la matrice courante sur le dessus de la pile (push), appliquer une transformation sur la matrice courante et restaurer l ’état de la matrice courante par un pop
Piles de matrices • Exemple ATOM • Comment initialiser la matrice de visualisation Mw,v glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-100.0f); • Comment placer un électron sur sa trajectoire glPushMatrix(); // conserve la matrice de transformation de visualisation glrotatef(fElect1,0.0f,1.0f,0.0f); // rotation du système de coordonnées // par rapport à y d ’un angle fElect1 glTranslatef(90.0f,0.0f,0.0f); // décalage de l ’origine à la trajectoire glutSolidSphere(6.0f,15,15) glPopMatrix(); // restauration de la matrice transformation de visualisation
Piles de matrices • Exemple ATOM • Comment initialiser la matrice de visualisation Mw,v
Piles de matrices • Exemple ATOM • Comment placer un électron sur sa trajectoire
Piles de matrices • Exemple ATOM • Comment placer un électron sur sa trajectoire
Piles de matrices • Exemple ATOM • Fonctions utiles • glutPostRedisplay(); • Fonction qui produit un message à OpenGL que la fenêtre doit être rafraîchie (Voir BOUNCE) • glutTimerFunc(temps (msec), (*func)(int nomFunc), int value); • Permet de fournir le pointeur sur la fonction nomFunc qui doit être appelée après qu’une période de temps soit écoulée
Piles de matrices • Exemple ATOM
Génération du modèle des objets • Exemple page 276 (Hill) • Classe scene • scn.read() • scn.drawSceneOpenGL() dans la fonction d ’affichage displaySDL() • Langage SDL • Model Loading Lesson 31 (NeHe.gamedev.net) • Importer des objets en format .ms3d
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Importer des objets en format .ms3d
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Structures de données du modèle (voir la classe Model dans le fichier Model.h) • Structures associées aux sommets (vertices) // Vertex Structure struct Vertex { char m_boneID; // For Skeletal Animation float m_location[3]; }; // Vertices Used int m_numVertices; Vertex *m_pVertices;
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Structures de données du modèle (voir la classe Model dans le fichier Model.h) • Structures associées aux triangles (triangle) // Triangle Structure struct Triangle { float m_vertexNormals[3][3]; float m_s[3], m_t[3]; // Texture coordinates int m_vertexIndices[3]; }; // Triangles Used int m_numTriangles; Triangle *m_pTriangles;
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Structures de données du modèle (voir la classe Model dans le fichier Model.h) • Structures associées aux treillis (mesh) // Mesh struct Mesh { int m_materialIndex; int m_numTriangles; int *m_pTriangleIndices; }; // Meshes Used int m_numMeshes; Mesh *m_pMeshes;
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Structures de données du modèle (voir la classe Model dans le fichier Model.h) • Structures associées aux propriétés matérielles (material) // Material Properties struct Material { float m_ambient[4], m_diffuse[4], m_specular[4], m_emissive[4]; float m_shininess; GLuint m_texture; char *m_pTextureFilename; }; // Materials Used int m_numMaterials; Material *m_pMaterials;
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture du fichier .ms3d) bool MilkshapeModel::loadModelData( const char *filename ) { ifstream inputFile( filename, ios::in | ios::binary | ios::nocreate ); if ( inputFile.fail()) return false; // "Couldn't Open The Model File."
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (calcul de la dimension du fichier) inputFile.seekg( 0, ios::end ); long fileSize = inputFile.tellg(); inputFile.seekg( 0, ios::beg );
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture du fichier dans un tampon) byte *pBuffer = new byte[fileSize]; inputFile.read( pBuffer, fileSize ); inputFile.close();
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture du header et validation) const byte *pPtr = pBuffer; MS3DHeader *pHeader = ( MS3DHeader* )pPtr; pPtr += sizeof( MS3DHeader ); if ( strncmp( pHeader->m_ID, "MS3D000000", 10 ) != 0 ) return false; // "Not A Valid Milkshape3D Model File.« if ( pHeader->m_version < 3 || pHeader->m_version > 4 ) return false; // "Unhandled File Version. Only Milkshape3D Version 1.3 And 1.4 Is Supported."
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture des sommets) int nVertices = *( word* )pPtr; m_numVertices = nVertices; m_pVertices = new Vertex[nVertices]; pPtr += sizeof( word ); int i; for ( i = 0; i < nVertices; i++ ) { MS3DVertex *pVertex = ( MS3DVertex* )pPtr; m_pVertices[i].m_boneID = pVertex->m_boneID; memcpy( m_pVertices[i].m_location, pVertex->m_vertex, sizeof( float )*3 ); pPtr += sizeof( MS3DVertex ); }
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture des triangles) int nTriangles = *( word* )pPtr; m_numTriangles = nTriangles; m_pTriangles = new Triangle[nTriangles]; pPtr += sizeof( word ); for ( i = 0; i < nTriangles; i++ ) { MS3DTriangle *pTriangle = ( MS3DTriangle* )pPtr; int vertexIndices[3] = { pTriangle->m_vertexIndices[0], pTriangle->m_vertexIndices[1], pTriangle->m_vertexIndices[2] }; float t[3] = { 1.0f-pTriangle->m_t[0], 1.0f-pTriangle->m_t[1], 1.0f-pTriangle->m_t[2] }; memcpy( m_pTriangles[i].m_vertexNormals, pTriangle->m_vertexNormals, sizeof( float )*3*3 ); memcpy( m_pTriangles[i].m_s, pTriangle->m_s, sizeof( float )*3 ); memcpy( m_pTriangles[i].m_t, t, sizeof( float )*3 ); memcpy( m_pTriangles[i].m_vertexIndices, vertexIndices, sizeof( int )*3 ); pPtr += sizeof( MS3DTriangle ); }
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture des treillis) int nGroups = *( word* )pPtr; m_numMeshes = nGroups; m_pMeshes = new Mesh[nGroups]; pPtr += sizeof( word ); for ( i = 0; i < nGroups; i++ ) { pPtr += sizeof( byte ); // Flags pPtr += 32; // Name word nTriangles = *( word* )pPtr; pPtr += sizeof( word ); int *pTriangleIndices = new int[nTriangles]; for ( int j = 0; j < nTriangles; j++ ) { pTriangleIndices[j] = *( word* )pPtr; pPtr += sizeof( word ); } char materialIndex = *( char* )pPtr; pPtr += sizeof( char ); m_pMeshes[i].m_materialIndex = materialIndex; m_pMeshes[i].m_numTriangles = nTriangles; m_pMeshes[i].m_pTriangleIndices = pTriangleIndices; }
Génération du modèle des objets • Model Loading Lesson 31 (NeHe.gamedev.net) • Chargement du modèle (lecture des propriétés) int nMaterials = *( word* )pPtr; m_numMaterials = nMaterials; m_pMaterials = new Material[nMaterials]; pPtr += sizeof( word ); for ( i = 0; i < nMaterials; i++ ) { MS3DMaterial *pMaterial = ( MS3DMaterial* )pPtr; memcpy( m_pMaterials[i].m_ambient, pMaterial->m_ambient, sizeof( float )*4 ); memcpy( m_pMaterials[i].m_diffuse, pMaterial->m_diffuse, sizeof( float )*4 ); memcpy( m_pMaterials[i].m_specular, pMaterial->m_specular, sizeof( float )*4 ); memcpy( m_pMaterials[i].m_emissive, pMaterial->m_emissive, sizeof( float )*4 ); m_pMaterials[i].m_shininess = pMaterial->m_shininess; m_pMaterials[i].m_pTextureFilename = new char[strlen( pMaterial->m_texture )+1]; strcpy( m_pMaterials[i].m_pTextureFilename, pMaterial->m_texture ); pPtr += sizeof( MS3DMaterial ); } reloadTextures();