Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Einführung in blaxxun Contact 4.2

Ähnliche Präsentationen


Präsentation zum Thema: "Einführung in blaxxun Contact 4.2"—  Präsentation transkript:

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

2 Inhalt des Vortrags Einführung in blaxxun Contact 4.2 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

3 Einführung in blaxxun Contact 4.2
1/20 Einführung in blaxxun Contact 4.2 Was ist blaxxun Blaxxun ist ein VRML- Viewer mit Quellcode und folgt dem Web3D/VRML 97- Standard, der auch VRML 2.0 beinhaltet. 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

4 Einführung in blaxxun Contact 4.2
2/20 1 Einführung in blaxxun Contact 4.2 Installation/ Umfang 1/3 1 Installation und Umfang 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.

5 Einführung in blaxxun Contact 4.2
3/20 2 Einführung in blaxxun Contact 4.2 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.

6 Einführung in blaxxun Contact 4.2
4/20 3 Einführung in blaxxun Contact 4.2 Installation/ Umfang 3/3 3 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.

7 Einführung in blaxxun Contact 4.2
5/20 Einführung in blaxxun Contact 4.2 Vorstellung der Komponenten Komponenten 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

8 Einführung in blaxxun Contact 4.2
6/20 Einführung in blaxxun Contact 4.2 1 Designkonzepte – Rendering 1/2 1 Rendering 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( ... );

9 Einführung in blaxxun Contact 4.2
7/20 Einführung in blaxxun Contact 4.2 2 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.

10 Einführung in blaxxun Contact 4.2
8/20 Einführung in blaxxun Contact 4.2 Designkonzepte - Szenengraph 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. Abb.: Bsp. Für einen Szenengraph Eine Besonderheit stellen Proto- Knoten dar. Sie sind im VRML- Standard enthalten und ermöglichen die Wiederverwendung von Codefragmenten.

11 Einführung in blaxxun Contact 4.2
9/20 Einführung in blaxxun Contact 4.2 Designkonzepte – Event Model 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.

12 Einführung in blaxxun Contact 4.2
10/20 Einführung in blaxxun Contact 4.2 Designkonzepte – Scripting 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 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.

13 Einführung in blaxxun Contact 4.2
11/20 Einführung in blaxxun Contact 4.2 1 Designkonzepte – Traversal 1/3 1 Traversal 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

14 Einführung in blaxxun Contact 4.2
12/20 Einführung in blaxxun Contact 4.2 2 Designkonzepte – Traversal 2/3 2 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. Abb.: Pfad zu einem Szenenknoten GBBoxTraversal – Berechnet die Bounding Box eines Szenenbaumes.

15 Einführung in blaxxun Contact 4.2
13/20 Einführung in blaxxun Contact 4.2 3 Designkonzepte – Traversal 3/3 3 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 GBuildShellTraversal – Knoten mit grafischer Repräsentation, die von einem GvShell bzw. GvNodeShell- Objekt abgeleitet sind, müssen diese Methode 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“

16 Einführung in blaxxun Contact 4.2
14/20 Einführung in blaxxun Contact 4.2 Designkonzepte – Viewer 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.

17 Einführung in blaxxun Contact 4.2
15/20 1 Einführung in blaxxun Contact 4.2 Einige wichtige Klassen 1/2- GvNode 1 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

18 Einführung in blaxxun Contact 4.2
16/20 2 Einführung in blaxxun Contact 4.2 Einige wichtige Klassen 2/2 - GShell 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);

19 Einführung in blaxxun Contact 4.2
17/20 1 Einführung in blaxxun Contact 4.2 1 Implementation eines neuen Knotens 1/3 Implementation eines neuen Knotens 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). int GvCube::BuildShell(GTraversal &state) { SetShell(NewBox(-width*0.5,-height*0.5,-depth*0.5, width,height,depth, GshellI *cube)); return(1); }

20 Einführung in blaxxun Contact 4.2
18/20 2 Einführung in blaxxun Contact 4.2 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); }

21 Einführung in blaxxun Contact 4.2
19/20 3 Einführung in blaxxun Contact 4.2 3 Implementation eines neuen Knotens 3/3 Außerdem muss blaxxun der Knoten bekannt gemacht werden, was über verschiedene Makros geschieht. Im Header: GV_NODE_HEADER(GvTestNodeStK); 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);

22 vielen Dank für die Aufmerksamkeit...
20/20 Einführung in blaxxun Contact 4.2 Fazit FAZIT und vielen Dank für die Aufmerksamkeit...

23 blaxxun


Herunterladen ppt "Einführung in blaxxun Contact 4.2"

Ähnliche Präsentationen


Google-Anzeigen