logging in or signing up graphesDeScenes Mee12 Download Post to : URL : Related Presentations : Share Add to Flag Embed Email Send to Blogs and Networks Add to Channel Uploaded from authorPOINTLite Insert YouTube videos in PowerPont slides with aS Desktop Copy embed code: (To copy code, click on the text box) Embed: URL: Thumbnail: WordPress Embed Customize Embed The presentation is successfully added In Your Favorites. Views: 232 Category: Entertainment License: All Rights Reserved Like it (0) Dislike it (0) Added: November 14, 2007 This Presentation is Public Favorites: 0 Presentation Description No description available. Comments Posting comment... Premium member Presentation Transcript Graphes de scènesà l‘exemple de OpenSG: Graphes de scènes à l‘exemple de OpenSG Patrick Reuter LaBRI – INRIA futurs Université Bordeaux IProgramme: Programme 1.) Graphe de Scènes Motivation Exemples 2.) OpenSG Motivation Introduction Exemples 3.) Format de Fichiers 3D scène (VRML) 3D maillages (OBJ) 1.) Graphe de Scènes: 1.) Graphe de ScènesMotivation Scene Graphs: Motivation Scene Graphs OpenGL est très bas niveau Immediate mode based Pas de concepts „objet“ à part display lists Utilisateur a beaucoup de contrôle ... et beaucoup de pièges à rentrer dedans Il faut connaitre le Hardware très bien Motivation Graphes de Scène: Motivation Graphes de Scène Graphes de Scènes sont à un niveau supérieur Retained mode Établir la structure de données une fois Après l‘utiliser le plus souvent possible Orienté Objet Beaucoup d‘optimisation possible „Graphes de Scènes pour OpenGL sont ce qui est STL pour C++“ Exemple “Maison”Graphe de Scène - structure: Graphe de Scène - structure Directed Acyclic Heterogène Structure logique dans les noeuds intérieurs Geometrie (ou autres primitives) dans les feuilles, p.ex. polygonal meshes Groupe (Voiture) Groupe (Roux) Group (Carosserie) Transformations Roux - geo Lumière Racine Le graphe de scène dans l’architecture: Le graphe de scène dans l’architecture - p.ex. VRJuggler, CoVise, Virtual Design 2, Avalon, DBview, CATIA, OpenMask, WorldToolKit (WTK), … p.ex. Performer, OpenSG, OpenInventor, Java3D, OpenSceneGraph, Y, … Graphes de Scènes - Exemple: Graphes de Scènes - ExempleGraphes de Scènes - Exemple: Graphes de Scènes - ExempleGraphes de Scènes - Exemple: Graphes de Scènes - ExempleGraphes de Scènes - Exemple: Graphes de Scènes - Exemple Comment c’est fait en VRML 97 ?Graphes de Scènes - Exemple: Graphes de Scènes - Exemple #VRML V2.0 utf8 DEF avion Transform { position x y z orientation x y z angle children [ Shape { material Material { diffuseColor r g b } geometry indexedFaceSet { coord Coordinate { point [ 0.3 0.65 0.4, 0.2 0.3 0.4, … ] } # Coordinate coordIndex [0,1,2, -1, 3,4,5, -1, …] } # ifs } # Shape Transform { position x y z orientation nx, ny, nz children [ Transform { … } Transform { ….} ] } # Transform … } # avionGraphes de Scènes: Actions: Graphes de Scènes: Actions Bonne structure, mais pourquoi? RenderAction: rendu de la scène IntersectAction: intersection (p.ex. pour selection ou collection) Facilite les interactions (Rendu d’une partie de la scène, …)Graphes de Scènes: Exigences: Graphes de Scènes: Exigences Performance - multi-thread (parallel processing) - state-sorting - proche du hardware - … Généralité - cross-plateforme (Win32, Linux, IRIX, …) - multi-pipe (CAVE, Powerwalls, Reality Centers, …) - extensible - … Facile à utiliserGraphes de Scènes: Exigences – multi-threading: Graphes de Scènes: Exigences – multi-threading Graphe de Scène stocke les données de la scène Tasks multiples indépendants Peuvent marcher en parallel Peuvent être asynchrone Graphes de Scènes: Exigences – multi-pipe: Graphes de Scènes: Exigences – multi-pipe au LaBRI: Hemicyclia (SGI Reality Center)Systèmes existantes: Systèmes existantes OpenSG DirectModel Java3d Y Open Inventor Performer Optimizer Cosmo3d OpenGL++ FahrenheitOpenInventor - Graphes de scènes existants : OpenInventor - Graphes de scènes existants OpenInventor (http://www.sgi.com/Technology/Inventor) et (www.tgs.com) et (www.coin3d.com) le plus vieux graphe de scène mais toujours utilisé + beaucoup d’outils (Viewer, …) + simple à utiliser - mauvaise performance - pas de support multi-thread - pas de support multi-pipe (à part une extension de la version de TGS) - OpenSource (version SGI, Coin3D), pas OpenSource (version TGS) - disponibilité: seulement Linux/IRIX (version SGI), + Win32, HP, SUN (version TGS)Performer - Graphes de scènes existants : Performer - Graphes de scènes existants SGI Performer (http://www.sgi.com/software/performer) très vieux + performance (state-sorting, APP-CULL-DRAW) + support multi-pipe + support multi-thread (mais limité) - difficile - pas OpenSource - pas extensible aux nouvelles architectures - disponibilité: seulement Linux/IRIX, Windows à partir de la Version 3.0Java3D - Graphes de scènes existants : Java3D - Graphes de scènes existants Java3D (www.java3d.org) récent + support pour systèmes de procjections + très simple - pas de vrai support multi-pipe - pas de support multi-thread - pas extensible pour des nouvelles extensions graphiques - mauvaise performanceGraphes de Scènes - Visions : Graphes de Scènes - Visions Echec: Fahrenheit (Coopération SGI – Microsoft) Utilisateur veulent pas être dépendant de l’industrie Utilisateur veulent pas être dépendant d’un système d’exploitation Besoin d’un standard Solution: OpenSG ?OpenSG: OpenSG Buts de OpenSG: Buts de OpenSG cross-plateforme: Irix/Unix/Linux + Windows haute performance (hardware, state-sorting) multi-threading multi-pipe heterogène (CAVE, Powerwalls, ...) surfaces free-form extensible disponible: Open Source buts non – lucratifs! Buts de OpenSG: ! Buts de OpenSG ce n’est pas un système VR outils pour device handling, interaction etc. sont disponible dans: Maverick, CaveLib, VRJuggler, VRPN unique API graphique OpenGL est disponible partout et est une bonne alternativeDeveloppement: Developpement Developpé comme Open Source Sources diponible de www.opensg.org and www.sourceforge.net/projects/opensg Communication via SourceForge Mailing lists ou IRC (Galaxynet: #OpenSG) Contributions bienvenues Platforms Now: Irix, Linux, Windows (VS .NET, ICC) Experimentation: MacOS X, HP-UX A venir: SUN SolarisO.I.N.O.S.: O.I.N.O.S. OpenSG n’est pas Open Scene Graph! Deux projets totalement indépendants Début en meme temps Membres du Forum OpenSG: Membres du Forum OpenSG ABB Research Center AUDI AG BMW AG Daimler Chrysler AG Daimler Chrysler Aerospace AG EDS PLM Solutions Fraunhofer IAO Fraunhofer IGD Fraunhofer IMK INI-GraphicsNet Fondation Instituto Superior Tecnico Max-Planck-Institut für Informatik Silicon Graphics GmbH Volkswagen AG Siemens AG, ZT vrcom GmbH TU Darmstadt TU München Slide28: Partners: IGD, TU Darmstadt, TU Braunschweig, U Bonn, U Stuttgart, U Tübingen, MPI Saarbrücken, RWTH Aachen, ZGDV, OpenSG Forum 4 domaines: Low-Level, Large Scene Support, High-Level Primitives, High-Level Shading 2/01 à 12/03 www.opensg.org/OpenSGPLUSStatus & Roadmap: Status & Roadmap 1.1: Developer Release, June 2002 Stereo, Multipipe Premiers résultats OpenSG PLUS: Cluster 1.2: Stable version, October 2002 (disponible sur www) Stable 1.1 Documentation Exemples etc. 1.3: Features & Performance, April 2003 (disponible sur CVS) Multi-Pass / Multi-Stage Support NURBS Volumes2.) OpenSG : 2.) OpenSG Un Graphe de Scène OpenSource Une librairie – à utiliser comme n’importe quelle autre librairieStructure de la librairie: Structure de la librairie Base Lib (Source/Base) : (libOSGBase.so) Basic math, Field, Réseaux, abstraction OS, Volumes System Lib (Source/System) : (libOSGSystem.so) Le graphe de scène Noeuds / Loader / Cluster / Material / Window / ... Window System Libs (Source/WindowSystem): (libOSGWindowGLUT.so, libOSGWindowQT.so, libOSGWindowX.so, ...) Un par WindowsystemBaseLib : BaseLib Namespace : OSG OSG_USING_NAMESPACE or OSG:: OSG_BEGIN_NAMESPACE, OSG_END_NAMESPACE Types de Base (OSGBaseTypes.h) (pour assurer cross-plateforme) [U]Int{8|16|32|64} Real{32|64} bool [U]Char8 BaseLib : BaseLib Fonctions de Maths Real32 and Real64 variants (template) osgsin, osgcos, osgabs, osgpow, osgfloor etc. deg2rad & rad2deg Normalement en radiant à part explicitement determiné: Quaternion::setValueAsAxisRad Quaternion::getValueAsAxisDegBaseLib: BaseLib Nécessite Startup / Termination calls (OSGBaseFunctions.h) osgInit(Int32 argc, Char8 **argv); osgExit(void); void main(Int32 argc, Char8 **argv) { osgInit(argc, argv); . . osgExit(); }BaseLib: Vectors / Points: X Variants typés Vec{2|3|4}f, Vec2s, Vec4ub, Pnt{2|3|4}{f|d}, Pnt2s Interface d’accès (getValue, setValue) [ ] Difference Point / Vector Points sont des position en espace Opérations : scale, negate, test, add vector, sub point, … Vectors sonts des directions in space (derivé de points) Opérations : dot, cross, +, -, … BaseLib: Vectors / Points v = p – p p = p + v v = v + v v = v – v p = p + pBaseLib: Couleurs: variants typé, comme point/vector Color{3|4}{f|ub} RGB[A] / HSV set/get méthodes Interne stocké comme RGB[A] conversions RGB[A] / HSV BaseLib: CouleursBaseLib: Quaternions: BaseLib: Quaternions répresentation d‘orientation set/get de/à différents types de valeurs fonctions standards: normalize, slerp, mult, multVec etc. rien de spécialBaseLib: Matrices: BaseLib: Matrices Stockage comme dans OpenGL: column major! Matrix Mémoire BaseLib: Matrices: Vec3f Vec3f Vec3f Vec3f BaseLib: Matrices [ ] operators Constructeurs à partir de vecteur fonctions à base de vecteur Sont également column-major! Matrix( , , , ); MatrixBaseLib: Matrices: Matrix( ); , , , , , , , , , , , , , , , BaseLib: Matrices Attention: Real32 constructeur et setValue(m00,m10,m20,m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33); Row major! Sinon, utiliser setValueTransposed!BaseLib: Manipulation des matrices: BaseLib: Manipulation des matrices m1.mult(m2) == m1 * m2; | m1.multLeft(m2) == m2 * m1; setTranslate / setRotate / setScale Affecte seulement la partie specifié setTransform() affecte la matrice entière void Matrix::setTransform(Vec3f trans, Quat rot, Vec3f scale); inverse / transposeBaseLib: Volumes: BaseLib: Volumes Volumes englobantes pour le Culling Types : BoxVolume SphereVolume CylinderVolume FrustumVolume DynamicVolume Flags pour des états spécial: Valid (invalide: n‘est pas mis à jour) Empty Infinite (toujours visible) Static (ne change pas)BaseLib: Volumes: BaseLib: Volumes Manipulation : clear extendBy (Point or Volume) transform Accès : getCenter getBounds(min, max) Test : intersect(Point/Line/Volume) BaseLib: Quoi d‘autres ? : BaseLib: Quoi d‘autres ? Line / Plane Date / Time Primitives multi-threading Réseaux (Socket, Connection, Select) ... SystemLib: SystemLibFields: Fields définie à partir de BaseType membres de données de FieldContainer (Nodes, ...) Donne information sur eux-mêmes Cardinality Size Name Stored type Conversion de et à string / binaire Cardinalité: Single or Multi Single Fields: Single Fields unique valeur Interface getValue(), setValue(value), setValue(field) Naming Convention SF<TypeName> Exemple : SFInt32 SFNodePtr MultiFields: MultiFields arrays 1D Similaire à STL vectors Iterators, begin(), end(), insert(), erase(), push_back(), [ ] etc. Additionallement : addValue(val) getValue(UInt32 index), setValue(val, index) vector<type>& getValues() FieldContainers: FieldContainers Reflective fournit information sur lui-même fournit accès generique (auto Chargeur / GUI) partageable support Multi-thread support Cluster Extensible Configurable Principaux types de FieldContainer - Node - NodeCores - State, Materials - Windows SystemLib: Structure du Graphe de Scène : SystemLib: Structure du Graphe de Scène Proposition 1 (OpenInventor): + Chaque nœud à un parent - redondance de données Carosserie Moteur Roues Voiture Transform Roue 1 Transform Roue 2 Transform Roue 3 Transform Roue 4 Géometrie Roue Géometrie Roue Géometrie Roue Géometrie RoueSystemLib: Structure du Graphe de Scène: SystemLib: Structure du Graphe de Scène Carosserie Moteur Roux Voiture Transform Rou 1 Transform Rou 2 Transform Rou 3 Transform Rou 4 Géometrie Rou Proposition 2 (OpenInventor): + Pas de redondance de données - parents multiplesSystemLib: Structure du Graphe de Scène : SystemLib: Structure du Graphe de Scène Proposition 3 (OpenSG): + Chaque nœud à un parent + pas de redondance de donées Carosserie Moteur Roux Voiture Transform Rou 1 Transform Rou 2 Transform Rou 3 Transform Rou 4 Géometrie Rou Géometrie Rou Géometrie Rou Géometrie Rou SystemLib: Nodes „A node is a node“ : SystemLib: Nodes „A node is a node“ pas de parents multiple pointers / names can't be used to identify nodes Pas de stockage de données dépendant de la position possible (p.ex. Matrice accumulée) Solution: „lean backbone“ – pour la structure (type Node) „cores“ reutilisable (type NodeCore) definie le comportement stocke les données partagé SystemLib: Node Contents: SystemLib: Node Contents Node: Volume : volume englobante (type: SFDynamicVolume) Parent : le parent du noeud (type: SFNodePtr) Children : les enfants du noeud (type: MFNodePtr) Core : Pointer sur le Core (type: SFNodeCorePtr) AttachmentMap : Information supplémentaire (type: SFAttachmentMap) Méthode: getToWorld() SystemLib: Node Contents: SystemLib: Node Contents MFNodePtr _children; UInt32 getNChildren( void ) const; void addChild (const NodePtr &childP); void insertChild ( UInt32 childIndex, const NodePtr &childP ); void replaceChild ( UInt32 index, const NodePtr &childP ); void replaceChildBy( NodePtr &childP, NodePtr &newChildP); Int32 findChild (const NodePtr &childP ) const; void subChild (const NodePtr &childP ); void subChild ( UInt32 childIndex); NodePtr getChild ( UInt32 childIndex ); SystemLib: OpenSG NodeCores: SystemLib: OpenSG NodeCores Switch Billboard Transform Text Node Core Prog. Mesh Dist. LOD Light Spot Directional Point Env Bitmap Texture Geom Transform Set Comp. Transform Impostor Super Surface Group Geometry Surface Particles Drawable Slices Volume MeshSystemLib: NodeCores - Groups: SystemLib: NodeCores - Groups Group Transform / ComponentTransform Switch Billboard DistanceLOD LightsSystemLib: Group NodeCore: SystemLib: Group NodeCore traverse tous les enfants collectionne les données de tous les enfantsSystemLib: Transform / ComponentTransform NodeCore (hérite de Group): SystemLib: Transform / ComponentTransform NodeCore (hérite de Group) Les transformations s‘accumule en montant l‘arbre Transform: simple transformation matrice (SFMatrix matrix) ComponentTransform: Derivé de Transform (style VRML) Rotation de mouvement Rou Rotation de direction Géometrie SystemLib: NodeCores – Switch (hérite de Group): SystemLib: NodeCores – Switch (hérite de Group) Traverse un, aucun, ou tous les enfants Controlé par un champs SFInt32 choice choice = -1: aucun choice = -2: tous 0 <= choice < nchildren: enfant no. choiceSystemLib: NodeCores – Billboard (hérite de Group): SystemLib: NodeCores – Billboard (hérite de Group) Transformation qui pointe toujours vers la camera (système de coordonnés local axe Z vers l’observateur) Quand l’observateur bouge à droite …. le Billboard s’oriente automatiquement vers l’observateurSystemLib: NodeCores – DistanceLOD (hérite de Group): SystemLib: NodeCores – DistanceLOD (hérite de Group) DistanceLOD choisie l’enfant en fonction de la distance de l’observateur et le Field SFPnt3f center LOD discrets, transitions entre les LOD stocké dans MFReal32 range field Utilise l’enfant dans le range approprié Enfant 0 Enfant 1 Enfant 2 Enfant 3 Range[0] Range[1] Range[2] Range[3] Range[4] rien rienSystemLib: NodeCores - Lights: SystemLib: NodeCores - Lights Lumières ont besoin de deux endroits dans le Graphe de Scène: Un pour déterminer quoi est éclairé Definie par la position dans l‘arbre, tous les enfants sont éclairé Un deuxième pour définir sa position/orientation Definie par un autre noeud, appelé beacon Fields: Activation: SFBool on Couleurs: SFColor3f ambient, diffuse, specular Beacon: SFNodePtr beacon Attenuation: SFReal32 constantAttenuation, linearAttenuation,quadraticAttenuation Carosserie Roux Voiture Racine Route Montagnes Beacon Lumière SystemLib: NodeCores – DirectionalLight (hérite de Light): SystemLib: NodeCores – DirectionalLight (hérite de Light) Source de lumière infiniment distant Rayon de lumière parallele Fields: SFVec3f direction SystemLib: NodeCores – PointLight (hérite de Light): SystemLib: NodeCores – PointLight (hérite de Light) Source de lumière localisée Differentes angles pour un surface plane Fields: SFPnt3f position SystemLib: NodeCores – SpotLight (hérite de Light): SystemLib: NodeCores – SpotLight (hérite de Light) Lumière emis dans un angle spécifié Plus faible en s‘éloignant de la direction S‘arrête à un angle determinéFields: SFPnt3f position SFVec3f direction SFReal32 spotExponent SFReal32 spotCutOffSystemLib: NodeCores - Drawables: SystemLib: NodeCores - Drawables Geometry Particles Slices (dans la version 1.3, Avril 2003) SystemLib – NodeCores: Drawables - Geometry: SystemLib – NodeCores: Drawables - Geometry orienté OpenGL support de tous les primitives OpenGL données directes et indexé plusieurs types de primitive possible par noeud un matérial (material field) Iterateurs pour accès facile: TriangleIterator FaceIterator PrimitiveIteratorSystemLib – NodeCores: Drawables - Geometry - Geometry Data: SystemLib – NodeCores: Drawables - Geometry - Geometry Data Données stockés dans des arrays séparés Positions, Normals, Colors, TexCoords, TexCoords1, ... Types: glBegin() types de primitives (GL_POINT, GL_LINES, GL_TRIANGLE_STRIP, GL_POLYGON etc.) class: GeoPTypesUI8 Longeurs: le nombre de vertices du primitive (= même nombre d‘entrée comme GeoPTypesUI8) class: GeoPLengthsUI32 Indexations pour usage multiple de données class: GeoIndicesUI32 SystemLib – NodeCores: Drawables - Geometry - Geometry Data (non-indexed): SystemLib – NodeCores: Drawables - Geometry - Geometry Data (non-indexed) Types Lengths Positions Normals Colors ...SystemLib – NodeCores: Drawables - Geometry - Geometry Data (indexed): SystemLib – NodeCores: Drawables - Geometry - Geometry Data (indexed) Types Lengths 3 3 4 6 3 3 5 3 Positions Index Normals Colors ... Dans la troisième partie on revient sur ça (format de fichiers OBJ, …)SystemLib – NodeCores: Drawables - Geometry - Geometry Tools: SystemLib – NodeCores: Drawables - Geometry - Geometry Tools Simple Géometrie (OSGSimpleGeometry.h): Nodes: makePlane(), makeBox(), makeCone(), makeCylinder(), makeTorus(), makeSphere(), makeConicalFrustum() NodeCores: même chose + Geo (ex. makeBoxGeo()) Fonctions Géometries (OSGGeoFunctions.h) void calcVertexNormals(GeometryPtr geo); void calcFaceNormals(GeometryPtr geo); void createOptimizedPrimitives(GeometryPtr geo); Crée des strips et fans de triangles à partir d‘un maillageSystemLib - GeoProperty: SystemLib - GeoProperty Un FieldContainer pour avoir un array unique Flexibilité et typage noms typifié, e.g. GeoPositions3f, GeoColors4ub Permet de partager les données entre les géometries Accès générique p.ex. Chaque position comprend: addValue(Pnt3f &val); ainsi que Pnt3f getValue(UInt32 index); 3f 3f 3s 4ub 2fParticles: Particles Rendu de la géométrie active Points, Lignes, Quadrilatérales, ... Données Positions, secPositions (GeoPositionsPtr) Normals (GeoNormalsPtr), Colors (GeoColorsPtr) sizes (MFVec3f) drawOrder (UInt32): Any, BackToFront, FrontToBack SystemLib – NodeCores: Drawables - Geometry – Slices (à partir de 1.3): SystemLib – NodeCores: Drawables - Geometry – Slices (à partir de 1.3) Très simple NodeCore pour le Rendu volumique Rendu des coupes aligné observateur Fields: SFMaterialPtr material , SFUInt32 numberOfSlices, SFVec3fsize A suivre dans OpenSG PlusSystemLib – Materials: SystemLib – Materials comme les états OpenGL Exceptions: transformation, lights Contrôleur for the Rendering Drawable NodeCores appellent leur material à rendre eux-mêmes Peut contrôler Multipass Rendering etc. SystemLib: SimpleMaterial (hérite de Material): SystemLib: SimpleMaterial (hérite de Material) Simple standard OpenGL Material Couleurs (SFColor3f): ambient, diffuse, specular, emission Shininess (SFReal32) Transparency (SFReal32) : automatique „blending“ et sorting Lit (SFBool): éclairé ou pas ColorMaterial (SFUint32) Definie l‘interaction entre les couleurs de la géométrie et de l‘éclairage Par défaut: GL_DIFFUSELighting Parameters: Lighting ParametersSystemLib: SimpleTexturedMaterial (hérite de Material): SystemLib: SimpleTexturedMaterial (hérite de Material) Même que SimpleMaterial, mais en plus: Image (SFImageP): l‘image de texture minFilter & magFilter (SFUInt32): filtrage Utilise des paramètres de OpenGL (p.ex. glTexParameter) envMode (SFUInt32): environnement de texture. Comment combiner lumière et texture, par defautdefault: GL_REPLACE, alternatives: GL_MODULATE, GL_DECAL, voir détails dans OpenGL envMap (SFBool): si la texture doit être utiliser comme Environment MapSystemLib: Image: SystemLib: Image Traite plusieurs formats différents: (L,LA,RGB,RGBA, ...), Images 3D, mipmaps and multi-images img->read(Char8 *name); // ouvre le fichier Charge de formats: PPM, TIFF, JPG, RGB, PNG, enregistre: PPM, TIFF, JPG, RGB (N‘est pas thread-safe encore)SystemLib: Environment Maps: SystemLib: Environment Maps Used to simulate reflectionsSystemLib: Format de Fichiers supporté:: SystemLib: Format de Fichiers supporté: Formats: VRML97 (à voir dans la partie 3) OFF AliasWavefront OBJ (à voir dans la partie 3) RAW OSG (format propriétaire) BIN Chargeur générique: (OSGSceneFileHandler.h) NodePtr root = SceneFileHandler::the().read(fileName);SystemLib: Tree Traversals: Actions: SystemLib: Tree Traversals: Actions Types: Drawing: DrawAction Rendering: RenderAction Picking: IntersectAction Creation act = xxxAction::create() Traversal: act->apply( root ); SystemLib: DrawAction (hérite de Action): SystemLib: DrawAction (hérite de Action) Appelle directement les commandes OpenGL Passé a la fenêtre Maintenant: remplacé par RenderActionSystemLib: RenderAction (hérite de Action): SystemLib: RenderAction (hérite de Action) Construit un DrawTree en parcourant le graph et fait le rendu de ce même Out-of-order et multi-stage / multi-pass support pour le rendu Nouvelle version dans 1.3 Traite le State Sorting, transparence inclusSystemLib: IntersectAction (hérite de Action): SystemLib: IntersectAction (hérite de Action) Intersection de la scène avec un rayon Utilise une „Line“ pour définir la rayon act->setLine( l ); Retourne Object frappé Triangle frappé Point frappé SystemLib: Simple Traversals: SystemLib: Simple Traversals Souvent définir une nouvelle action n’est pas nécessaire: un simple appelle d’une fonction en entrant/quittant un noeud est suffisant 4 fonctions traverse() Commencer par une liste ou un noeud unique Appelle une fonction en entrant (et sortant) Voir tutorials 08traverseSystemLib - Windows : SystemLib - Windows Comme OpenGL OpenSG ne crée pas de fenêtres Garde l‘information pour le rendu Contexte et objets OpenGL (p.ex. textures) Viewports SystemLib - Windows: SystemLib - Windows Initialisation Mettre les paramêtres de la fenêtre (displayFunction etc.) appeler init() Necessite de savoir quand la taille de la fenêtre change appeler win->resize() Necessite de savoir début et fin d‘un „frame“ appeler frameInit() et frameExit() Ou appeler window->render() SystemLibs – Windows - Viewports: SystemLibs – Windows - Viewports Partage la fenêtre en plusieurs parties E.g.: left=0, right=100, bottom=-1, top=0.5 crée un Viewport de largeur 100 pixel dans la moitié bas de la fenêtre Stocke le paramêtres de rendu Background, Camera, Root Node, Foregrounds w pixel h pixel 100 pixel h/2 pixelSystemLib – Windows - Background: SystemLib – Windows - Background Definie le fond avant l‘affichage de la „frame“ Variantes: SolidBackground Une couleur GradientBackground Un nombre de couleurs spécifiés à des postitions différents SkyBackground Similaire de VRMLSystemLib – Windows - Camera: SystemLib – Windows - Camera Definie les paramêtres de la projection ainsi que la position/orientation de l‘observateur Attributs générales: Position/orientation sont definie dans un noeud du graph (SFNodePtr beacon) Par défaut Y en haut, et regarde negative axe Z (comme OpenGL) SFReal32 near et far distance PerspectiveCamera: Vertical field of view (fov) MatrixCamera: pour spécifier les matrices Root Transform Scene Camera Beacon Viewport SystemLib – Windows - Camera Decorators: SystemLib – Windows - Camera Decorators „Décore“ le Caméra Tiled Displays Stereo Projection Systems Root Transform Scene Camera Beacon DecoRight DecoLeft PortRight PortLeft SystemLib – Windows - Foreground: SystemLib – Windows - Foreground Appelé après le rendu du Viewport Plusieurs sont possible Existant: LogoForeground: déssine un logo SimpleStatisticsForeground ... Version 1.3 GraphicsStatisticsForegroundApplications: Applications Besoin d‘une fenêtre Le fenêtre a besoin de Viewports qui ont besoin d‘un camera, background/foregrounds, et la racine du Graphe de Scène La scène doit contenir un „beacon“ pour la Caméra, un ou plusieurs lumières, et la géometrie Alternative: Utiliser SimpleSceneManager Window Background Foreground Camera Decorator ViewportsSystemLib – Windows - SimpleSceneManager: SystemLib – Windows - SimpleSceneManager Utilitaire classe pour des applications facile Prend un NodePtr pour la racine du Graphe de Scène et un WindowPtr et fait le reste crée Camera, Viewport, Headlight simule TrackballNavigation Doit être informé de Resize Mouse Move/Button Press/ReleaseSystemLib – Windows - Trackball Navigation: SystemLib – Windows - Trackball Navigation Classe pour faciliter les techniques d’interaction 3D avec la souris LeftDrag: rotation autour du centre MiddleDrag: translation, RightDrag or MouseWheel: zoom in/out LeftClick: définie le centre WindowSystemLib: WindowSystemLibWindowSystemLibs – WindowGLUT - HelloOpenSG.cpp: WindowSystemLibs – WindowGLUT - HelloOpenSG.cpp void display( void ) { mgr->redraw(); } void reshape( int w, int h ) { mgr->resize( w, h ); glutPostRedisplay(); } void motion(int x, int y) { mgr->mouseMove( x, y ); glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if ( state ) mgr->mouseButtonRelease( button, x, y ); else mgr->mouseButtonPress( button, x, y ); glutPostRedisplay(); } int main (int argc, char **argv) { osgInit(argc,argv); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH ); int winid = glutCreateWindow("OpenSG"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); GLUTWindowPtr gwin= GLUTWindow::create(); gwin->setWinID(winid); gwin->init(); NodePtr scene = makeTorus( .5, 2, 16, 16 ); mgr = new SimpleSceneManager; mgr->setWindow( gwin ); // premiere partie de mgr mgr->setRoot( scene ); // deuxième partie de mgr mgr->showAll(); // postionne la caméra glutMainLoop(); osgExit(); return 0; } Graphes Multi-threading: beginEditCP, endEditCP: Graphes Multi-threading: beginEditCP, endEditCP 1er exemple: NodePtr scene = makeTorus( .5, 2, 16, 16 ); // OSGSimpleGeometry 2ème exemple: NodePtr scene = Node::create(); beginEditCP(scene, Node::CoreFieldMask | Node::ChildrenFieldMask); { scene->setCore(group); scene->addChild(….); scene->addChild(….); } endEditCP (scene, Node::CoreFieldMask | Node::ChildrenFieldMask); Pourquoi?Graphes de Scènes: Exigences – multi-threading: Graphes de Scènes: Exigences – multi-threading Graphe de Scène stocke les données de la scène Tasks multiples indépendants Peuvent marcher en parallel Peuvent être asynchrone Multi-threading - Solution : Redondance (Data replication): Multi-threading - Solution : Redondance (Data replication) Chaque thread a besoin d‘une copie séparée (Performer) Problème: consommation de mémoire Qu‘est-ce qui est partagé? OpenSG: Niveau de Field Str A Str B Str A Str B Field Data Str A Str B Field DataMulti-threading Cluster Configuration: Multi-threading Cluster Configuration Client Application Ouvre une fenêtre Procès serveur générique Pratiquement application-indépendent Distribution par multicast Multi-threading : Impacte en programmation OpenSG: Multi-threading : Impacte en programmation OpenSG Les pointeurs Standard ne marche plus: Remplacer <Type>* par <Type>Ptr // Custom Pointer - Custom dynamic_cast<Type *> implementation Données doivent être repliquées avant d‘être changées Système nécessite de savoir quand les données changent: dans OpenSG, l‘utilisateur doit informer le système beginEditCP(FCPtr, fieldmask); // CP est le „CustomPointer“ endEditCP (FCPtr, fieldmask); Fieldmask: un bit par „field“ du FieldContainer, par défaut: tous Exemple : beginEditCP(nodeP, Node::VolumeFieldMask | Node::ChildrenFieldMask); Graphes de Scènes: Toujours et pour tout?: Graphes de Scènes: Toujours et pour tout? Quand est-ce qu’il fait un sens d’utiliser un Graphe de Scène? Graphes de Scènes sont retained-mode Approrié: - accès aux données de toute la scène permets optimization (comme Culling est State-Sorting) - pour des scènes très complexes (grosses géometrie, bcp de changement de material, …) - bcp de fonctions d’outil prédefinies (example classique: chargeur de fichiers) - en plus dans OpenSG: pour des applications multi-thread (parallel processing, clustering) et multi-pipe - pour commencer un nouveau projet Graphes de Scènes: Toujours et pour tout?: Graphes de Scènes: Toujours et pour tout? Peut-être mal approprié - pour des scènes très dynamique, maintenir la structure peut manger le profit - pour des scènes très simple (un material, ..) - pour des projets déjà établi 3.) Format de Fichiers 3D: 3.) Format de Fichiers 3D - VRML - OBJ … #VRML V2.0 utf8 DEF APP_0001 Appearance { texture ImageTexture { url "test.jpg" } } Transform { translation -1 0 0 children [ Shape { appearance USE APP_0001 geometry IndexedFaceSet { coord Coordinate { point [ 370363 0 -285019, 370363 10.35 -285019, 370365 0 -285012, 370365 10.35 -285012 ] } texCoord TextureCoordinate { point [ 0 0, 1 0, 1 1, 0 1 #This file is generated by geoShape lib # 285 vertex elem, offset: 0 v -212.285995 -65.909798 27.430000 v -182.104004 -55.423100 34.799999 v -270.171997 -106.214996 0.000000 v -212.285995 -65.909798 -27.430000 v 195.158005 -14.477000 0.000000 v -143.682999 -62.438801 43.180000 v -243.022995 -34.044998 0.000000 v 211.268005 -58.594200 -11.940000 v 240.934006 -65.579002 -73.150002 v 240.934006 -65.579002 73.150002 v 211.268005 -58.594200 11.940000 v -106.839996 40.523998 -22.350000 v -199.781998 -16.746000 -31.750000 v 37.980999 60.744999 0.000000 v -182.104004 -55.423100 -34.799999 v -143.682999 -62.438801 -43.180000 v -104.494003 -60.085899 -41.150002 v -13.839000 -62.945202 -38.099998 v -106.888000 -79.097000 -80.010002VRML: VRML Virtual Reality Modeling Language (VRML) Format de fichier pour des objets et mondes 3D interacitfs. concue pour être utilisé sur Internet, Intranets, et Client/Serveur Apps fomat d’interchange universel bcp d’applications: visualisation scientifique, présentation multimedia, divertissements, éducation, pages Web, mondes virtuelles partagés, apps pour des ingénieurs (CAO, …)VRML: VRML Historique - VRML 1.0 Mai 1995 - VRML 2.0 Août 1996 (gros changement) - VRML 97 Décembre 1997 (petit changement) Extension: .wrlVRML 97 – Critère de Design: VRML 97 – Critère de Design Authorability - logiciel créent, éditent, et maintiennent et convertissent des fichier VRML Composability - reutilisation de fichier VRML grace aux combinaison possible Extensibility - possible d’ajouter des types d’objet non-defini Be capable of implementation Performance (scalable) Scalability (large 3D worlds)VRML 97 - Characteristiques: VRML 97 - Characteristiques VRML peut représenter des objet multimedia 3D statique et dynamique animé avec des URL’s aux autres formats medias comme text, sons, films, et images. indépendance de la plateforme extensibilité qui permet de définir de nouveux objets dynamiques 3DVRML 97: VRML 97 Fichiers VRML contiennent: Le Header #VRML V2.0 utf8 Commentaires – ligne commencent par # Nodes – Information sur la scène Fields – Attributs des Nœuds (SF, MF) Values – valeurs des attributs et plus . . . VRML 97: VRML 97 #VRML V2.0 utf8 # A Cylinder Shape { appearance Appearance { material Material { } } geometry Cylinder { height 2.0 radius 1.0 } } Remarque: ASCII – UTF8 Format Pour lisbilité et « edit by hand » VRML 97: VRML 97 À voir: Le Tutorial SIGGRAPH http://www.sdsc.edu/~nadeau/Courses/Siggraph98vrml/vrml97/vrml97.htm La Spécification VRML 97 () http://www.web3d/Specifications/VRML97/ Disponible sur la page du cours: http://www.labri.fr/~preuter/imageSynthesis/sceneGraphs AliasWavefront’s OBJ: AliasWavefront’s OBJ format de texte également très simple pour répresenter des maillages en OpenSG et VRML: indexedFaceSet - extension: .obj AliasWavefront’s OBJ: AliasWavefront’s OBJ # commentaire v 0 0 0 # vertex index 1 position x y z v 1 0 0 # vertex index 2 v 0 1 0 # vertex index 2 f 1 2 3 # face 1 2 3 # attention: Index commence à 1 !! 1 2 3AliasWavefront’s OBJ: AliasWavefront’s OBJ # commentaire v 0 0 0 # vertex index 1 position x y z v 1 0 0 # vertex index 2 v 0 1 0 # vertex index 2 … vt 0 0 # texture index 1 vt 1 0 # texture index 2 vt 0 1 # texture index 3 … f 1/1 2/2 3/3 # vertex/texture vertex/texture vertex/texture 1 2 3AliasWavefront’s OBJ: AliasWavefront’s OBJ # commentaire … vn 0.7 0.7 0 # vertex normal index 1 direction x y z vn 0 0.7 0.7 # vertex normal index 2 vn 0 1 0 # vertex normal index 3 … f 1//1 2//2 3//3 # vertex//normal vertex//normal vertex//normal f …. … … .. .AliasWavefront’s OBJ: AliasWavefront’s OBJ # ou bien f 1/1/1 2/2/2 3/3/3 # vertex/texture/normal vertex/texture/normal vertex/texture/normal f … ….. … .. f … ….. … .. …AliasWavefront’s OBJ: AliasWavefront’s OBJ # negative indices pour décrire des gros groupes v -0.500000 0.000000 0.400000 v -0.500000 0.000000 -0.800000 v -0.500000 1.000000 -0.800000 v -0.500000 1.000000 0.400000 f -4 -3 -2 -1AliasWavefront’s OBJ: AliasWavefront’s OBJ # extension G # début d’un groupe Usemtl red # utiliser un fichier .mtl pour décrire le matérial AliasWavefront’s OBJ: AliasWavefront’s OBJ v 1 1 1 v 1 1 -1 v 1 -1 1 v 1 -1 -1 v -1 1 1 v -1 1 -1 v -1 -1 1 v -1 -1 -1 f 1 3 4 2 f 5 7 8 6 f 1 5 6 2 f 3 7 8 4 f 1 5 7 3 f 2 6 8 4Même chose en VRML: Même chose en VRML #VRML V2.0 utf8 Shape { appearance Appearance { . . . } geometry IndexedFaceSet { coord Coordinate { point [# X Y Z 1.0 1.0 1.0, 1.0 1.0 –1.0, …] } coordIndex [0, 2, 3, 1, -1, 4, 6, 7, 5, -1, …. ] }} You do not have the permission to view this presentation. In order to view it, please contact the author of the presentation.
graphesDeScenes Mee12 Download Post to : URL : Related Presentations : Share Add to Flag Embed Email Send to Blogs and Networks Add to Channel Uploaded from authorPOINTLite Insert YouTube videos in PowerPont slides with aS Desktop Copy embed code: (To copy code, click on the text box) Embed: URL: Thumbnail: WordPress Embed Customize Embed The presentation is successfully added In Your Favorites. Views: 232 Category: Entertainment License: All Rights Reserved Like it (0) Dislike it (0) Added: November 14, 2007 This Presentation is Public Favorites: 0 Presentation Description No description available. Comments Posting comment... Premium member Presentation Transcript Graphes de scènesà l‘exemple de OpenSG: Graphes de scènes à l‘exemple de OpenSG Patrick Reuter LaBRI – INRIA futurs Université Bordeaux IProgramme: Programme 1.) Graphe de Scènes Motivation Exemples 2.) OpenSG Motivation Introduction Exemples 3.) Format de Fichiers 3D scène (VRML) 3D maillages (OBJ) 1.) Graphe de Scènes: 1.) Graphe de ScènesMotivation Scene Graphs: Motivation Scene Graphs OpenGL est très bas niveau Immediate mode based Pas de concepts „objet“ à part display lists Utilisateur a beaucoup de contrôle ... et beaucoup de pièges à rentrer dedans Il faut connaitre le Hardware très bien Motivation Graphes de Scène: Motivation Graphes de Scène Graphes de Scènes sont à un niveau supérieur Retained mode Établir la structure de données une fois Après l‘utiliser le plus souvent possible Orienté Objet Beaucoup d‘optimisation possible „Graphes de Scènes pour OpenGL sont ce qui est STL pour C++“ Exemple “Maison”Graphe de Scène - structure: Graphe de Scène - structure Directed Acyclic Heterogène Structure logique dans les noeuds intérieurs Geometrie (ou autres primitives) dans les feuilles, p.ex. polygonal meshes Groupe (Voiture) Groupe (Roux) Group (Carosserie) Transformations Roux - geo Lumière Racine Le graphe de scène dans l’architecture: Le graphe de scène dans l’architecture - p.ex. VRJuggler, CoVise, Virtual Design 2, Avalon, DBview, CATIA, OpenMask, WorldToolKit (WTK), … p.ex. Performer, OpenSG, OpenInventor, Java3D, OpenSceneGraph, Y, … Graphes de Scènes - Exemple: Graphes de Scènes - ExempleGraphes de Scènes - Exemple: Graphes de Scènes - ExempleGraphes de Scènes - Exemple: Graphes de Scènes - ExempleGraphes de Scènes - Exemple: Graphes de Scènes - Exemple Comment c’est fait en VRML 97 ?Graphes de Scènes - Exemple: Graphes de Scènes - Exemple #VRML V2.0 utf8 DEF avion Transform { position x y z orientation x y z angle children [ Shape { material Material { diffuseColor r g b } geometry indexedFaceSet { coord Coordinate { point [ 0.3 0.65 0.4, 0.2 0.3 0.4, … ] } # Coordinate coordIndex [0,1,2, -1, 3,4,5, -1, …] } # ifs } # Shape Transform { position x y z orientation nx, ny, nz children [ Transform { … } Transform { ….} ] } # Transform … } # avionGraphes de Scènes: Actions: Graphes de Scènes: Actions Bonne structure, mais pourquoi? RenderAction: rendu de la scène IntersectAction: intersection (p.ex. pour selection ou collection) Facilite les interactions (Rendu d’une partie de la scène, …)Graphes de Scènes: Exigences: Graphes de Scènes: Exigences Performance - multi-thread (parallel processing) - state-sorting - proche du hardware - … Généralité - cross-plateforme (Win32, Linux, IRIX, …) - multi-pipe (CAVE, Powerwalls, Reality Centers, …) - extensible - … Facile à utiliserGraphes de Scènes: Exigences – multi-threading: Graphes de Scènes: Exigences – multi-threading Graphe de Scène stocke les données de la scène Tasks multiples indépendants Peuvent marcher en parallel Peuvent être asynchrone Graphes de Scènes: Exigences – multi-pipe: Graphes de Scènes: Exigences – multi-pipe au LaBRI: Hemicyclia (SGI Reality Center)Systèmes existantes: Systèmes existantes OpenSG DirectModel Java3d Y Open Inventor Performer Optimizer Cosmo3d OpenGL++ FahrenheitOpenInventor - Graphes de scènes existants : OpenInventor - Graphes de scènes existants OpenInventor (http://www.sgi.com/Technology/Inventor) et (www.tgs.com) et (www.coin3d.com) le plus vieux graphe de scène mais toujours utilisé + beaucoup d’outils (Viewer, …) + simple à utiliser - mauvaise performance - pas de support multi-thread - pas de support multi-pipe (à part une extension de la version de TGS) - OpenSource (version SGI, Coin3D), pas OpenSource (version TGS) - disponibilité: seulement Linux/IRIX (version SGI), + Win32, HP, SUN (version TGS)Performer - Graphes de scènes existants : Performer - Graphes de scènes existants SGI Performer (http://www.sgi.com/software/performer) très vieux + performance (state-sorting, APP-CULL-DRAW) + support multi-pipe + support multi-thread (mais limité) - difficile - pas OpenSource - pas extensible aux nouvelles architectures - disponibilité: seulement Linux/IRIX, Windows à partir de la Version 3.0Java3D - Graphes de scènes existants : Java3D - Graphes de scènes existants Java3D (www.java3d.org) récent + support pour systèmes de procjections + très simple - pas de vrai support multi-pipe - pas de support multi-thread - pas extensible pour des nouvelles extensions graphiques - mauvaise performanceGraphes de Scènes - Visions : Graphes de Scènes - Visions Echec: Fahrenheit (Coopération SGI – Microsoft) Utilisateur veulent pas être dépendant de l’industrie Utilisateur veulent pas être dépendant d’un système d’exploitation Besoin d’un standard Solution: OpenSG ?OpenSG: OpenSG Buts de OpenSG: Buts de OpenSG cross-plateforme: Irix/Unix/Linux + Windows haute performance (hardware, state-sorting) multi-threading multi-pipe heterogène (CAVE, Powerwalls, ...) surfaces free-form extensible disponible: Open Source buts non – lucratifs! Buts de OpenSG: ! Buts de OpenSG ce n’est pas un système VR outils pour device handling, interaction etc. sont disponible dans: Maverick, CaveLib, VRJuggler, VRPN unique API graphique OpenGL est disponible partout et est une bonne alternativeDeveloppement: Developpement Developpé comme Open Source Sources diponible de www.opensg.org and www.sourceforge.net/projects/opensg Communication via SourceForge Mailing lists ou IRC (Galaxynet: #OpenSG) Contributions bienvenues Platforms Now: Irix, Linux, Windows (VS .NET, ICC) Experimentation: MacOS X, HP-UX A venir: SUN SolarisO.I.N.O.S.: O.I.N.O.S. OpenSG n’est pas Open Scene Graph! Deux projets totalement indépendants Début en meme temps Membres du Forum OpenSG: Membres du Forum OpenSG ABB Research Center AUDI AG BMW AG Daimler Chrysler AG Daimler Chrysler Aerospace AG EDS PLM Solutions Fraunhofer IAO Fraunhofer IGD Fraunhofer IMK INI-GraphicsNet Fondation Instituto Superior Tecnico Max-Planck-Institut für Informatik Silicon Graphics GmbH Volkswagen AG Siemens AG, ZT vrcom GmbH TU Darmstadt TU München Slide28: Partners: IGD, TU Darmstadt, TU Braunschweig, U Bonn, U Stuttgart, U Tübingen, MPI Saarbrücken, RWTH Aachen, ZGDV, OpenSG Forum 4 domaines: Low-Level, Large Scene Support, High-Level Primitives, High-Level Shading 2/01 à 12/03 www.opensg.org/OpenSGPLUSStatus & Roadmap: Status & Roadmap 1.1: Developer Release, June 2002 Stereo, Multipipe Premiers résultats OpenSG PLUS: Cluster 1.2: Stable version, October 2002 (disponible sur www) Stable 1.1 Documentation Exemples etc. 1.3: Features & Performance, April 2003 (disponible sur CVS) Multi-Pass / Multi-Stage Support NURBS Volumes2.) OpenSG : 2.) OpenSG Un Graphe de Scène OpenSource Une librairie – à utiliser comme n’importe quelle autre librairieStructure de la librairie: Structure de la librairie Base Lib (Source/Base) : (libOSGBase.so) Basic math, Field, Réseaux, abstraction OS, Volumes System Lib (Source/System) : (libOSGSystem.so) Le graphe de scène Noeuds / Loader / Cluster / Material / Window / ... Window System Libs (Source/WindowSystem): (libOSGWindowGLUT.so, libOSGWindowQT.so, libOSGWindowX.so, ...) Un par WindowsystemBaseLib : BaseLib Namespace : OSG OSG_USING_NAMESPACE or OSG:: OSG_BEGIN_NAMESPACE, OSG_END_NAMESPACE Types de Base (OSGBaseTypes.h) (pour assurer cross-plateforme) [U]Int{8|16|32|64} Real{32|64} bool [U]Char8 BaseLib : BaseLib Fonctions de Maths Real32 and Real64 variants (template) osgsin, osgcos, osgabs, osgpow, osgfloor etc. deg2rad & rad2deg Normalement en radiant à part explicitement determiné: Quaternion::setValueAsAxisRad Quaternion::getValueAsAxisDegBaseLib: BaseLib Nécessite Startup / Termination calls (OSGBaseFunctions.h) osgInit(Int32 argc, Char8 **argv); osgExit(void); void main(Int32 argc, Char8 **argv) { osgInit(argc, argv); . . osgExit(); }BaseLib: Vectors / Points: X Variants typés Vec{2|3|4}f, Vec2s, Vec4ub, Pnt{2|3|4}{f|d}, Pnt2s Interface d’accès (getValue, setValue) [ ] Difference Point / Vector Points sont des position en espace Opérations : scale, negate, test, add vector, sub point, … Vectors sonts des directions in space (derivé de points) Opérations : dot, cross, +, -, … BaseLib: Vectors / Points v = p – p p = p + v v = v + v v = v – v p = p + pBaseLib: Couleurs: variants typé, comme point/vector Color{3|4}{f|ub} RGB[A] / HSV set/get méthodes Interne stocké comme RGB[A] conversions RGB[A] / HSV BaseLib: CouleursBaseLib: Quaternions: BaseLib: Quaternions répresentation d‘orientation set/get de/à différents types de valeurs fonctions standards: normalize, slerp, mult, multVec etc. rien de spécialBaseLib: Matrices: BaseLib: Matrices Stockage comme dans OpenGL: column major! Matrix Mémoire BaseLib: Matrices: Vec3f Vec3f Vec3f Vec3f BaseLib: Matrices [ ] operators Constructeurs à partir de vecteur fonctions à base de vecteur Sont également column-major! Matrix( , , , ); MatrixBaseLib: Matrices: Matrix( ); , , , , , , , , , , , , , , , BaseLib: Matrices Attention: Real32 constructeur et setValue(m00,m10,m20,m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33); Row major! Sinon, utiliser setValueTransposed!BaseLib: Manipulation des matrices: BaseLib: Manipulation des matrices m1.mult(m2) == m1 * m2; | m1.multLeft(m2) == m2 * m1; setTranslate / setRotate / setScale Affecte seulement la partie specifié setTransform() affecte la matrice entière void Matrix::setTransform(Vec3f trans, Quat rot, Vec3f scale); inverse / transposeBaseLib: Volumes: BaseLib: Volumes Volumes englobantes pour le Culling Types : BoxVolume SphereVolume CylinderVolume FrustumVolume DynamicVolume Flags pour des états spécial: Valid (invalide: n‘est pas mis à jour) Empty Infinite (toujours visible) Static (ne change pas)BaseLib: Volumes: BaseLib: Volumes Manipulation : clear extendBy (Point or Volume) transform Accès : getCenter getBounds(min, max) Test : intersect(Point/Line/Volume) BaseLib: Quoi d‘autres ? : BaseLib: Quoi d‘autres ? Line / Plane Date / Time Primitives multi-threading Réseaux (Socket, Connection, Select) ... SystemLib: SystemLibFields: Fields définie à partir de BaseType membres de données de FieldContainer (Nodes, ...) Donne information sur eux-mêmes Cardinality Size Name Stored type Conversion de et à string / binaire Cardinalité: Single or Multi Single Fields: Single Fields unique valeur Interface getValue(), setValue(value), setValue(field) Naming Convention SF<TypeName> Exemple : SFInt32 SFNodePtr MultiFields: MultiFields arrays 1D Similaire à STL vectors Iterators, begin(), end(), insert(), erase(), push_back(), [ ] etc. Additionallement : addValue(val) getValue(UInt32 index), setValue(val, index) vector<type>& getValues() FieldContainers: FieldContainers Reflective fournit information sur lui-même fournit accès generique (auto Chargeur / GUI) partageable support Multi-thread support Cluster Extensible Configurable Principaux types de FieldContainer - Node - NodeCores - State, Materials - Windows SystemLib: Structure du Graphe de Scène : SystemLib: Structure du Graphe de Scène Proposition 1 (OpenInventor): + Chaque nœud à un parent - redondance de données Carosserie Moteur Roues Voiture Transform Roue 1 Transform Roue 2 Transform Roue 3 Transform Roue 4 Géometrie Roue Géometrie Roue Géometrie Roue Géometrie RoueSystemLib: Structure du Graphe de Scène: SystemLib: Structure du Graphe de Scène Carosserie Moteur Roux Voiture Transform Rou 1 Transform Rou 2 Transform Rou 3 Transform Rou 4 Géometrie Rou Proposition 2 (OpenInventor): + Pas de redondance de données - parents multiplesSystemLib: Structure du Graphe de Scène : SystemLib: Structure du Graphe de Scène Proposition 3 (OpenSG): + Chaque nœud à un parent + pas de redondance de donées Carosserie Moteur Roux Voiture Transform Rou 1 Transform Rou 2 Transform Rou 3 Transform Rou 4 Géometrie Rou Géometrie Rou Géometrie Rou Géometrie Rou SystemLib: Nodes „A node is a node“ : SystemLib: Nodes „A node is a node“ pas de parents multiple pointers / names can't be used to identify nodes Pas de stockage de données dépendant de la position possible (p.ex. Matrice accumulée) Solution: „lean backbone“ – pour la structure (type Node) „cores“ reutilisable (type NodeCore) definie le comportement stocke les données partagé SystemLib: Node Contents: SystemLib: Node Contents Node: Volume : volume englobante (type: SFDynamicVolume) Parent : le parent du noeud (type: SFNodePtr) Children : les enfants du noeud (type: MFNodePtr) Core : Pointer sur le Core (type: SFNodeCorePtr) AttachmentMap : Information supplémentaire (type: SFAttachmentMap) Méthode: getToWorld() SystemLib: Node Contents: SystemLib: Node Contents MFNodePtr _children; UInt32 getNChildren( void ) const; void addChild (const NodePtr &childP); void insertChild ( UInt32 childIndex, const NodePtr &childP ); void replaceChild ( UInt32 index, const NodePtr &childP ); void replaceChildBy( NodePtr &childP, NodePtr &newChildP); Int32 findChild (const NodePtr &childP ) const; void subChild (const NodePtr &childP ); void subChild ( UInt32 childIndex); NodePtr getChild ( UInt32 childIndex ); SystemLib: OpenSG NodeCores: SystemLib: OpenSG NodeCores Switch Billboard Transform Text Node Core Prog. Mesh Dist. LOD Light Spot Directional Point Env Bitmap Texture Geom Transform Set Comp. Transform Impostor Super Surface Group Geometry Surface Particles Drawable Slices Volume MeshSystemLib: NodeCores - Groups: SystemLib: NodeCores - Groups Group Transform / ComponentTransform Switch Billboard DistanceLOD LightsSystemLib: Group NodeCore: SystemLib: Group NodeCore traverse tous les enfants collectionne les données de tous les enfantsSystemLib: Transform / ComponentTransform NodeCore (hérite de Group): SystemLib: Transform / ComponentTransform NodeCore (hérite de Group) Les transformations s‘accumule en montant l‘arbre Transform: simple transformation matrice (SFMatrix matrix) ComponentTransform: Derivé de Transform (style VRML) Rotation de mouvement Rou Rotation de direction Géometrie SystemLib: NodeCores – Switch (hérite de Group): SystemLib: NodeCores – Switch (hérite de Group) Traverse un, aucun, ou tous les enfants Controlé par un champs SFInt32 choice choice = -1: aucun choice = -2: tous 0 <= choice < nchildren: enfant no. choiceSystemLib: NodeCores – Billboard (hérite de Group): SystemLib: NodeCores – Billboard (hérite de Group) Transformation qui pointe toujours vers la camera (système de coordonnés local axe Z vers l’observateur) Quand l’observateur bouge à droite …. le Billboard s’oriente automatiquement vers l’observateurSystemLib: NodeCores – DistanceLOD (hérite de Group): SystemLib: NodeCores – DistanceLOD (hérite de Group) DistanceLOD choisie l’enfant en fonction de la distance de l’observateur et le Field SFPnt3f center LOD discrets, transitions entre les LOD stocké dans MFReal32 range field Utilise l’enfant dans le range approprié Enfant 0 Enfant 1 Enfant 2 Enfant 3 Range[0] Range[1] Range[2] Range[3] Range[4] rien rienSystemLib: NodeCores - Lights: SystemLib: NodeCores - Lights Lumières ont besoin de deux endroits dans le Graphe de Scène: Un pour déterminer quoi est éclairé Definie par la position dans l‘arbre, tous les enfants sont éclairé Un deuxième pour définir sa position/orientation Definie par un autre noeud, appelé beacon Fields: Activation: SFBool on Couleurs: SFColor3f ambient, diffuse, specular Beacon: SFNodePtr beacon Attenuation: SFReal32 constantAttenuation, linearAttenuation,quadraticAttenuation Carosserie Roux Voiture Racine Route Montagnes Beacon Lumière SystemLib: NodeCores – DirectionalLight (hérite de Light): SystemLib: NodeCores – DirectionalLight (hérite de Light) Source de lumière infiniment distant Rayon de lumière parallele Fields: SFVec3f direction SystemLib: NodeCores – PointLight (hérite de Light): SystemLib: NodeCores – PointLight (hérite de Light) Source de lumière localisée Differentes angles pour un surface plane Fields: SFPnt3f position SystemLib: NodeCores – SpotLight (hérite de Light): SystemLib: NodeCores – SpotLight (hérite de Light) Lumière emis dans un angle spécifié Plus faible en s‘éloignant de la direction S‘arrête à un angle determinéFields: SFPnt3f position SFVec3f direction SFReal32 spotExponent SFReal32 spotCutOffSystemLib: NodeCores - Drawables: SystemLib: NodeCores - Drawables Geometry Particles Slices (dans la version 1.3, Avril 2003) SystemLib – NodeCores: Drawables - Geometry: SystemLib – NodeCores: Drawables - Geometry orienté OpenGL support de tous les primitives OpenGL données directes et indexé plusieurs types de primitive possible par noeud un matérial (material field) Iterateurs pour accès facile: TriangleIterator FaceIterator PrimitiveIteratorSystemLib – NodeCores: Drawables - Geometry - Geometry Data: SystemLib – NodeCores: Drawables - Geometry - Geometry Data Données stockés dans des arrays séparés Positions, Normals, Colors, TexCoords, TexCoords1, ... Types: glBegin() types de primitives (GL_POINT, GL_LINES, GL_TRIANGLE_STRIP, GL_POLYGON etc.) class: GeoPTypesUI8 Longeurs: le nombre de vertices du primitive (= même nombre d‘entrée comme GeoPTypesUI8) class: GeoPLengthsUI32 Indexations pour usage multiple de données class: GeoIndicesUI32 SystemLib – NodeCores: Drawables - Geometry - Geometry Data (non-indexed): SystemLib – NodeCores: Drawables - Geometry - Geometry Data (non-indexed) Types Lengths Positions Normals Colors ...SystemLib – NodeCores: Drawables - Geometry - Geometry Data (indexed): SystemLib – NodeCores: Drawables - Geometry - Geometry Data (indexed) Types Lengths 3 3 4 6 3 3 5 3 Positions Index Normals Colors ... Dans la troisième partie on revient sur ça (format de fichiers OBJ, …)SystemLib – NodeCores: Drawables - Geometry - Geometry Tools: SystemLib – NodeCores: Drawables - Geometry - Geometry Tools Simple Géometrie (OSGSimpleGeometry.h): Nodes: makePlane(), makeBox(), makeCone(), makeCylinder(), makeTorus(), makeSphere(), makeConicalFrustum() NodeCores: même chose + Geo (ex. makeBoxGeo()) Fonctions Géometries (OSGGeoFunctions.h) void calcVertexNormals(GeometryPtr geo); void calcFaceNormals(GeometryPtr geo); void createOptimizedPrimitives(GeometryPtr geo); Crée des strips et fans de triangles à partir d‘un maillageSystemLib - GeoProperty: SystemLib - GeoProperty Un FieldContainer pour avoir un array unique Flexibilité et typage noms typifié, e.g. GeoPositions3f, GeoColors4ub Permet de partager les données entre les géometries Accès générique p.ex. Chaque position comprend: addValue(Pnt3f &val); ainsi que Pnt3f getValue(UInt32 index); 3f 3f 3s 4ub 2fParticles: Particles Rendu de la géométrie active Points, Lignes, Quadrilatérales, ... Données Positions, secPositions (GeoPositionsPtr) Normals (GeoNormalsPtr), Colors (GeoColorsPtr) sizes (MFVec3f) drawOrder (UInt32): Any, BackToFront, FrontToBack SystemLib – NodeCores: Drawables - Geometry – Slices (à partir de 1.3): SystemLib – NodeCores: Drawables - Geometry – Slices (à partir de 1.3) Très simple NodeCore pour le Rendu volumique Rendu des coupes aligné observateur Fields: SFMaterialPtr material , SFUInt32 numberOfSlices, SFVec3fsize A suivre dans OpenSG PlusSystemLib – Materials: SystemLib – Materials comme les états OpenGL Exceptions: transformation, lights Contrôleur for the Rendering Drawable NodeCores appellent leur material à rendre eux-mêmes Peut contrôler Multipass Rendering etc. SystemLib: SimpleMaterial (hérite de Material): SystemLib: SimpleMaterial (hérite de Material) Simple standard OpenGL Material Couleurs (SFColor3f): ambient, diffuse, specular, emission Shininess (SFReal32) Transparency (SFReal32) : automatique „blending“ et sorting Lit (SFBool): éclairé ou pas ColorMaterial (SFUint32) Definie l‘interaction entre les couleurs de la géométrie et de l‘éclairage Par défaut: GL_DIFFUSELighting Parameters: Lighting ParametersSystemLib: SimpleTexturedMaterial (hérite de Material): SystemLib: SimpleTexturedMaterial (hérite de Material) Même que SimpleMaterial, mais en plus: Image (SFImageP): l‘image de texture minFilter & magFilter (SFUInt32): filtrage Utilise des paramètres de OpenGL (p.ex. glTexParameter) envMode (SFUInt32): environnement de texture. Comment combiner lumière et texture, par defautdefault: GL_REPLACE, alternatives: GL_MODULATE, GL_DECAL, voir détails dans OpenGL envMap (SFBool): si la texture doit être utiliser comme Environment MapSystemLib: Image: SystemLib: Image Traite plusieurs formats différents: (L,LA,RGB,RGBA, ...), Images 3D, mipmaps and multi-images img->read(Char8 *name); // ouvre le fichier Charge de formats: PPM, TIFF, JPG, RGB, PNG, enregistre: PPM, TIFF, JPG, RGB (N‘est pas thread-safe encore)SystemLib: Environment Maps: SystemLib: Environment Maps Used to simulate reflectionsSystemLib: Format de Fichiers supporté:: SystemLib: Format de Fichiers supporté: Formats: VRML97 (à voir dans la partie 3) OFF AliasWavefront OBJ (à voir dans la partie 3) RAW OSG (format propriétaire) BIN Chargeur générique: (OSGSceneFileHandler.h) NodePtr root = SceneFileHandler::the().read(fileName);SystemLib: Tree Traversals: Actions: SystemLib: Tree Traversals: Actions Types: Drawing: DrawAction Rendering: RenderAction Picking: IntersectAction Creation act = xxxAction::create() Traversal: act->apply( root ); SystemLib: DrawAction (hérite de Action): SystemLib: DrawAction (hérite de Action) Appelle directement les commandes OpenGL Passé a la fenêtre Maintenant: remplacé par RenderActionSystemLib: RenderAction (hérite de Action): SystemLib: RenderAction (hérite de Action) Construit un DrawTree en parcourant le graph et fait le rendu de ce même Out-of-order et multi-stage / multi-pass support pour le rendu Nouvelle version dans 1.3 Traite le State Sorting, transparence inclusSystemLib: IntersectAction (hérite de Action): SystemLib: IntersectAction (hérite de Action) Intersection de la scène avec un rayon Utilise une „Line“ pour définir la rayon act->setLine( l ); Retourne Object frappé Triangle frappé Point frappé SystemLib: Simple Traversals: SystemLib: Simple Traversals Souvent définir une nouvelle action n’est pas nécessaire: un simple appelle d’une fonction en entrant/quittant un noeud est suffisant 4 fonctions traverse() Commencer par une liste ou un noeud unique Appelle une fonction en entrant (et sortant) Voir tutorials 08traverseSystemLib - Windows : SystemLib - Windows Comme OpenGL OpenSG ne crée pas de fenêtres Garde l‘information pour le rendu Contexte et objets OpenGL (p.ex. textures) Viewports SystemLib - Windows: SystemLib - Windows Initialisation Mettre les paramêtres de la fenêtre (displayFunction etc.) appeler init() Necessite de savoir quand la taille de la fenêtre change appeler win->resize() Necessite de savoir début et fin d‘un „frame“ appeler frameInit() et frameExit() Ou appeler window->render() SystemLibs – Windows - Viewports: SystemLibs – Windows - Viewports Partage la fenêtre en plusieurs parties E.g.: left=0, right=100, bottom=-1, top=0.5 crée un Viewport de largeur 100 pixel dans la moitié bas de la fenêtre Stocke le paramêtres de rendu Background, Camera, Root Node, Foregrounds w pixel h pixel 100 pixel h/2 pixelSystemLib – Windows - Background: SystemLib – Windows - Background Definie le fond avant l‘affichage de la „frame“ Variantes: SolidBackground Une couleur GradientBackground Un nombre de couleurs spécifiés à des postitions différents SkyBackground Similaire de VRMLSystemLib – Windows - Camera: SystemLib – Windows - Camera Definie les paramêtres de la projection ainsi que la position/orientation de l‘observateur Attributs générales: Position/orientation sont definie dans un noeud du graph (SFNodePtr beacon) Par défaut Y en haut, et regarde negative axe Z (comme OpenGL) SFReal32 near et far distance PerspectiveCamera: Vertical field of view (fov) MatrixCamera: pour spécifier les matrices Root Transform Scene Camera Beacon Viewport SystemLib – Windows - Camera Decorators: SystemLib – Windows - Camera Decorators „Décore“ le Caméra Tiled Displays Stereo Projection Systems Root Transform Scene Camera Beacon DecoRight DecoLeft PortRight PortLeft SystemLib – Windows - Foreground: SystemLib – Windows - Foreground Appelé après le rendu du Viewport Plusieurs sont possible Existant: LogoForeground: déssine un logo SimpleStatisticsForeground ... Version 1.3 GraphicsStatisticsForegroundApplications: Applications Besoin d‘une fenêtre Le fenêtre a besoin de Viewports qui ont besoin d‘un camera, background/foregrounds, et la racine du Graphe de Scène La scène doit contenir un „beacon“ pour la Caméra, un ou plusieurs lumières, et la géometrie Alternative: Utiliser SimpleSceneManager Window Background Foreground Camera Decorator ViewportsSystemLib – Windows - SimpleSceneManager: SystemLib – Windows - SimpleSceneManager Utilitaire classe pour des applications facile Prend un NodePtr pour la racine du Graphe de Scène et un WindowPtr et fait le reste crée Camera, Viewport, Headlight simule TrackballNavigation Doit être informé de Resize Mouse Move/Button Press/ReleaseSystemLib – Windows - Trackball Navigation: SystemLib – Windows - Trackball Navigation Classe pour faciliter les techniques d’interaction 3D avec la souris LeftDrag: rotation autour du centre MiddleDrag: translation, RightDrag or MouseWheel: zoom in/out LeftClick: définie le centre WindowSystemLib: WindowSystemLibWindowSystemLibs – WindowGLUT - HelloOpenSG.cpp: WindowSystemLibs – WindowGLUT - HelloOpenSG.cpp void display( void ) { mgr->redraw(); } void reshape( int w, int h ) { mgr->resize( w, h ); glutPostRedisplay(); } void motion(int x, int y) { mgr->mouseMove( x, y ); glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if ( state ) mgr->mouseButtonRelease( button, x, y ); else mgr->mouseButtonPress( button, x, y ); glutPostRedisplay(); } int main (int argc, char **argv) { osgInit(argc,argv); glutInit(&argc, argv); glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH ); int winid = glutCreateWindow("OpenSG"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutMouseFunc(mouse); glutMotionFunc(motion); GLUTWindowPtr gwin= GLUTWindow::create(); gwin->setWinID(winid); gwin->init(); NodePtr scene = makeTorus( .5, 2, 16, 16 ); mgr = new SimpleSceneManager; mgr->setWindow( gwin ); // premiere partie de mgr mgr->setRoot( scene ); // deuxième partie de mgr mgr->showAll(); // postionne la caméra glutMainLoop(); osgExit(); return 0; } Graphes Multi-threading: beginEditCP, endEditCP: Graphes Multi-threading: beginEditCP, endEditCP 1er exemple: NodePtr scene = makeTorus( .5, 2, 16, 16 ); // OSGSimpleGeometry 2ème exemple: NodePtr scene = Node::create(); beginEditCP(scene, Node::CoreFieldMask | Node::ChildrenFieldMask); { scene->setCore(group); scene->addChild(….); scene->addChild(….); } endEditCP (scene, Node::CoreFieldMask | Node::ChildrenFieldMask); Pourquoi?Graphes de Scènes: Exigences – multi-threading: Graphes de Scènes: Exigences – multi-threading Graphe de Scène stocke les données de la scène Tasks multiples indépendants Peuvent marcher en parallel Peuvent être asynchrone Multi-threading - Solution : Redondance (Data replication): Multi-threading - Solution : Redondance (Data replication) Chaque thread a besoin d‘une copie séparée (Performer) Problème: consommation de mémoire Qu‘est-ce qui est partagé? OpenSG: Niveau de Field Str A Str B Str A Str B Field Data Str A Str B Field DataMulti-threading Cluster Configuration: Multi-threading Cluster Configuration Client Application Ouvre une fenêtre Procès serveur générique Pratiquement application-indépendent Distribution par multicast Multi-threading : Impacte en programmation OpenSG: Multi-threading : Impacte en programmation OpenSG Les pointeurs Standard ne marche plus: Remplacer <Type>* par <Type>Ptr // Custom Pointer - Custom dynamic_cast<Type *> implementation Données doivent être repliquées avant d‘être changées Système nécessite de savoir quand les données changent: dans OpenSG, l‘utilisateur doit informer le système beginEditCP(FCPtr, fieldmask); // CP est le „CustomPointer“ endEditCP (FCPtr, fieldmask); Fieldmask: un bit par „field“ du FieldContainer, par défaut: tous Exemple : beginEditCP(nodeP, Node::VolumeFieldMask | Node::ChildrenFieldMask); Graphes de Scènes: Toujours et pour tout?: Graphes de Scènes: Toujours et pour tout? Quand est-ce qu’il fait un sens d’utiliser un Graphe de Scène? Graphes de Scènes sont retained-mode Approrié: - accès aux données de toute la scène permets optimization (comme Culling est State-Sorting) - pour des scènes très complexes (grosses géometrie, bcp de changement de material, …) - bcp de fonctions d’outil prédefinies (example classique: chargeur de fichiers) - en plus dans OpenSG: pour des applications multi-thread (parallel processing, clustering) et multi-pipe - pour commencer un nouveau projet Graphes de Scènes: Toujours et pour tout?: Graphes de Scènes: Toujours et pour tout? Peut-être mal approprié - pour des scènes très dynamique, maintenir la structure peut manger le profit - pour des scènes très simple (un material, ..) - pour des projets déjà établi 3.) Format de Fichiers 3D: 3.) Format de Fichiers 3D - VRML - OBJ … #VRML V2.0 utf8 DEF APP_0001 Appearance { texture ImageTexture { url "test.jpg" } } Transform { translation -1 0 0 children [ Shape { appearance USE APP_0001 geometry IndexedFaceSet { coord Coordinate { point [ 370363 0 -285019, 370363 10.35 -285019, 370365 0 -285012, 370365 10.35 -285012 ] } texCoord TextureCoordinate { point [ 0 0, 1 0, 1 1, 0 1 #This file is generated by geoShape lib # 285 vertex elem, offset: 0 v -212.285995 -65.909798 27.430000 v -182.104004 -55.423100 34.799999 v -270.171997 -106.214996 0.000000 v -212.285995 -65.909798 -27.430000 v 195.158005 -14.477000 0.000000 v -143.682999 -62.438801 43.180000 v -243.022995 -34.044998 0.000000 v 211.268005 -58.594200 -11.940000 v 240.934006 -65.579002 -73.150002 v 240.934006 -65.579002 73.150002 v 211.268005 -58.594200 11.940000 v -106.839996 40.523998 -22.350000 v -199.781998 -16.746000 -31.750000 v 37.980999 60.744999 0.000000 v -182.104004 -55.423100 -34.799999 v -143.682999 -62.438801 -43.180000 v -104.494003 -60.085899 -41.150002 v -13.839000 -62.945202 -38.099998 v -106.888000 -79.097000 -80.010002VRML: VRML Virtual Reality Modeling Language (VRML) Format de fichier pour des objets et mondes 3D interacitfs. concue pour être utilisé sur Internet, Intranets, et Client/Serveur Apps fomat d’interchange universel bcp d’applications: visualisation scientifique, présentation multimedia, divertissements, éducation, pages Web, mondes virtuelles partagés, apps pour des ingénieurs (CAO, …)VRML: VRML Historique - VRML 1.0 Mai 1995 - VRML 2.0 Août 1996 (gros changement) - VRML 97 Décembre 1997 (petit changement) Extension: .wrlVRML 97 – Critère de Design: VRML 97 – Critère de Design Authorability - logiciel créent, éditent, et maintiennent et convertissent des fichier VRML Composability - reutilisation de fichier VRML grace aux combinaison possible Extensibility - possible d’ajouter des types d’objet non-defini Be capable of implementation Performance (scalable) Scalability (large 3D worlds)VRML 97 - Characteristiques: VRML 97 - Characteristiques VRML peut représenter des objet multimedia 3D statique et dynamique animé avec des URL’s aux autres formats medias comme text, sons, films, et images. indépendance de la plateforme extensibilité qui permet de définir de nouveux objets dynamiques 3DVRML 97: VRML 97 Fichiers VRML contiennent: Le Header #VRML V2.0 utf8 Commentaires – ligne commencent par # Nodes – Information sur la scène Fields – Attributs des Nœuds (SF, MF) Values – valeurs des attributs et plus . . . VRML 97: VRML 97 #VRML V2.0 utf8 # A Cylinder Shape { appearance Appearance { material Material { } } geometry Cylinder { height 2.0 radius 1.0 } } Remarque: ASCII – UTF8 Format Pour lisbilité et « edit by hand » VRML 97: VRML 97 À voir: Le Tutorial SIGGRAPH http://www.sdsc.edu/~nadeau/Courses/Siggraph98vrml/vrml97/vrml97.htm La Spécification VRML 97 () http://www.web3d/Specifications/VRML97/ Disponible sur la page du cours: http://www.labri.fr/~preuter/imageSynthesis/sceneGraphs AliasWavefront’s OBJ: AliasWavefront’s OBJ format de texte également très simple pour répresenter des maillages en OpenSG et VRML: indexedFaceSet - extension: .obj AliasWavefront’s OBJ: AliasWavefront’s OBJ # commentaire v 0 0 0 # vertex index 1 position x y z v 1 0 0 # vertex index 2 v 0 1 0 # vertex index 2 f 1 2 3 # face 1 2 3 # attention: Index commence à 1 !! 1 2 3AliasWavefront’s OBJ: AliasWavefront’s OBJ # commentaire v 0 0 0 # vertex index 1 position x y z v 1 0 0 # vertex index 2 v 0 1 0 # vertex index 2 … vt 0 0 # texture index 1 vt 1 0 # texture index 2 vt 0 1 # texture index 3 … f 1/1 2/2 3/3 # vertex/texture vertex/texture vertex/texture 1 2 3AliasWavefront’s OBJ: AliasWavefront’s OBJ # commentaire … vn 0.7 0.7 0 # vertex normal index 1 direction x y z vn 0 0.7 0.7 # vertex normal index 2 vn 0 1 0 # vertex normal index 3 … f 1//1 2//2 3//3 # vertex//normal vertex//normal vertex//normal f …. … … .. .AliasWavefront’s OBJ: AliasWavefront’s OBJ # ou bien f 1/1/1 2/2/2 3/3/3 # vertex/texture/normal vertex/texture/normal vertex/texture/normal f … ….. … .. f … ….. … .. …AliasWavefront’s OBJ: AliasWavefront’s OBJ # negative indices pour décrire des gros groupes v -0.500000 0.000000 0.400000 v -0.500000 0.000000 -0.800000 v -0.500000 1.000000 -0.800000 v -0.500000 1.000000 0.400000 f -4 -3 -2 -1AliasWavefront’s OBJ: AliasWavefront’s OBJ # extension G # début d’un groupe Usemtl red # utiliser un fichier .mtl pour décrire le matérial AliasWavefront’s OBJ: AliasWavefront’s OBJ v 1 1 1 v 1 1 -1 v 1 -1 1 v 1 -1 -1 v -1 1 1 v -1 1 -1 v -1 -1 1 v -1 -1 -1 f 1 3 4 2 f 5 7 8 6 f 1 5 6 2 f 3 7 8 4 f 1 5 7 3 f 2 6 8 4Même chose en VRML: Même chose en VRML #VRML V2.0 utf8 Shape { appearance Appearance { . . . } geometry IndexedFaceSet { coord Coordinate { point [# X Y Z 1.0 1.0 1.0, 1.0 1.0 –1.0, …] } coordIndex [0, 2, 3, 1, -1, 4, 6, 7, 5, -1, …. ] }}