graphesDeScenes

Uploaded from authorPOINTLite
Views:
 
Category: Entertainment
     
 

Presentation Description

No description available.

Comments

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 I

Programme: 

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ènes

Motivation 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 - Exemple

Graphes de Scènes - Exemple: 

Graphes de Scènes - Exemple

Graphes de Scènes - Exemple: 

Graphes de Scènes - Exemple

Graphes 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 … } # avion

Graphes 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 à utiliser

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

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++ Fahrenheit

OpenInventor - 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.0

Java3D - 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 performance

Graphes 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 alternative

Developpement: 

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

O.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/OpenSGPLUS

Status & 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 Volumes

2.) OpenSG : 

2.) OpenSG Un Graphe de Scène OpenSource Une librairie – à utiliser comme n’importe quelle autre librairie

Structure 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 Windowsystem

BaseLib : 

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::getValueAsAxisDeg

BaseLib: 

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 + p

BaseLib: 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: Couleurs

BaseLib: 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écial

BaseLib: 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( , , , ); Matrix

BaseLib: 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 / transpose

BaseLib: 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: 

SystemLib

Fields: 

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 Roue

SystemLib: 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 multiples

SystemLib: 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 Mesh

SystemLib: NodeCores - Groups: 

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

SystemLib: Group NodeCore: 

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

SystemLib: 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. choice

SystemLib: 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’observateur

SystemLib: 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 rien

SystemLib: 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 spotCutOff

SystemLib: 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 PrimitiveIterator

SystemLib – 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 maillage

SystemLib - 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 2f

Particles: 

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 Plus

SystemLib – 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_DIFFUSE

Lighting Parameters: 

Lighting Parameters

SystemLib: 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 Map

SystemLib: 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 reflections

SystemLib: 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 RenderAction

SystemLib: 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 inclus

SystemLib: 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 08traverse

SystemLib - 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 pixel

SystemLib – 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 VRML

SystemLib – 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 GraphicsStatisticsForeground

Applications: 

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 Viewports

SystemLib – 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/Release

SystemLib – 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: 

WindowSystemLib

WindowSystemLibs – 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 Data

Multi-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.010002

VRML: 

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: .wrl

VRML 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 3D

VRML 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 3

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 … 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 3

AliasWavefront’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 -1

AliasWavefront’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 4

Mê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, …. ] }}