Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
U N I V E R S I T Ä T
KOBLENZ · LANDAU
(2) Hierarchien
Vorlesung
„Computergraphik 2“
S. Müller
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Organisatorisches
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 3 -
Vorlesung CG 2+3
Die Veranstaltung besteht aus 2 Teilen, wobei in der
Mitte und am Ende eine Klausur geschrieben wird.
Für den Diplomstudiengang bilden beide Noten die
CG2-Veranstaltung im Hauptdiplom CV.
Für Bachelor zählt der erste Teil als CG2.
Für Master der zweite Teil als CG3.
Keine Voraussetzungen zur Teilnahme an der Klausur
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 4 -
Übersicht zur Vorlesung CG 2:
Hierarchische Strukturen und Szenengraphen
Transformations- und Bounding –Volume-Hierarchien, Open-Inventor, OpenSG, 3D Engine
GPU
Vertex- und Fragment-Shader, Schatten
Beleuchtung
Beleuchtungsmodelle, Beschleunigung von Ray-Tracing, Echtzeit Raytracing, GPU, Radiosity
CG 3 (Beginn: 24.6.):
Kurven und Flächen
Delaunay, Voronoi, Winged-Edge, B-Splines, NURBS, Flächen, Meshes
Wissenschaftliche technische Visualisierung
Grundlagen, Volumenrendering
Klausuren (voraussichtlich):
8. 6. 2012
19. 7. 2012
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Vorlesung Plan (CG2)
S. Müller - 5 -
19.04.2012 1 3D Engines
20.04.2012 2 Hierachien
26.04.2012 3 Buffer 23.04.2012 1. Übung 3D Engines
27.04.2012 4 Beleuchtung
03.05.2012 5 Shading Languages 30.04.2012 2. Übung Buffer/Bel
04.05.2012 6 GPU 2
10.05.2012 7 Normal Mapping 07.05.2012 3. Übung GPU2
11.05.2012 8 Schatten
17.05.2012 Himmelfahrt 14.05.2012 4. Übung Schatten/Normalen
18.05.2012 9 RT-Beschleunigungen
24.05.2012 10 Radiosity
25.05.2012 WIEDERHOLUNG
31.05.2012 Pfingsten
01.06.2012 Pfingsten
07.06.2012 Fronleichnam 04.06.2012 5. Übung RT Beschl./Radiosity
08.06.2012 KLAUSUR
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 6 -
Literatur
OpenGL Programming
Guide: The Official Guide to
Learning OpenGL, Version
1.2 (3rd Edition) by Mason
Woo, Jackie Neider, Tom
Davis, Dave Shreiner,
Addison-Wesley, 1999
Peter Shirley: Fundamentals
of Computer Graphics, A K
Peters LTD, 2002
Eric Haines, Tomas Möller: Real-
Time Rendering, 3rd Edition
Rick Parent: Computer
Animation
David Rogers: An Introduction to
NURBS
Alan Watt: 3D Computer
Graphics (3rd Edition)
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 7 -
Wdh. I: OpenGL Rendering Pipeline
pRTSTVp
MODELVIEWM
'
''' pMMMp
PROJECTIONM
LRPERSPORTHO
Division durch homogene Koordinate
Kamera im Ursprung, Blickrichtung entlang
der negativen z-Achse (Rechtssystem)
Linkssystem: z-Achse nicht-linear skaliert,
kanonisches Volumen vor perspektivischer
Division, hier wird geclippt.
Kanonisches Volumen
Bildschirm- bzw.
Fensterkoordinaten,
z-Wert zwischen
(0,1), Rasterisierung
Viewport-Transformation
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 8 -
Wdh. II: Wo wird beleuchtet? Nach der Modelview-Transformation
sind Normalen und Eckpunkte im
Kamerakoordinatensystem. Diese
Werte werden für die Beleuchtung
verwendet.
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 9 -
Wdh. III: Wo wird texturiert?
Während der Rasterisierung
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Hierarchien
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 11 -
Karosserie
Räder
Transformationen
Radgeometrie
Beispiel: Auto
Vorgehen beim Rendern
Zeichne die Karosserie
Merke dir wo du bist
Transformation zum rechten
Vorderrad
Zeichne das Rad und werfe
die letzte Transformaiton weg
(also zurück zum Ursprung
der Karosserie)
Merke dir wo du bist
Transformation zum linken
Vorderrad…
Radgeometrie ist um den Ursprung modelliert
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 12 -
Matrizenstack
Die bisher „aktuelle“ Matrix genannte Matrix ist
tatsächlich als Stack implementiert.
Oft benötigt man einen Zwischenspeicher für Matrizen
Lösung: Matrixstack
glPushMatrix();
kopiert die oberste Matrix („merke dir wo du bist“)
glPopMatrix();
entfernt die oberste Matrix („gehe dahin zurück, wo du warst“)
Push und Pop bilden quasi Klammern um
Transformationen
der Matrixstack kann min. 32 Einträge fassen
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 13 -
Matrizenstack
C B A C B A C
C B A C B A D glPopMatrix();
entfernt die oberste Matrix
„ gehe dahin zurück, wo du warst“
glPushMatrix();
kopiert die oberste Matrix
„merke dir wo du bist“ : MMODELVIEW
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 14 -
Beispiel: Auto
Karosserie um den Ursprung
mit Breite 2, Höhe 0.5 und
Tiefe 1
Schreiben sie ein Programm,
das die Karosserie aus einem
Einheitswürfel erzeugt
(Bereich (-0.5,0.5) mit
gluWireCube(1.0))
Setze die Räder (Kugeln mit
Radius 0.1) in die Ecken mit
glutWireSphere(0.1,10,10);
x
z
y
Breite: 2
Höhe: 0.5
Tiefe: 1
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 15 -
Als Szenengraph
z
y
2
Tiefe: 1
0.5
Trafo
Auto
x
Trafo
Karosserie
Trafo
Rad 1
Trafo
Rad 2
Trafo
Rad 4
Trafo
Rad 3
Auto
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 16 -
Beispiel-Code
glPushMatrix();
glScalef(2,0.5,1);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(-1,-0.25,-0.5);
glutWireSphere(0.1,10,10);
glPopMatrix();
glPushMatrix();
glTranslatef(1,-0.25,-0.5);
glutWireSphere(0.1,10,10);
glPopMatrix();
glPushMatrix();
glTranslatef(1,-0.25,0.5);
glutWireSphere(0.1,10,10);
glPopMatrix();
glPushMatrix();
glTranslatef(-1,-0.25,0.5);
glutWireSphere(0.1,10,10);
glPopMatrix();
x
z
y
2
0.5
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 17 -
Beispiel: Auto
glPushMatrix();
glScalef(2,0.5,1);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(-1,-0.25,-0.5);
glutWireSphere(0.1,10,10);
glPopMatrix();
x
z
y
2
0.5
glRotatef(alpha, 0.0, 0.0, 1.0);
Aufgabe: Auto fährt und
Räder drehen sich
glTranslatef( x, 0, 0);
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Lokale Koordinatensysteme
S. Müller - 18 -
rp
y
x
z
y
x
z
y
x
z
R
A
W
1ba
2R1R
Auto in Welt:
Rad in Auto:
Rad in Welt:
aw pap
1RT
ra pbp
2RT
rw pbap 21 RTRT
ap
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 19 -
Beispiel: Armbewegung
Ober- und Unterarm seien durch
Quader mit den angegebenen
Ausdehnungen modelliert
Schreiben sie ein Programm,
das den Arm an dem
Schultergelenk (s) und dem
Ellbogen (e) durch Eingabe der
Werte im Wertebereich bewegt
Verwenden sie dazu als einzige
geometrische Primitive Würfel
im Bereich (-0.5,0.5) mit
gluWireCube(1.0)
2 1.5
0.4
1
900 s
900 e
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 20 -
Trafo
rechter Arm
glTranslatef (1.0, 0.0, 0.0);
glScalef (2.0, 0.4, 1.0);
Oberarm
/*glTranslatef (0.0, 0.0, 0.0); */
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.75, 0.0, 0.0);
glScalef (1.5, 0.4, 1.0);
Unterarm
Rechter Arm
Welt-
koordinaten
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 21 -
Trafo
rechter Arm
glTranslatef (1.0, 0.0, 0.0);
glScalef (2.0, 0.4, 1.0);
Oberarm
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.75, 0.0, 0.0);
glScalef (1.5, 0.4, 1.0);
Unterarm
Rechter Arm
Lokale Koordi-
natensysteme
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 22 -
Beispiel Code
Trafo
rechter Arm
glTranslatef (1.0, 0.0, 0.0);
glScalef (2.0, 0.4, 1.0);
Oberarm
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.75, 0.0, 0.0);
glScalef (1.5, 0.4, 1.0);
Unterarm
Rechter Arm
glClear (GL_COLOR_BUFFER_BIT);
glColor3f(0,0,0);
glLoadIdentity();
gluLookAt( 0,0,10, 0,0,0, 0,1,0);
glRotatef ((GLfloat) shoulder, 0.0, 0.0, 1.0);
glPushMatrix();
glTranslatef (1.0, 0.0, 0.0);
glScalef (2.0, 0.4, 1.0);
glutWireCube (1.0);
glPopMatrix();
glTranslatef (2.0, 0.0, 0.0);
glRotatef ((GLfloat) elbow, 0.0, 0.0, 1.0);
glTranslatef (0.75, 0.0, 0.0);
glScalef (1.5, 0.4, 1.0);
glutWireCube (1.0);
glFlush();
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Geometrische Interpretation
Transformationen hintereinander versucht man sich
meist in einzelnen Schritten vorzustellen.
Bsp.: Transformation von lokalen Koordinaten in
Weltkoordinaten:
Interpretation in Einzelschritten bedeutet, dass man
sich für die Schritte anfangs die Einheitsmatrix denkt:
Danach wird Schritt für Schritt jede Einheitsmatrix
durch die tatsächliche Matrix ersetzt.
Es gibt 2 übliche Interpretationen:
S. Müller - 23 -
lw pp 1234 MMMM
lw pp EEEE
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Geometrische Interpretation
Weltkoordinaten:
man ersetzt von rechts
Interpretation: wir schieben das
Objekt durch die Welt, bzw. wir
lesen das OpenGL Programm
von unten nach oben.
Alle Transformationen beziehen
sich dabei auf das
Weltkoordinatensystems
Anfangs ist das Objekt im
Weltkoordinatensystem geben.
Dann wird M1 auf das Objekt angewandt.
Dann M2 bzgl. dem WKS etc..
Lokale Koordinatensysteme:
man ersetzt von links
Interpretation: wir verschieben
lokale Koordinatensysteme; bzw.
wir lesen das OpenGL
Programm von oben nach unten.
Alle Transformationen beziehen
sich dabei auf das jeweilige
lokale Koordinatensystem (LKS)
Anfangs ist das Koordinatensystem mit dem
Weltkoordinatensystem identisch.
Dann wird M4 auf das LKS angewandt.
Dann M3 bzgl. dem LKS etc.
S. Müller - 24 -
lw pp 12 MMEE
lw pp EEEM4
lw pp EEEE
lw pp
1MEEE
lw pp EEEE
lw pp
EEMM 34
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Bsp. 13: Geometrische Interpretation
Als Beispiel verwenden
folgenden Szenengraphen.
S. Müller - 25 -
Rechtes
Vorderrad
Karosserie
Lokale Geometrie
2pbapw
TRT
a
T
b
T
R
Auto
2p
y
x
z
y
x
z
y
x
z
2C
1C
W
ba
R
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Weltkoordinaten
S. Müller - 26 -
y
z
z
W
2pbpw
TEE
y
x
z
x
b
y
zW
x
y
x
z
R
a
2pbpw
TRE
y
zW
x
y
x
z
2pbapw
TRT
Das Objekt startet im
Weltkoordinatensystem. Zuerst
wird die Translation in Richtung
b in Weltkoordinaten
durchgeführt .
Es folgt die Rotation um den
Ursprung des Weltkoordinaten-
systems,
Als letztes folgt die Translation
in Richtung a in Weltkoordi-
naten. Damit ist das Objekt in
seiner Zielposition.
Interpretationsrichtung
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Lokale Koordinatensysteme
S. Müller - 27 -
y
x
z
a
Interpretationsrichtung
y
zW
x
R
z
y
x
bz
y
x
z
y
x
2pbapw
TRT 2papw
ERT 2papw
EET
Als letztes folgt die Translation
in Richtung b in Bezug zum
letzten LKS. Damit ist das LKS
– und damit auch das Objekt –
in seiner Zielposition.
Es folgt die Rotation um den
Ursprung des LKS,
Anfangs ist das LKS mit dem
Weltkoordinatensystem
identisch. Zuerst wird es in
Richtung a – in Bezug zum
letzten LKS – verschoben.
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 28 -
Idee des Szenengraphen
… aus Transformationssicht
Jeder Teilbaum kann in seinem eigenen, lokalen
Koordinatensystem verstanden werden
Die Traversierung der Hierarchie akkumuliert die Matrizen der
gesamten Welt und positioniert die „lokalen“
Koordinatensysteme an die richtige Stelle
• Die Autofähre fährt über dem Fluß, darauf fährt ein Auto,
das wiederum aus Karosserie und Rädern besteht
Wichtig ist dabei, dass der Zustand (hier die
Transformationen) gemerkt werden, damit sie nach Verlassen
des Teilbaums restauriert werden können
Szenengraph: Sinnvolle Darstellung für Statemachine
Problem: was gibt es für Knoten und was steht da drin…
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 29 -
Beispiel: minimaler Szenengraph
Ein minimaler Szenengraph besteht aus 3
Knotentypen:
Gruppen,
Transformationen
Geometrien (inkl. Materialien und Texturparameter).
Sie haben eine gemeinsame Vaterklasse und eine
render()-methode.
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 30 -
Minimaler Szenengraph
Gruppe :
für alle Kinder
• render()
Transformation:
glPushMatrix()
glMultMatrix()
für alle Kinder
• render()
glPopMatrix()
Geometrie:
glMaterial*()
glBegin()
...
glEnd()
Oberarm
Unterarm
Rechter Arm
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 31 -
Der langsamste Renderer der Welt…
Szenengraphen sind auch
wichtig für effizientes
Rendern komplexer Szenen
Ziel: Arbeit vermeiden
Nur das darstellen, was
gebraucht wird
Nur die Kommandos
ausführen, die notwendig
sind
State-Changes minimieren
{
Definiere Lichtquellen();
gluPerspective( angle, aspect, near, far);
gluLookAt( from, at, up);
glClear( BackgroundColour);
for each object i
{
Definiere Materialeigenschaften (i);
Definiere Textureigenschaften (i);
glPushMatrix();
MultMatrix( object(i).matrix));
bgnpolygon();
for each vertex j
{
n3f( object(i).normale(j));
t2f( object(i).texturkoord(j));
v3f( object(i).vertex(j));
}
endpolygon();
glPopMatrix();
}
swapbuffers();
}
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 32 -
Bounding Volume Hierarchie
Für jeden Gruppenknoten
wird auch ein Bounding
Volume berechnet und
abspeichert
Häufig verwendete
Möglichkeit:
Axis-Aligned Bounding Box
Suche von allen Blättern
• xmin, xmax
• ymin, ymax
• zmin, zmax
Durch diese Werte ist die
Bounding Box definiert
2 3
4
1
5 6
7 8
9
City
Church House
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 33 -
View Frustum Culling
Test des View Frustums (Blickpyramide) gegen das jeweilige Bounding
Volume. Wenn BV außerhalb des Frustums liegt, braucht der darunter
liegende Graph für das Rendering nicht weiter berücksichtigt werden.
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 34 -
Bounding Volumes
In Weltkoordinaten oder in
Modellkoordinaten?
Sinnvoller: Weltkoordinaten,
da die BVs dann direkt für
Culling verwendet werden
können
Wie berechnet man die BVs ?
Push-Pull
Traversierung nach unten
akkumuliert die
Transformationen
Traversierung nach oben
läßt xmin, xmax etc. in
Weltkoordinaten bestimmen.
Oberarm
Unterarm
Rechter Arm
1M
2M
3M
321 MMM
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 35 -
Räumliche Aufteilung
2 3
4
1
5 6
7 8
9
Scene
City
OfficeChurch House
House
FactoryTree Tree
Tree
Tree Tree
Tree
1 Tile 2 Tile 3 Tile 4 Tile 5 Tile 6 Tile 7 Tile 8 Tile 9 Tile
City
Trees Pine Buildings
SCS SCS
OfficeChurch
HouseHouse
Factory
Tree
Wichtig ist, daß die
Hierarchie der Szene eine
räumliche Aufteilung aufweist
Schlechte Aufteilung
Gute Aufteilung
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 36 -
Räumliche Aufteilung
Leider sieht die Realität anders aus
Manche CAD-Systeme motivieren durch ihre Struktur
(Layer in AutoCAD) Objekte mit gleichen Materialien in
einem Knoten zusammenzufassen (z.B. alle
Türklinken)
Man hat 2 Möglichkeiten
Szeneneditor und manuelle Nachbereitung der Hierarchie
Bestehende Hierarchie ignorieren und eigene aufbauen
Was passiert, wenn sich Objekte bewegen ?
Man muss alle darüber liegenden BV aktualisieren
Dynamische Objekte von statischen Objekten im Baum
trennen (dynamische Objekte direkt unter die Wurzel)
U N I V E R S I T Ä T
KOBLENZ · LANDAU
VFC: Vorgehen
Beginne mit der Wurzel
Liegt die BoundBox …
außerhalb des Frustums,
dann kann man aufhören
und nichts zeichnen
innerhalb oder teilweise
innerhalb, wird rekursiv
mit den Kindern
weitergetestet.
Ist ein Knoten ein Blatt
(Geometrieknoten),
dann werden alle
Polygone gezeichnet.
Typisch: die Polygone
werden erst gepuffert
und sortiert („draw-tree“)
Transparente Objekte am
Ende zeichnen
State-Wechsel
Minimierung (Shader,
Texturen, Materialien
möglichst wenig
wechseln)
S. Müller - 37 -
City
OfficeChurch House
House
FactoryTree Tree
Tree
Tree Tree
Tree
1 Tile 2 Tile 3 Tile 4 Tile 5 Tile 6 Tile 7 Tile 8 Tile 9 Tile
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Wie berechnet man das?
Bestimme View Frustum in
Weltkoordinaten
Teste für jede Ebene des
Frustums alle 8 Ecken der
BBox
Bestimme die Normale auf
die Ebene
Bestimme einen Vektor von
einem Punkt der Ebene zu
jeder Ecke der Box
Das Vorzeichen des
Skalarprodukts zeigt den
vorderen oder hinteren
Halbraum an
Alle Punkte außerhalb:
aufhören (Box liegt
außerhalb)
Ansonsten ist die Box am
Ende teilweise oder ganz im
Frustum
S. Müller - 38 -
pu
A
near
far
C
n
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 39 -
Szenengraph Systeme
Es gibt eine Reihe von relevanten Systemen
Open Inventor
Performer
OpenSG
Java3D
X3D
Game-Engines…
Die ersten 3 basieren auf OpenGL
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 40 -
Open Inventor
Open Source
Entwickelt von SGI (Silicon Graphics)
Linux/IRIX Version unter www.sgi.com
Windows Portierung unter www.coin3d.org oder
http://www.studierstube.org/openinventor/
Objektorientiert in C++
Buch „Open Inventor Mentor“
Bietet nicht nur den Renderer, sondern auch
Interaktionen und Manipulationen
State-Handling wird durch die Modellierung bzw.
Definition des Baumes festgelegt
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 41 -
Open Inventor
root
redPlastic sphere1 1 TF white sphere2 2 TF sphere3
oxygen hydrogen1 hydrogen2
Water
Graph wird abgearbeitet:
depth first, left before right, Vererbung nach rechts
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 42 -
Molecule.c++
// Construct all parts
SoGroup *waterMolecule = new SoGroup; // water molecule
SoGroup *oxygen = new SoGroup; // oxygen atom
SoMaterial *redPlastic = new SoMaterial;
SoSphere *sphere1 = new SoSphere;
SoGroup *hydrogen1 = new SoGroup; // hydrogen atoms
SoGroup *hydrogen2 = new SoGroup;
SoTransform *hydrogenXform1 = new SoTransform;
SoTransform *hydrogenXform2 = new SoTransform;
SoMaterial *whitePlastic = new SoMaterial;
SoSphere *sphere2 = new SoSphere;
SoSphere *sphere3 = new SoSphere;
// Set all field values for the oxygen atom
redPlastic->ambientColor.setValue(1.0, 0.0, 0.0);
redPlastic->diffuseColor.setValue(1.0, 0.0, 0.0);
redPlastic->specularColor.setValue(0.5, 0.5, 0.5);
redPlastic->shininess = 0.5;
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 43 -
Molecule.c++ (cont.) // Set all field values for the hydrogen atoms
hydrogenXform1->scaleFactor.setValue(0.75, 0.75, 0.75);
hydrogenXform1->translation.setValue(0.0, -1.2, 0.0);
hydrogenXform2->translation.setValue(1.1852, 1.3877, 0.0);
whitePlastic->ambientColor.setValue(1.0, 1.0, 1.0);
whitePlastic->diffuseColor.setValue(1.0, 1.0, 1.0);
whitePlastic->specularColor.setValue(0.5, 0.5, 0.5);
whitePlastic->shininess = 0.5;
// Create a hierarchy
waterMolecule->addChild(oxygen);
waterMolecule->addChild(hydrogen1);
waterMolecule->addChild(hydrogen2);
oxygen->addChild(redPlastic);
oxygen->addChild(sphere1);
hydrogen1->addChild(hydrogenXform1);
hydrogen1->addChild(whitePlastic);
hydrogen1->addChild(sphere2);
hydrogen2->addChild(hydrogenXform2);
hydrogen2->addChild(sphere3);
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 44 -
Separators
xf4
root
xf3
root
calf
body head
xf1 silver cylinder lLeg rLeg xf2 gold sphere
leftXform rtXform leg
thigh foot
Push/Pop vom Traversal
State.
DAG: Directed Acyclic Graph
Mehrfach Referenzen
Identifikation von Objekten
nur durch Pfad im Baum
(Problem: Löschen)
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 45 -
Objekte
Kegel
Würfel
Zylinder
NURBS Curve
NURBS Surface
Kugel
Text 2D
Text 3D
Polygonzüge
…
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 46 -
Aktionen
Rendering
Caching
Transparency
Ray Pick
Für einen übergebenen
Strahl
BV-Hierarchie wird
ausgenutzt
Gibt gewünschten Wert
zurück (z. B. Geometrie,
Matrix, Shape Node,
Pfad)
Matrix
Akkumuliert Matrizen
Painter
Erzeugt Ausgabe File
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 47 -
Manipulatoren
Haben eigenes User-Interface
Beispiele:
Handle Box
Virtual Trackball
Farbeditor
Materialeditor
carGroup mouse) (middle yourManip
sphere
xform
set face
mouse) (lefthandleBox
mtl cubexform
mtl
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 48 -
Beispiele
SoXtMaterialEditor *myEditor = new SoXtMaterialEditor;
myManip = new SoTrackballManip;
Time-Sensor
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 49 -
Fazit
Inventor ist der langsamste der Szenengraphen
Der Grund ist, dass der Baum auch in der
vorgegebenen Reihenfolge gerendert werden muss
Es ist auch vielmehr ein Application Framework, als
ein Renderer
Vorteil: es bietet viele Interaktions- und
Manipulationsfunktionen
VRML 1.0 basierte auf dem Inventor Fileformat
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 50 -
Performer
Auch von SGI entwickelt
Wird inzwischen ebenfalls Cross-Platform angeboten
Kostet allerdings Geld
Kostenlose Demo-Version bei SGI
Hauptsächlich gedacht für Visualisierungs- und
Simulationsanwendungen (VisSim)
Sehr schnelles und performantes System (entwickelt
u.a. als Basis für Flugsimulatoren)
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 51 -
Besonderheiten
Vererbung von Attributen
Automatische BV-Hierarchie
SCS (static coordinate system)
DCS (dynamic coordinate system)
Oberglied
Unterglied
Mittelglied
Finger
DCS
DCS
DCS
DCS
Hand
City
Trees Pine Buildings
SCS SCS
OfficeChurch
HouseHouse
Factory
Tree
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 52 -
Besondere Knoten
Level of Detail (LOD)
Billboard
Stress
LOD
1 LOD
2
LOD
n
LOD
3 Eyepoint
Switch Range Blend Zone
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 53 -
Besondere Knoten
Atmosphärische Effekte
Realtime Shadows
Layered Fog
Verschiedene File-Loader
GeoState
Geometrie und Material in
einem Knoten
Statistics
Unterteilung in
Application
Culling
Drawing
(Mehrprozessor-
Unterstützung)
Programmausschnitt
pfGroup *spatial_terrain_block = pfNewGroup();
pfSCS *house_offset = pfNewSCS();
pfSCS *terrain_block_offset = pfNewSCS();
pfDCS *car_position = pfNewDCS();
pfDCS *tank_position = pfNewDCS();
pfDCS *heli_position = pfNewDCS();
pfSwitch *current_vehicle_type;
pfGeode *heli, *car, *tank;
pfAddChild(scene, spatial_terrain_block);
pfAddChild(spatial_terrain_block, terrain_block_offset);
pfAddChild(spatial_terrain_block, house_offset);
pfAddChild(spatial_terrain_block, current_vehicle_type);
pfAddChild(current_vehicle_type, car_position);
pfAddChild(current_vehicle_type, tank_position);
pfAddChild(current_vehicle_type, heli_position);
pfAddChild(car_position, car); pfAddChild(tank_position, tank);
pfAddChild(heli_position, heli); }
U N I V E R S I T Ä T
KOBLENZ · LANDAU S. Müller - 54 -
Pf: Knoten Node Type Node Class Description
pfNode Abstract Basic node type.
pfGroup Branch Groups zero or more children..
pfScene Root Parent of the visual database.
pfSCS Branch Static coordinate system.
pfDCS Branch Dynamic coordinate system.
pfFCS Branch Flux coordinate system.
pfDoubleSCS Branch Double-precision static coordinate system.
pfDoubleDCS Branch Double-precision dynamic coordinate system.
pfDoubleFCS Branch Double-precision flux coordinate system.
pfSwitch Branch Selects among multiple children.
pfSequence Branch Sequences through its children.
pfLOD Branch Level-of-detail node.
pfLayer Branch Renders coplanar geometry.
pfLightSource Leaf Contains specifications for a light source.
pfGeode Leaf Contains geometric specifications.
pfBillboard Leaf Rotates geometry to face the eyepoint.
pfPartition Branch Partitions geometry for efficient intersections.
pfText Leaf Renders 2D and 3D text.
pfASD Leaf Controls transition between LOD levels.
U N I V E R S I T Ä T
KOBLENZ · LANDAU
OpenSG
Multi-Referrenzen
Multi-Threading
Beispiel: Clustered
Stereo Application
Anwendung läuft auf
Client
Pro Server Kopie des
Graphen
Client sendet
Modifikationen an Server
Server rendern
ausschließlich
S. Müller - 55 -
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Node-Core Konzept
S. Müller - 56 -
Node
Core
Cores:
Transform
Geometry
Switch
Material
...
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Kamera im Auto
S. Müller - 57 -
root
group
rest of
the
world
car
transform
car
geometry wheel
rear
left transform
wheel
front
right transform
wheel
front
left transform
whell
rear
right transform
wheel
rear
left
wheel
front
right
wheel
front
left
whell
rear
right geometry
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Code-Beispiele
S. Müller - 58 -
// Sei root der Wurzelknoten GroupPtr group = Group::create(); NodePtr n = Node::create(); beginEditCP(n); n->setCore(group); endEditCP(n); beginEditCP(root); root->addChild(n); endEditCP(root);
U N I V E R S I T Ä T
KOBLENZ · LANDAU
Code-Beispiele
S. Müller - 59 -
Matrix m; m.setIdentity(); m.setTranslate(20,10,0); TransformPtr trans = Transform::create(); beginEditCP(trans, Transform::MatrixFieldMask); trans->setMatrix(m); endEditCP(trans, Transform::MatrixFieldMask); NodePtr n = Node::create(); beginEditCP(n, Node::CoreFieldMask); n->setCore(trans); endEditCP(n, NodeCoreFieldMask);
U N I V E R S I T Ä T
KOBLENZ · LANDAU
OpenSG weitere Hilfen
OpenSG Tutorial
http://www.uni-koblenz.de/~abert/Site/Publications.html
(unvollständige) Klassendokumentation
http://www.opensg.org/doc-1.6.0/index.html
S. Müller - 60 -