einführung in blaxxun contact 4.2 stephan kußmaul, mai 2002

23
Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Upload: englebert-nenninger

Post on 05-Apr-2015

104 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2

Stephan Kußmaul, Mai 2002

Page 2: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Inhalt des Vortrags

• Was ist blaxxun?• Installation/ Umfang • Vorstellung der Komponenten• Designkonzepte

• Rendering• Szenengraph• Event Model• Scripting• Traversal- Aktionen• Viewer

• Einige wichtige Klassen• Implementation eines neuen Knotens• Fazit

Einführung in blaxxun Contact 4.2

Page 3: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2

•Blaxxun ist ein VRML- Viewer mit Quellcode und folgt dem Web3D/VRML 97- Standard, der auch VRML 2.0 beinhaltet.

Was ist blaxxun

•Es handelt sich hierbei um eine Community Source Lizenz. Im Gegensatz zu einer Open Source Lizenz ist der Code somit nicht für die kommerzielle Benutzung frei gegeben. Die Rechte an Codeänderungen bleiben bei dem jeweiligen Autoren. Änderungen am Quellcode können auch unabhängig vom Consortium veröffentlicht werden, in diesem Fall ist allerdings auf eine offizielle Veröffentlichung zu verlinken, die Lizenzvereinbarungen sind einzuhalten.

•Dabei ähnelt Blaxxun von der Architektur der OpenGL- Klassenbibliothek Open Inventor.

•Blaxxun unterstützt sowohl DirectX als auch OpenGL. Für eine mögliche Anwendung an der TUI ist zunächst nur OpenGL von Interesse

1/20

Page 4: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Installation/ Umfang 1/3

Das Blaxxun- Paket besteht aus folgenden drei Dateien

•cc3d_src.zip Quellcode

•cc3d_lib.zip externe Header und Libraries; ( v.a. DirectX SDK 5 )

•cc3d_doc.zip Dokumentation.

Installation und Umfang

1

1

2/20

Page 5: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Installation/ Umfang 2/3

Dokumentation

In der Datei contact3d_class_overview.doc findet man eine kurze Einführung in Blaxxun.

Außerdem existiert eine html- Beschreibung der API. Sehr hilfreich sind dabei die Klassen- und Methodenübersichten. Leider halten sich die Dokumentationen mit der Beschreibung der grundlegenden Funktionen und mit Beispielen doch etwas zurück, man kommt nicht umhin sich in den komplexen Quellcode einzuarbeiten.

2

2

3/20

Page 6: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Quellcode

Der Quellcode besteht zunächst aus der Core Library, die Rendering- Aufgaben, Medien- und Szenengraph- Unterstützung gewährleistet. Auf diesem Kern setzen verschiedenen Front- Ends auf.

•Zum Einen blaxxuncc3d.ocx eine MFC basierte Active X Control, die als Plugin für Active X Applikationen wie den Internet Explorer genutzt werden kann.

•Es wird ebenfalls ein Netscape- Plugin bereitgestellt, das über eine Wrapper- Klasse zu blaxxuncc3d.ocx realisiert wurde. ( unter cc3d_src\client\cc3d\plugin\ )

•Zum Anderen GLView.exe, einer ebenfalls MFC- basierten standalone Applikation, die neben einigen Editiermöglichkeiten auch einen Tree Viewer für den Szenengraphen mitbringt.

•Außerdem sei noch cc3dglut erwähnt, eine kleine Applikation für Linux, die die Mesa 3.1 und die GLUT Library benutzt.

Einführung in blaxxun Contact 4.2 Installation/ Umfang 3/3

3

3

4/20

Page 7: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

•CORE - Utility classes, Rendering, Polyhedron handling

•VRML - VRML 1.0 / 2.0 scene graph

•Media - Image - image library, libpng, libjpeg, zlib, tga, rgb, gif,

•Media - Movie - Amimated gif , Direct X Media, Real Player G2

•Media - Sound / WAV Intel RSX / Microsoft Direct Sound

•Scripting - JavaScript / COM-EAI interfaces

•Interaktion - Navigation / Collisiondetection / Viewer control

•Front- End - Highlevel clients standalone / OCX Control / Netscape plugin

Einführung in blaxxun Contact 4.2 Vorstellung der Komponenten

Komponenten

5/20

Page 8: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Das Rendering wurde abstrahiert, indem alle OpenGL- States in der Klasse RenderState gekapselt wurden.

Das stellt auch sicher, dass ein State nur dann geändert wird, wenn es wirklich notwendig ist und kommt somit der Performance zugute.

renderState.SetLightModel(GL_SMOOTH);

Natürlich könnte man auch direkte OpenGL- Aufrufe tätigen, was aber nur wenn nicht anders möglich ratsam ist. So kapselt RenderState z.B. auch Methoden zum Zeichnen von Polygonen oder einer Kugel mittels:

renderState. DrawPolygon3D ( ... ); // oder

renderState. RenderSphere( ... );

Einführung in blaxxun Contact 4.2 Designkonzepte – Rendering 1/2

Rendering

