VIS- und Uni-Logo
Blindenversion home uni uni suche suche sitemap sitemap kontakt kontakt
unilogo Universität Stuttgart
Institut für Visualisierung und Interaktive Systeme

Raumvisualisierung mit Hilfe von BSP-Bäumen

englische VersionDruckversionBlindenversion
 

Aufgabenstellung   |   Pseudocode   |   DXF Leser   |   Kamera   |   Vektorgeometrie / Misc   |   Probleme

Probleme beim Softwareprojekt

Die Probleme fingen schon beim Einlesen der DXF-Datei an. Die Dokumentation von AutoCAD zu diesem Dateiformat (http://www.autodesk.com/techpubs/autocad/acad2000/dxf/index.htm) wurde mittlerweile von der Version v.u16.1.01 abgelöst. Die Version, auf die sich unser Programm ursprünglich bezog, war die Version v.u15.0.02. Da für unser Programm das Auslesen der 3DFaces und die Feststellung, ob es sich um ein Dreieck oder Viereck handelt, essentiell ist, ergaben sich hier Probleme. Unser Programm funktionierte auf einmal nicht mehr mit einer selbst erstellten DXF Datei, da die Abfrage, ob es sich um ein Dreieck oder Viereck handelt, von AutoCAD umgestellt wurde (die Punkte des 3DFace für diesen Vergleich wurden geändert, weswegen unsere Funktion daraufhin keine sinnvollen Werte mehr lieferte). Weiterhin sind im Vergleich zu OpenGL die y und z Achse vertauscht, was zu Darstellungsfehler führte.

Ferner gibt es unter C/C++ Probleme, falls man die Gleichheit zweier double bzw. float Zahlen feststellen will. Hier muss mit einer Epsilon-Umgebung gearbeitet werden, da die Überprüfung auf 0 oft Fehler liefert.

Ein weiteres Problem ergab sich auch aus der ursprünglichen Aufgabenstellung. Es sollte eigentlich ein BSP-Tree erstellt werden, der dann zur Portalberechnung der 3D-Welt benutzt werden sollte [1]. Das Problem hierbei ergab sich aus der Komplexität der Aufgabe (einzige von uns gefundene Beschreibung des Portalalgorithmus im Quellcode von Quake 3 bzw. Pseudocode in Seth Tellers Dissertation über dieses Thema) und aus den DXF-Daten, die uns Vorlagen. Eine Portalberechnung macht nur Sinn, wenn man sich in geschlossenen Räumen (in der 3D-Welt) befindet - eigentlich eine treffende Annahme bei der Visualisierung eines Gebäudes. Allerdings enthielt unsere DXF-Datei nur den groben Grundriss mit einzelnen Pfosten, weswegen dieser Algorithmus keinen Sinn gemacht hätte.

Somit wurde nur der BSP-Algorithmus genau implementiert, und ein einfaches Clipping mit Hilfe der von OpenGL gelieferten MODELVIEW und PROJECTION Matrix realisiert. Die Technik, die hier zum Einsatz kam, nennt sich Frustum Culling [2]. Leider sind die meisten Implementationen fehlerhaft, da sie nicht berücksichtigen, wenn alle Punkte eines Dreieck ausserhalb des Frustums liegen, das Dreieck immer noch sichtbar sein kann. Ein Ansatz mit Hilfe einer Bounding-Box lieferte hier leider auch nicht die entsprechenden Ergebnisse.

Eine eigene Kameraklasse dient zur Übersichtlichkeit, wird aber eigentlich nicht benötigt.

Durch die (für uns im Endeffekt) zu offene Problemstellung, gab es einige weitere Probleme beim Clipping. Hier gibt es einige interessante Ansätze, die in der Literatur allerdings nur sehr vereinzelt angesprochen werden, aber sehr effizient sind (Plücker-Koordinaten [3], Fast BackfaceCulling mit Hilfe von vorberechneten Vektoren [4]). Es wurde zwar versucht, diese Clipping-Algorithmen zu implementieren, allerdings scheiterte dieser Versuch wegen mangelnder Quellen und schwer zugänglichem Material(Die meisten Quellen sind Eigentum amerikanischer Universitäten, die sich ihre Arbeit bezahlen lassen wollen).


Das Problem bei einem zusätzlichen Backface-Culling ist folgendes: Da wir bei der Kamera in OpenGL mit einem Sichtkegel arbeiten, funktioniert der einfache Ansatz mit Sichtvektor * Normalenvektor des 3dface nicht, da dies nur für parallelgleiche Sichtvektoren möglich ist. Wenn dieses Problem umgangen wird, finden sich hier in der Literatur weitere Optimierungsmöglichkeiten, wie z.B. das Backface-Culling mit Hilfe von vorberechneten "Sektoren".

Quellenangaben:
[1] Seth Teller Publikationen (http://graphics.lcs.mit.edu/~seth/)
[2] Frustum Culling in OpenGL (http://www.markmorley.com/opengl/frustumculling.html)
[3] Introduction To Plücker Coordinates (http://www.flipcode.com/tutorials/tut_pluecker.shtml)
[4] Fast backface culling with normal masks (http://www.cs.unc.edu/~zhangh/backface.html)