E N D
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, …. ] }}