1

1

6/20

Page 9: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte – Rendering 2/2

Das Rendern von Primitiven wurde in der Klasse GShell und den davon abgeleiteten Klassen gekapselt. GShell unterstützt unter anderem das Rendern, Auswählen, Normalenberechnung, Triangulierung und Kollisionserkennung.

GvNodeShell ist ein Knoten, der ein GShell- Objekt enthält und kann zur Erstellung eigener grafischer Knoten abgeleitet werden.

VRML Geometrie- Knoten werden nie direkt gerendert, da hierbei viele Optionen und Fehlerquellen ( Normalengenerierung, falsche Index- Werte etc) existieren. Deswegen bestehen die Knoten intern aus GShell- Objekten.

2

2

7/20

Page 10: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte - Szenengraph

Der Szenengraph basiert auf Klassen von Knoten, die jeweils über eine Liste von Feldern verfügen. Sowohl GvNode als auch GvField unterstützen Klassen- Meta Informationen um dynamischen Zugriff auf den Szenengraphen und ein Interface für Scripting/EAI zu gewährleisten.

Das zugrundeliegende Model ist Open Inventor von SGI nachempfunden, das auch den QvLib VRML 1.0 parser zur Verfügung stellt, der als Ausgangspunkt für GLView benutzt wurde.

Eine Besonderheit stellen Proto- Knoten dar. Sie sind im VRML- Standard enthalten und ermöglichen die Wiederverwendung von Codefragmenten.

Abb.: Bsp. Für einen Szenengraph

Szenengraph

8/20

Page 11: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte – Event Model

Das Event Model trägt dafür Sorge, dass alle Knoten die mit einem sich verändernden Feld via Routing verbunden sind, sofort entsprechend upgedated werden. Dabei werden rückkoppelnde Routen mittels eines Flags in GvField verhindert.

Ändert sich ein Knoten so wird der Besitzer- Knoten des Feldes mittels der Methode GvNode::OnFieldChanged benachrichtigt. Außerdem werden auch die Elternknoten mittels GvNode::OnChildNodeChanged über Veränderungen benachrichtigt, wenn ein Knoten über ein SFNode- Feld referenziert wird.

Implementiert wurde das Routing mit verlinkten Listen aus der GvConnection- Klasse. Eine GvConnection enthält jeweils einen Zeiger auf die nächste Connection, sowie eine virtuelle Funktion OnTrigger. Diese muss für die abgeleiteten Klassen implementiert werden, und wird aufgerufen, wenn eine Veränderung eintritt.

Event Model

9/20

Page 12: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte – Scripting

Manche komplexe Aktionen können nicht nur mit Sensoren realisiert werden. Deswegen gibt es Script- Knoten, die VRML flexibler machen. Ein Beispiel wäre die Bewegung eines Objektes anhand einer Funktion festzulegen, um etwa Gravitation zu simulieren.

Die Script- Sprache VrmlScript ähnelt JavaScript und basiert auf dem Parser von SGI nach der unter http://vrml.sgi.com/moving-worlds/spec/vrmlscript.html beschriebenen Referenz.

Ein Script wird ausgeführt, sobald der Script- Knoten eine eventIn- Nachricht erhält. Eine eventOut- Nachricht einer Script- Funktion wird sofort und nicht erst am Ende des Scripts gesendet.

Scripting

10/20

Page 13: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte – Traversal 1/3

Beim Durchlaufen eines Szenenbaums der aus einzelnen Knoten besteht, werden jeweils verschiedene Methoden aufgerufen, für verschiedene Aktionen. Diese Aktionen sind in GNode als virtuelle Member- Funktionen definiert und müssen bei Bedarf überschrieben werden.

Alle Traversal- Aktionen sind von GTraversal abgeleitet und werden in der Member- Funktion Do(GTraversal &state) aufgerufen

Traversal

1

1

11/20

Page 14: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

GBBoxTraversal – Berechnet die Bounding Box eines Szenenbaumes.

GPathTraversal – Hier sind alle Aktionen zu implementieren, die einen Pfad benötigen. Der gebräuchlichste Anwendungsfall ist eine RayPickAction d.h. ein Szenenobjekt wird vom User angeklickt.

Einführung in blaxxun Contact 4.2 Designkonzepte – Traversal 2/3

Abb.: Pfad zu einem Szenenknoten

2

2

12/20

Page 15: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte – Traversal 3/3

GBuildShellTraversal – Knoten mit grafischer Repräsentation, die von einem GvShell bzw. GvNodeShell- Objekt abgeleitet sind, müssen diese Methode implementieren

GRenderTraversal bzw. GglRenderTraversal – Verfügt der Knoten über eine geometrische Repräsentation mit eigenen Render- Aufrufen, die bestimmte Attribute wie z.B. die Farbe benötigen, so ist die Methode GRenderTraversal zu implementieren

GFindNodeTraversal – Findet einen bestimmten Knoten in einem Baum. Überschreibt man die Methode entsprechend, so kann man bspw. nach eine Knoten mit bestimmtem Namen suchen: GvNode.objName == “myBox“, oder auch nach einem bestimmten Typ von Knoten: GvNode.ClassName() == “GvShape“

