1 / 114

Graphes de sc nes l exemple de OpenSG

emilia
Download Presentation

Graphes de sc nes l exemple de OpenSG

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    1. Graphes de scènes à l‘exemple de OpenSG Patrick Reuter LaBRI – INRIA futurs Université Bordeaux I

    2. Page 2 Programme 1.) Graphe de Scènes Motivation Exemples 2.) OpenSG Motivation Introduction Exemples 3.) Format de Fichiers 3D scène (VRML) 3D maillages (OBJ)

    3. 1.) Graphe de Scènes

    4. Page 4 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

    5. Page 5 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”

    6. Page 6 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

    7. Page 7 Le graphe de scène dans l’architecture -

    8. Page 8 Graphes de Scènes - Exemple

    9. Page 9 Graphes de Scènes - Exemple

    10. Page 10 Graphes de Scènes - Exemple

    11. Page 11 Graphes de Scènes - Exemple

    12. Page 12 Graphes de Scènes - Exemple

    13. Page 13 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, …)

    14. Page 14 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 - …

    15. Page 15 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

    16. Page 16 Graphes de Scènes: Exigences – multi-pipe au LaBRI: Hemicyclia (SGI Reality Center)

    17. Page 17 Systèmes existantes SIGGRAPH 99: die grosse Erwartung 5 Jahre warten ab 1995 haben alle gewartet, wollten Redesign machen, haben dait gearbeitet stehen da wo wir 1995 waren SIGGRAPH 99: die grosse Erwartung 5 Jahre warten ab 1995 haben alle gewartet, wollten Redesign machen, haben dait gearbeitet stehen da wo wir 1995 waren

    18. Page 18 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)

    19. Page 19 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.0

    20. Page 20 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 performance

    21. Page 21 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 ?

    22. Page 22 OpenSG

    23. Page 23 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 In keinem Einzelsystem verfuegbarIn keinem Einzelsystem verfuegbar

    24. Page 24 ! 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 alternative

    25. Page 25 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 Solaris

    26. Page 26 O.I.N.O.S. OpenSG n’est pas Open Scene Graph! Deux projets totalement indépendants Début en meme temps

    27. Page 27 Membres du Forum OpenSG

    28. Page 28 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/OpenSGPLUS

    29. Page 29 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 Volumes

    30. 2.) OpenSG

    31. Page 31 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 Windowsystem

    32. Page 32 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

    33. Page 33 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::getValueAsAxisDeg

    34. Page 34 BaseLib Nécessite Startup / Termination calls (OSGBaseFunctions.h) osgInit(Int32 argc, Char8 **argv); osgExit(void);

    35. Page 35 BaseLib: Vectors / Points

    36. Page 36 BaseLib: Couleurs

    37. Page 37 BaseLib: Quaternions répresentation d‘orientation set/get de/à différents types de valeurs fonctions standards: normalize, slerp, mult, multVec etc. rien de spécial

    38. Page 38 BaseLib: Matrices Stockage comme dans OpenGL: ? column major!

    39. Page 39 BaseLib: Matrices [ ] operators Constructeurs à partir de vecteur fonctions à base de vecteur Sont également column-major!

    40. Page 40 BaseLib: Matrices Attention: Real32 constructeur et setValue(m00,m10,m20,m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33);

    41. Page 41 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 / transpose

    42. Page 42 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)

    43. Page 43 BaseLib: Volumes Manipulation : clear extendBy (Point or Volume) transform Accès : getCenter getBounds(min, max) Test : intersect(Point/Line/Volume)

    44. Page 44 BaseLib: Quoi d‘autres ? Line / Plane Date / Time Primitives multi-threading Réseaux (Socket, Connection, Select) ...

    45. Page 45 SystemLib

    46. Page 46 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

    47. Page 47 Single Fields unique valeur Interface getValue(), setValue(value), setValue(field) Naming Convention SF<TypeName> Exemple : SFInt32 SFNodePtr

    48. Page 48 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()

    49. Page 49 FieldContainers Reflective fournit information sur lui-même fournit accès generique (auto Chargeur / GUI) partageable support Multi-thread support Cluster Extensible Configurable

    50. Page 50 SystemLib: Structure du Graphe de Scène Proposition 1 (OpenInventor): + Chaque nœud à un parent - redondance de données

    51. Page 51 SystemLib: Structure du Graphe de Scène Proposition 2 (OpenInventor): + Pas de redondance de données - parents multiples

    52. Page 52 SystemLib: Structure du Graphe de Scène Proposition 3 (OpenSG): + Chaque nœud à un parent + pas de redondance de donées

    53. Page 53 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é

    54. Page 54 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()

    55. Page 55 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 );

    56. Page 56 SystemLib: OpenSG NodeCores

    57. Page 57 SystemLib: NodeCores - Groups Group Transform / ComponentTransform Switch Billboard DistanceLOD Lights

    58. Page 58 SystemLib: Group NodeCore traverse tous les enfants collectionne les données de tous les enfants

    59. Page 59 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)

    60. Page 60 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. choice

    61. Page 61 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)

    62. Page 62 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é

    63. Page 63 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

    64. Page 64 SystemLib: NodeCores – DirectionalLight (hérite de Light) Source de lumière infiniment distant Rayon de lumière parallele Fields: SFVec3f direction

    65. Page 65 SystemLib: NodeCores – PointLight (hérite de Light) Source de lumière localisée Differentes angles pour un surface plane Fields: SFPnt3f position

    66. Page 66 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 spotCutOff

    67. Page 67 SystemLib: NodeCores - Drawables Geometry Particles Slices (dans la version 1.3, Avril 2003)

    68. Page 68 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 PrimitiveIterator

    69. Page 69 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

    70. Page 70 SystemLib – NodeCores: Drawables - Geometry - Geometry Data (non-indexed)

    71. Page 71 SystemLib – NodeCores: Drawables - Geometry - Geometry Data (indexed)

    72. Page 72 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 maillage

    73. Page 73 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);

    74. Page 74 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

    75. Page 75 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 Plus

    76. Page 76 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.

    77. Page 77 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_DIFFUSE

    78. Page 78 Lighting Parameters

    79. Page 79 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 Map

    80. Page 80 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)

    81. Page 81 SystemLib: Environment Maps Used to simulate reflections

    82. Page 82 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);

    83. Page 83 SystemLib: Tree Traversals: Actions Types: Drawing: DrawAction Rendering: RenderAction Picking: IntersectAction Creation act = xxxAction::create() Traversal: act->apply( root );

    84. Page 84 SystemLib: DrawAction (hérite de Action) Appelle directement les commandes OpenGL Passé a la fenêtre Maintenant: remplacé par RenderAction

    85. Page 85 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 inclus

    86. Page 86 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é

    87. Page 87 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 08traverse

    88. Page 88 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

    89. Page 89 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()

    90. Page 90 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

    91. Page 91 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 VRML

    92. Page 92 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

    93. Page 93 SystemLib – Windows - Camera Decorators „Décore“ le Caméra Tiled Displays Stereo Projection Systems

    94. Page 94 SystemLib – Windows - Foreground Appelé après le rendu du Viewport Plusieurs sont possible Existant: LogoForeground: déssine un logo SimpleStatisticsForeground ... Version 1.3 GraphicsStatisticsForeground

    95. Page 95 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

    96. Page 96 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/Release

    97. Page 97 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

    98. Page 98 WindowSystemLib

    99. Page 99 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; }

    100. Page 100 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);

    101. Page 101 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

    102. Page 102 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 Vielzahl Anwendungen untersucht Analyse Vielzahl Anwendungen untersucht Analyse

    103. Page 103 Multi-threading Cluster Configuration Client Application Ouvre une fenêtre Procès serveur générique Pratiquement application-indépendent Distribution par multicast

    104. Page 104 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);

    105. Page 105 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

    106. Page 106 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

    107. 3.) Format de Fichiers 3D

    108. Page 108 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, …)

    109. Page 109 VRML Historique - VRML 1.0 Mai 1995 - VRML 2.0 Août 1996 (gros changement) - VRML 97 Décembre 1997 (petit changement) Extension: .wrl

    110. Page 110 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)

    111. Page 111 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 3D

    112. Page 112 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 . . .

    113. Page 113 VRML 97 #VRML V2.0 utf8 # A Cylinder Shape { appearance Appearance { material Material { } } geometry Cylinder { height 2.0 radius 1.0 } }

    114. Page 114 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

    115. Page 115 AliasWavefront’s OBJ format de texte également très simple pour répresenter des maillages en OpenSG et VRML: indexedFaceSet - extension: .obj

    116. Page 116 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 !!

    117. Page 117 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

    118. Page 118 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 …. … … .. .

    119. Page 119 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 … ….. … .. …

    120. Page 120 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 -1

    121. Page 121 AliasWavefront’s OBJ # extension G # début d’un groupe Usemtl red # utiliser un fichier .mtl pour décrire le matérial

    122. Page 122 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

    123. Page 123 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, …. ] }}

More Related