3

313/20

Page 16: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Designkonzepte – Viewer

GView ist die View- Klasse, die die Szeneninformationen enthält. Die standalone Applikation folgt der MFC- typischen Dokumenten- Ansicht- Architektur, mit CmyglView als View- Klasse, die wiederum ein GView- Objekt enthält.

Einige wichtige Member der GView- Klasse:

GvSceneInfo *sceneInfo; // Szeneninformationen

GShell *theShell; // DER Szenenshell

RenderState renderState;

GvNodeHandle theScene; // Die Szene

// aber z.B. auch Funktion zum Einlesen von Dateien

int ReadModel(const char *FileName);

Außerdem beinhaltet GView viele weitere Funktionen für den Umgang mit dem top- level Szenengraphen, für das Event Triggering, die Kollisionserkennung und die Mausauswahl.

Viewer

14/20

Page 17: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Einige wichtige Klassen 1/2- GvNode

GNode ist die Basisklasse für alle Objekte im Szenenbaum. Sie definiert eine Liste von virtuellen Funktionen, die bei Bedarf implementiert werden können.

Daraus geht wiederum die GvNode- Klasse hervor, die die Basisklasse für alle VRML 1.0 und 2.0 Knoten ist.

Wichtig für das Speichermanagement ist die Referenzierung der Knoten. Sinkt der Referenzzähler auf Null, so wird der Knoten nicht mehr gebraucht. Der Speicherplatz wird also freigegeben.

Abb.: Referenzierung von Knoten

GvNode

1

1

15/20

Page 18: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Einige wichtige Klassen 2/2 - GShell

Ein Shell- Objekt speichert eine Liste an Vertices mit Face- Informationen und optionalen zusätzlichen Attributen.

Ein Shell- Objekt wird mit den entsprechenden Objektdaten einer Geometrie gefüllt und verfügt über eigene Renderaufrufe.

Exemplarisch einige wichtige Member:

void SetV(int new_nv,const Point *new_v);

void SetVN(int n_vn,const Point *new_vn,int normalize=0);

int AppendTriangle(Point &p1,Point &p2, Point &p3,int doLookup=1);

int ComputeVertexNormals();

void RenderGlFaces(RenderState &state,int FN=1, int VN=0, int VC=0, int VP=0);

2

2

GShell

16/20

Page 19: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Implementation eines neuen Knotens 1/3

Als Erstes steht natürlich die Entscheidung von welchem Elternknoten bzw Elternklasse man den neuen Knoten ableitet.

• Das größte Maß an Flexibilität erhält man, wenn man direkt von GvNode ableitet. Dies ist auch der Knoten der Wahl, wenn man direkte OGL- Calls tätigen will. Zu implementieren sind dann bspw. int Do(GglRenderTraversal &state); und für’s Picking: int Do(GRaySelectTraversal &state);

•Braucht man einen Knoten mit grafischer Repräsentation, so kann man möglicherweise GvNodeShell benutzen. Ein solches Shell- Objekt ist eine Low- Level- Repräsentation eines grafischen Objektes. Zu implementieren ist int BuildShell( GTraversal &state).

intGvCube::BuildShell(GTraversal &state){ SetShell(NewBox(-width*0.5,-height*0.5,-depth*0.5,

width,height,depth, GshellI *cube));

return(1);}

Implementation eines neuen Knotens

1

117/20

Page 20: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Implementation eines neuen Knotens 2/3

GShellI * NewBox(float atx, float aty,float atz, float dx,float dy,float dz,GShellI *cube)

{ //… if (!cube)

cube = new GShellI;  // …  cube->SetV(8,_p); cube->SetVN(4*6,(Point *)NULL); cube->SetVP(4,params); cube->SetVertices(vi,v); cube->SetFN(6,(Point *)NULL); cube->SetFaceList(flistp-flist,flist);  delete flist;  return (cube);}

2

218/20

Page 21: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Außerdem muss blaxxun der Knoten bekannt gemacht werden, was über verschiedene Makros geschieht.

GV_NODE_HEADER(GvTestNodeStK);

Im Header:

Im Konstruktor:

GV_NODE_CONSTRUCTOR(GvTestNodeStK);

GV_NODE_ADD_FIELD(m_bSwitch);

GV_NODE_ADD_FIELD(appearance);

GV_NODE_ADD_FIELD(geometry);

Als letztes muss man den neuen Knoten nur noch in GvNode.cpp eintragen ( man beachte, dass an dieser Stelle das Gv fehlt ):

ADD_CLASS(TestNodeStK);

Einführung in blaxxun Contact 4.2 Implementation eines neuen Knotens 3/33

319/20

Page 22: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

Einführung in blaxxun Contact 4.2 Fazit

und

vielen Dank für die Aufmerksamkeit...

FAZIT

20/20

Page 23: Einführung in blaxxun Contact 4.2 Stephan Kußmaul, Mai 2002

blaxxun