Technische Universität Braunschweig. Direkte Volumenvisualisierung auf unstrukturierten Gittern mit OpenSG in AVS/Express.



Ähnliche Dokumente
Volumen Visualisierung

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineare Funktionen. 1 Proportionale Funktionen Definition Eigenschaften Steigungsdreieck 3

Primzahlen und RSA-Verschlüsselung

Konzepte der Informatik

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen

1 topologisches Sortieren

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Die Gleichung A x = a hat für A 0 die eindeutig bestimmte Lösung. Für A=0 und a 0 existiert keine Lösung.

Professionelle Seminare im Bereich MS-Office

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus: Übungsbuch für den Grundkurs mit Tipps und Lösungen: Analysis

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Lineare Gleichungssysteme

computer graphics & visualization

1. LINEARE FUNKTIONEN IN DER WIRTSCHAFT (KOSTEN, ERLÖS, GEWINN)

Güte von Tests. die Wahrscheinlichkeit für den Fehler 2. Art bei der Testentscheidung, nämlich. falsch ist. Darauf haben wir bereits im Kapitel über

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Wir unterscheiden folgende drei Schritte im Design paralleler Algorithmen:

Lineare Gleichungssysteme

Physik & Musik. Stimmgabeln. 1 Auftrag

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Eigenen Farbverlauf erstellen

6.2 Scan-Konvertierung (Scan Conversion)

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN

Zeichen bei Zahlen entschlüsseln

Aufgabe 1. Zunächst wird die allgemeine Tangentengleichung in Abhängigkeit von a aufgestellt:

Advanced Rendering Interior Szene

1. Sichtbarkeitsproblem beim Rendern einer dreidimensionalen Szene auf einer zweidimensionalen

Kapitalerhöhung - Verbuchung

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse Lösung 10 Punkte

4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.

Modellbildungssysteme: Pädagogische und didaktische Ziele

(C)opyright 2009 by Jochen Vajda

infach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock

Die Übereckperspektive mit zwei Fluchtpunkten

Kapiteltests zum Leitprogramm Binäre Suchbäume

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

4. BEZIEHUNGEN ZWISCHEN TABELLEN

10%, 7,57 kb 20%, 5,3 kb 30%, 4,33 kb 40%, 3,71 kb 50%, 3,34 kb. 60%, 2,97 kb 70%, 2,59 kb 80%, 2,15 kb 90%, 1,62 kb 99%, 1,09 kb

V 2 B, C, D Drinks. Möglicher Lösungsweg a) Gleichungssystem: 300x y = x + 500y = 597,5 2x3 Matrix: Energydrink 0,7 Mineralwasser 0,775,

11.3 Komplexe Potenzreihen und weitere komplexe Funktionen

Reporting Services und SharePoint 2010 Teil 1

Gruppenrichtlinien und Softwareverteilung

Binärdarstellung von Fliesskommazahlen

Herstellen von Symbolen mit Corel Draw ab Version 9

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Mathematik: Mag. Schmid Wolfgang Arbeitsblatt 3 1. Semester ARBEITSBLATT 3 RECHNEN MIT GANZEN ZAHLEN

Lineare Differentialgleichungen erster Ordnung erkennen

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Austausch- bzw. Übergangsprozesse und Gleichgewichtsverteilungen

Zahlen auf einen Blick

Approximation durch Taylorpolynome

Repetitionsaufgaben Wurzelgleichungen

Skript und Aufgabensammlung Terme und Gleichungen Mathefritz Verlag Jörg Christmann Nur zum Privaten Gebrauch! Alle Rechte vorbehalten!

Entladen und Aufladen eines Kondensators über einen ohmschen Widerstand

Excel Fortgeschrittene Techniken. Peter Wies. 1. Ausgabe, März 2013 EX2013F

Info zum Zusammenhang von Auflösung und Genauigkeit

Informationsblatt Induktionsbeweis

Wir arbeiten mit Zufallszahlen

3.2 Spiegelungen an zwei Spiegeln

Sie werden sehen, dass Sie für uns nur noch den direkten PDF-Export benötigen. Warum?

Paint.Net Der Paint.NET Bildschirm

Welche Unterschiede gibt es zwischen einem CAPAund einem Audiometrie- Test?

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten

Grundlagen der höheren Mathematik Einige Hinweise zum Lösen von Gleichungen

Korrigenda Handbuch der Bewertung

Berechnung der Erhöhung der Durchschnittsprämien

1. Software installieren 2. Software starten. Hilfe zum Arbeiten mit der DÖHNERT FOTOBUCH Software

Das große Buch Photoshop CS3 & Lightroom Stefan Gross Pavel Kaplun

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am

Bilder zum Upload verkleinern

3. Verpackungskünstler. Berechnungen am Quader, Umgang mit Termen, räumliche Vorstellung

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Beweisbar sichere Verschlüsselung

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

Motivation. Formale Grundlagen der Informatik 1 Kapitel 5 Kontextfreie Sprachen. Informales Beispiel. Informales Beispiel.

Plotten von Linien ( nach Jack Bresenham, 1962 )

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Grundlagen der Theoretischen Informatik, SoSe 2008

Tipp III: Leiten Sie eine immer direkt anwendbare Formel her zur Berechnung der sogenannten "bedingten Wahrscheinlichkeit".

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

Guide DynDNS und Portforwarding

Abituraufgabe zur Stochastik, Hessen 2009, Grundkurs (TR)

Professionelle Diagramme mit Excel 2010 erstellen. Peter Wies. 1. Ausgabe, 2. Aktualisierung, März Themen-Special W-EX2010DI

Bilder Schärfen und Rauschen entfernen

Raytracing. Schlussbericht. Jonas Lauener 1995, Áedán Christie 1997 Melvin Ott 1997, Timon Stampfli 1997

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Anleitung: Sammel-Rechnungen für Lizenzen bei Swiss Basketball

FastBill Automatic. Dokumentation Versand. FastBill GmbH. Holteyer Straße Essen Telefon Telefax

Kommunikations-Management

1 Mathematische Grundlagen

Pädagogik. Melanie Schewtschenko. Eingewöhnung und Übergang in die Kinderkrippe. Warum ist die Beteiligung der Eltern so wichtig?

Transkript:

Technische Universität Braunschweig Direkte Volumenvisualisierung auf unstrukturierten Gittern mit OpenSG in AVS/Express Masterarbeit vorgelegt von cand. inform. Hagen Gädke Institut für Computergrafik Prof. Dr. D. W. Fellner Betreuer: Christoph Fünfzig September 2004 1

2

Erklärung Ich versichere, die vorliegende Arbeit selbständig und nur unter Benutzung der angegebenen Quellen und Hilfsmittel angefertigt zu haben. Braunschweig, den 30.09.2004 3

Widmung und Dank Ich widme diese Arbeit meinen Eltern Jürgen Gädke und Edith Gädke-Döblitz und bedanke mich für die finanzielle Unterstützung meines Studiums. Vielen Dank an Alexander Böswetter, Torsten Bagdonat und Prof. Dr. rer. nat. Uwe Motschmann (Institut für Theoretische Physik, TU Braunschweig) für den Mars-Datensatz. Mein besonderer Dank geht an meinen Betreuer Christoph Fünfzig für seine Unterstützung, vor allem im Bereich OpenSG. 4

Abstract Several techniques for Direct Volume Rendering (DVR) have been proposed during the past 15 years. The fastest techniques allow realtime rendering of large datasets, but only for regular or rectilinear grids, respectively. In this work, two techniques for DVR on unstructured grids (Shirley-Tuchman and Hierarchical 3D-Textures) are implemented and examined for realtime rendering capabilities. The implementation uses the scene graph library OpenSG. In addition, the implemented functionality has been integrated into the commercial visualizing software AVS/Express. 5

Inhaltsverzeichnis 1 Einleitung 8 2 Gittertypen und Beleuchtungsmodelle 9 2.1 Reguläre Gitter 9 2.2 Rektilineare Gitter 9 2.3 Irreguläre Gitter 10 2.4 Unstrukturierte Gitter 10 2.5 Beleuchtungsmodelle 11 3 Techniken zur direkten Volumenvisualisierung 14 3.1 Raytracing 14 3.2 Splatting 15 3.3 Überblendung texturierter Ebenen 15 3.3.1 2D-Texturen 16 3.3.2 3D-Texturen 18 3.4 Shear-Warp-Faktorisierung 20 3.5 Shirley-Tuchman-Verfahren 21 3.6 Hierarchische Verfahren 22 4 Anforderungen und Ziele 23 5 Implementierung des Shirley-Tuchman-Verfahrens 25 5.1 Klassifizierung 25 5.2 Dickpunktbestimmung und Farbzuweisung 26 5.3 Alpha-Korrektur 29 5.4 Tetraeder-Sortierung 31 5.5 Ablaufdiagramm 32 5.6 Ergebnisse 34 5.7 Klassenbeschreibungen 38 5.7.1 ProjectedTetrahedraBase 38 5.7.2 ProjectedTetrahedra 40 5.7.3 Tetrahedron 41 5.7.4 NormalTetrahedron 41 5.7.5 ClassifiedTetrahedron 42 5.7.6 ColorManager 42 5.7.7 ParametricIntersections 42 6 Implementierung des hierarchischen 3D-Textur-Verfahrens 44 6.1 Aufbau und Implementierung des Octrees 44 6.2 Octree-Verfeinerung und -Vergröberung 45 6.2.1 Orakel 46 6.2.2 Octree-Verfeinerung 48 6.2.3 Octree-Vergröberung 48 6.3 Separating Axis Theorem für Quader / Tetraeder 48 6.4 Resampling auf ein reguläres Gitter 50 6.4.1 Intuitiver Algorithmus 50 6.4.2 3D-Rasterisierung 50 6

6.5 Alpha-Korrektur 53 6.5.1 Notwendigkeit der Alpha-Korrektur 53 6.5.2 Herleitung der Alpha-Korrektur-Formel 54 6.5.3 Numerische Probleme bei der Alpha-Korrektur 55 6.6 Octree-Anzeige 57 6.7 Artefakte 59 6.8 Ergebnisse 61 6.9 Klassenbeschreibungen 67 6.9.1 HierarchicalTextures3DBase 67 6.9.2 HierarchicalTextures3D 69 6.9.3 OctreeTGBase 69 6.9.4 OctreeTG 70 6.9.5 OctreeTGNodeBase 71 6.9.6 OctreeTGNode 72 6.9.7 PositionedSlicesBase 72 6.9.8 PositionedSlices 73 6.9.9 SystemInformation 73 7 Das AVS-Modul 74 7.1 Modul-Überblick 74 7.2 AVS-Modul-Schnittstelle 75 7.3 Einbindung OpenSG-basierter Funktionalität 76 7.4 Datenimport 77 7.4.1 AVS-Datenformate für Volumendaten 77 7.4.2 Die Field-Datenstruktur in AVS 78 7.4.3 C++ Klassen zur Verwaltung der Field-Daten 78 7.5 Rendersystem 80 7.6 Visualisierungssystem 81 7.7 Tetraederzerlegung 82 7.7.1 Pyramiden 83 7.7.2 Prismen 83 7.7.3 Hexaeder 83 7.8 Die grafische Benutzeroberfläche 87 7.9 Methoden des VolumeRender_UCD-Moduls 90 7.10 Klassenbeschreibungen 91 8 Zusammenfassung und Ausblick 95 9 Abkürzungsverzeichnis und Begriffserklärungen 97 10 Literaturverzeichnis 99 Anhänge auf CD: A1 OpenSG-Testprogramm zum Shirley-Tuchman-Verfahren A2 OpenSG-Testprogramm zum hierarchischen 3D-Textur-Verfahren A3 Quellcode der OpenSG-Erweiterungsbibliothek UnstructuredVolRenLib A4 Makro VolumeRender_UCD_GUI für AVS/Express 6 A5 Quellcode des Makros VolumeRender_UCD_GUI 7

1 Einleitung In vielen Gebieten der Wissenschaft und Industrie werden Volumendaten eingesetzt. Sie entstehen entweder in Rechner-Simulationen oder sind das Ergebnis von Messungen. In der Medizin werden Volumendaten bei der Magnet-Resonanz-Tomographie (MRT) und der Computer-Tomographie (CT) aus einzelnen Schichten rekonstruiert. Die Computer-Tomographie wird auch im industriellen Bereich zur Materialprüfung eingesetzt. Bei Rechner-Simulationen wendet man Finite-Element-Methoden (FEM) und Modelle aus dem CFD-Bereich (Computational Fluid Dynamics) an. Eine häufige Anwendung ist hier die Untersuchung des Strömungsverhaltens von Flüssigkeiten, Gasen oder Plasmen. Druck-, Temperatur- und Dichte-Daten sind typische Resultate solcher Simulationen. Auch für fotorealistische Visualisierungen in der Computergrafik sind Volumendaten wichtig, wenn Oberflächenbeschreibungen nicht ausreichen; z. B. bei der Darstellung von Wolken oder Feuer. Je nach Anwendungsbereich verwendet man unterschiedliche Gitter (siehe Kapitel 2) zur Definition von Abtastpunkten für die Daten. Im medizinischen Bereich werden hauptsächlich reguläre und rektilineare Gitter eingesetzt. Für Simulationen ist es jedoch häufig sinnvoll, zur Darstellung bestimmter Details an einigen Stellen das Gitter zu verfeinern. Zu diesem Zweck setzt man irreguläre und unstrukturierte Gitter ein. Standardmethoden zur Visualisierung von Volumendaten sind die Darstellung von 2D-Schnitten sowie die Extraktion von Isoflächen. Beide Methoden beruhen auf dem Prinzip, einen festgelegten Ausschnitt des Datensatzes darzustellen. Im Gegensatz dazu steht die direkte Volumenvisualisierung (Direct Volume Rendering, DVR), in der stets der gesamte Datensatz angezeigt wird. Über eine Transferfunktion wird jedem Volumenwert eine Farbe und Opazität zugeordnet; so kann man bestimmte Werte durch eine hohe Opazität hervorheben und andere durch eine niedrige Opazität verbergen. DVR ist nicht für eine exakte Analyse geeignet; das Ziel ist vielmehr, einen visuellen Gesamtüberblick über einen Datensatz zu erhalten. Es gibt unterschiedliche Methoden für das Direct Volume Rendering (siehe Kapitel 3). Bei der Wahl eines bestimmten Verfahrens sind drei Aspekte zu beachten: die gewünschte Ausgabequalität sowie Berechnungszeit für ein Frame und der Gittertyp des Datensatzes. Ausgehend vom Raytracing, das eine sehr hohe Qualität bei sehr langer Berechnungszeit liefert und auf jedem Gittertyp anwendbar ist, wurden in den letzten 15 Jahren unterschiedliche Alternativen entwickelt. Viele solcher Visualisierungsmethoden sind an Gittertypen gebunden. Das Shear-Warp-Verfahren etwa kann nur auf rektilinearen Gittern angewendet werden. Sehr schnelle Verfahren verringern häufig durch Artefakte die Ausgabequalität. So lässt sich mit der Überblendung texturierter Ebenen zwar auch für große Datensätze eine Echtzeitdarstellung (d. h. die benötigte Zeit für ein Bild liegt unter 0,04 Sekunden) erreichen, die Übergänge zwischen den Ebenen sind jedoch im Allgemeinen unstetig. Zudem sind die schnellsten bekannten Verfahren nur auf regulären bzw. rektilinearen Gittern möglich. Diese Arbeit untersucht DVR-Methoden für unstrukturierte Gitter, die sich für eine Echtzeitdarstellung eignen. Nach einem Vergleich basierend auf bestehender Literatur (Kapitel 4) wurde das Shirley-Tuchman-Verfahren (Kapitel 5) und die Visualisierung mit hierarchischen 3D-Texturen (Kapitel 6) für eine Implementierung ausgewählt. Diese Visualisierungsmethoden wurden zunächst in den Szenengraph OpenSG eingebettet. Darauf aufsetzend wurde ein Modul für die kommerzielle Visualisierungssoftware AVS/Express entworfen (Kapitel 7), das die in OpenSG implementierten Methoden für dieses Softwarepaket nutzbar macht. AVS/Express bietet bislang mit der aktuellen Version 6.3 keine Möglichkeit zum Direct Volume Rendering auf unstrukturierten Gittern. 8

2 Gittertypen und Beleuchtungsmodelle Zur Definition von Volumendaten ordnet man jedem Punkt innerhalb des Volumens einen skalaren Wert zu. Um eine Verarbeitung mit dem Rechner zu ermöglichen, ist eine Diskretisierung nötig. Die Elemente der zugrundeliegenden endlichen Punktmenge des Volumens heißen Abtastpunkte (Samplepunkte). Diese Punkte sind Eckpunkte von Volumenzellen. Weil es nur endlich viele Samplepunkte gibt, sind diese Zellen dreidimensionale Polyeder. Die Volumenwerte innerhalb der Zellen erhält man durch Interpolation; typischerweise benutzt man hier eine lineare Interpolation über die Eckpunkte. Den Komplex aus Zellen, Kanten und Punkten der Polyeder nennt man Gitter. Da es für den Umgang mit den Daten wesentlich ist, auf welchem Gittertyp sie definiert sind, werden die Gitter in den Abschnitten 2.1 bis 2.4 in unterschiedliche Typen klassifiziert. Für die Darstellung von Volumendaten benötigt man ein Beleuchtungsmodell, auf das wir in 2.5 eingehen. 2.1 Reguläre Gitter Ein reguläres Gitter ist ein quaderförmiger Ausschnitt eines kartesischen Gitters, wobei dieser Quader hauptachsenausgerichtet ist. An jedem Gitterlinienschnittpunkt befindet sich genau ein Samplepunkt. Abb. 2.1 zeigt ein zwei- und ein dreidimensionales Beispiel eines regulären Gitters. P max P max P min P min Abb. 2.1: Zweidimensionales (links) und dreidimensionales (rechts) reguläres Gitter. Die explizit definierten Punkte sind jeweils markiert. Zur Definition eines solchen dreidimensionalen Gitters gibt man die Anzahl Samplepunkte in jede der drei Raumrichtungen und die Endpunkte der Raumdiagonalen an. Falls der Abstand zwischen benachbarten Samplepunkten für jede Raumrichtung gleich ist, kann die Angabe der Diagonalen entfallen. Die Zellen eines dreidimensionalen regulären Gitters sind Quader. 2.2 Rektilineare Gitter Rektilineare Gitter sind eine Verallgemeinerung regulärer Gitter. Hier können die Abstände zwischen den Samplepunkten entlang einer Achse variieren. Allerdings müssen die Samplepunkte, die die gleiche x-koordinate haben, auf einer Ebene liegen. Analog gilt diese Vorraussetzung auch für die y- und z-koordinaten. Diese Einschränkung bewirkt, dass die Zellen auch hier quaderförmig sind. Zur Definition wird neben der Anzahl der Samplepunkte pro Achse noch jeweils der Achsenabschnitt für die Samplepunkt-Ebenen angegeben. Abb. 2.2 zeigt Beispiele für rektilineare Gitter. 9

Abb. 2.2: Zweidimensionales (links) und dreidimensionales (rechts) rektilineares Gitter. 2.3 Irreguläre Gitter Eine weitere Verallgemeinerung wird durch irreguläre Gitter gegeben. Ein Gitter ist irregulär, wenn es eine Abbildung auf ein reguläres Gitter gibt, die nur die Position der Samplepunkte ändert. Die Quaderform der Zellen geht dadurch gegenüber rektilinearen Gittern verloren, die Anzahl benachbarter Zellen jedoch bleibt konstant. Diese Verallgemeinerung der Quader-Zellen bezeichnen wir als Hexaeder. Beispiele für irreguläre Gitter sind in Abb. 2.3 zu sehen. Abb. 2.3: Zweidimensionales (links) bzw. dreidimensionales (rechts) irreguläres Gitter. Bei irregulären Gittern muss für jeden Samplepunkt eine Position im Raum angegeben werden. Obwohl die Definition Zelldurchdringungen zulässt, legt man irreguläre Gitter für reale Anwendungen so an, dass sich die Zellen nicht durchdringen. 2.4 Unstrukturierte Gitter Die bis hierher vorgestellten Gittertypen fasst man auch unter dem Sammelbegriff strukturierte Gitter zusammen. Unstrukturierte Gitter bilden den allgemeinsten Gittertyp. Nicht nur die Abb. 2.4: Zweidimensionales (links) bzw. dreidimensionales (rechts) unstrukturiertes Gitter. 10

Samplepunkte können beliebig im Raum positioniert sein; auch der Zelltyp kann variieren. Neben Hexaedern werden häufig Tetraeder, Pyramiden und Prismen verwendet. Formal zugelassen sind aber alle Polyeder. Abb. 2.4 zeigt Beispiele. Im praktischen Gebrauch werden unstrukturierte Gitter so angelegt, dass sich Zellen nicht durchdringen und das Gitter aus genau einer Zusammenhangskomponente besteht. 2.5 Beleuchtungsmodelle Wir stellen uns das zu visualisierende Volumen vor wie eine leuchtende Gaswolke. Für die Visualisierung dieser Wolke sind vier physikalische Vorgänge von Bedeutung: Licht-Emission, Absorption, Reflexion und Brechung. Durch die vielen kleinen Partikel in der Wolke treten Reflexion und Brechung innerhalb des Mediums sehr häufig auf, und eine korrekte Simulation wird sehr kompliziert. Heutige Visualisierungsmethoden, besonders diejenigen, deren Ziel eine möglichst schnelle Anzeige ist, beschränken sich deswegen auf Emission und Absorption. Eine sehr verständliche Herleitung der Intensitätsberechnungsformel für dieses Emissions- und Absorptionsmodell findet sich in [2], Abschnitt 3 (Continuous Model). Weil jenes Modell eine theoretische Basis für diese Arbeit darstellt, soll es hier vorgestellt werden. Die Licht-Emission der Gaswolke wird als Intensitätsfunktion abhängig von der Wellenlänge für einen Punkt (x, y, z) gegeben durch die Funktion κ(x, y, z, λ) Die Absorption ist zurückzuführen auf die optische Dichte der Wolke, die ebenfalls abhängig von der Wellenlänge und durch ρ(x, y, z, λ) definiert ist. Sei P(t) ein Sichtstrahl durch das Medium zum Auge (siehe Abb. 2.1), und sei ρ(t, λ) = ρ(p(t), λ) sowie κ(t, λ) = κ(p(t), λ). Ist die optische Dichte an einer Stelle höher, so wird dort einerseits mehr Licht absorbiert, andererseits aber auch mehr Licht emittiert. P(t) t n t + Dt 2 t t - Dt 2 t 0 Abb. 2.1: 2D-Schema einer Gaswolke. P(t) ist ein von t 0 bis t n parametrisierter Sichtstrahl, der durch die Wolke ins Auge fällt. Entnommen aus [2]. Sei I(t, λ) die Intensität der Wellenlänge λ an der Stelle t des Sichtstrahls. Für t gegen 0 ist ρ(t, λ) t der Bruchteil der Intensität des einfallenden Lichts der Wellenlänge λ, der beim Überstreichen von t absorbiert wird. κ(t, λ)ρ(t, λ) t hingegen ist die über t emittierte Intensität der Wellenlänge λ. Unser Ziel ist es, für jeden Sichtstrahl den Wert I(t n, λ) zu berechnen, da dies genau die Intensität der Wellenlänge λ ist, die ins Auge fällt. Der Weg zu diesem Ziel führt 11

uns von einem aus Bild 2.1 abgeleiteten Ansatz über die Herleitung einer Differenzialgleichung bis zu einem Ausdruck für I(t n, λ). Die Lichtintensität, die auf dem Sichtstrahl die Stelle t + t 2 erreicht, ist I(t + t 2 Dies lässt sich umformen in t,λ)=i(t,λ)(1 ρ(t, λ) t)+κ(t, λ)ρ(t, λ) t 2 I(t + t t,λ) I(t,λ) 2 2 t Für t gegen 0 ergibt sich die Differenzialgleichung = ρ(t, λ)i(t t,λ)+κ(t, λ)ρ(t, λ) 2 di(t, λ) dt = ρ(t, λ)i(t, λ)+κ(t, λ)ρ(t, λ) (1) Wir stellen die Gleichung nun um und multiplizieren auf beiden Seiten mit dem Term e Ê t t 0 ρ(u,λ)du. Es ergibt sich Ê t ρ(u,λ)du di(t, λ) Ê t t e 0 t + ρ(t, λ)e ρ(u,λ)du Ê t 0 t I(t, λ) =e ρ(u,λ)du 0 κ(t, λ)ρ(t, λ) dt Durch Anwenden der Produktregel erhalten wir Ê d dt [e t t ρ(u,λ)du Ê t 0 t I(t, λ)] = e ρ(u,λ)du 0 κ(t, λ)ρ(t, λ) Nun integrieren wir beide Seiten von t 0 bis t n Ê t t [e ρ(u,λ)du 0 I(t, λ)] tn t 0 = und erhalten tn t 0 Ê t t e ρ(u,λ)du 0 κ(t, λ)ρ(t, λ)dt Ê tn t e ρ(u,λ)du 0 I(t n,λ) e Ê t 0 t ρ(u,λ)du 0 I(t 0,λ)= tn t 0 Ê t t e ρ(u,λ)du 0 κ(t, λ)ρ(t, λ)dt Unter der Berücksichtigung, dass auf der linken Seite das Integral im rechten Term 0 ist, machen wir eine einfache Umformung I(t n,λ)=e Ê tn ρ(t,λ)dt t 0 tn t 0 Ê t e t 0 ρ(u,λ)du κ(t, λ)ρ(t, λ)dt + I(t 0,λ)e Ê tn t 0 und vereinigen die beiden Exponenten im ersten Summanden: I(t n,λ)= tn e t 0 Ê tn t ρ(u,λ)du κ(t, λ)ρ(t, λ)dt + I(t 0,λ)e Ê tn ρ(t,λ)dt t 0 ρ(t,λ)dt Für I(t n, λ) ist keine geschlossene Formel bekannt. Zur tatsächlichen Berechnung dieses Wertes hat man daher nur folgende drei Möglichkeiten: numerische Berechnung von (1) numerische Berechnung von (2) Approximieren von ρ(t, λ) und κ(t, λ) durch einfachere Funktionen, sodass sich Formel (2) zu einem geschlossenen Ausdruck vereinfachen lässt. (2) 12

Da die zuletzt genannte Möglichkeit brauchbare Ansätze für viele Visualisierungstechniken liefert, wird sie hier etwas weiter ausgeführt. Wir nehmen zunächst an, κ(t, λ) und ρ(t, λ) seien entlang eines Sehstrahls unabhängig von t, bevor wir diesen Ansatz anschließend auf stückweise Unabhängigkeit von t erweitern. Wegen der Unabhängigkeit der Funktion κ(t, λ) von t lässt sich (2) vereinfachen zu I(t n,λ)=κ(λ)(1 e Ê tn t 0 ρ(u,λ)du )+I(t 0,λ)e Ê tn ρ(t,λ)dt t 0 Da auch ρ(t, λ) unabhängig von t ist, erhalten wir I(t n,λ)=κ(λ)(1 e ρ(λ)(tn t0) )+I(t 0,λ)e ρ(λ)(tn t 0) (3) Gleichung (3) lässt sich identifizieren mit der aus dem Alpha-Blending bekannten Formel für das Back-to-Front-Compositing, wobei gilt C out = C new α + C in (1 α) α =1 e ρ(λ)(tn t 0) C new = κ(λ) C in = I(t 0,λ) C out = I(t n,λ) Es ist somit möglich, eine stückweise Integration entlang des Sehstrahls durchzuführen, wobei κ und ρ für jeden Abschnitt variieren können. Dies entspricht dem Ansatz, dass κ und ρ für festes λ entlang des Sichtstrahls stückweise konstant sind. Einerseits bietet sich also durch ein detaillierteres Sampling des Sichtstrahls die Möglichkeit zur exakteren Berechnung der Gesamtintensität, und andererseits ist die Identifizierung mit dem Alpha-Blending ein wichtiger Schritt in Richtung Hardwarebeschleunigung. Häufig wird die Funktion ρ(t, λ) als unabhängig von λ betrachtet. κ(x, y, z, λ) = I λ und ρ(x, y, z) werden dann in der Regel kompakt als Transferfunktion f(v) = (I r (v), I g (v), I b (v), ρ(v)) definiert, wobei v(x, y, z) der Skalarwert unserer Gaswolke an der Position (x, y, z) ist (dies kann z. B. eine Dichte oder ein Druck sein). 13

3 Techniken zur direkten Volumenvisualisierung In den vergangenen Jahren wurden viele unterschiedliche Techniken zur direkten Volumenvisualisierung vorgeschlagen. Das Raytracing (z. B. [3]) ist der älteste Ansatz; er ist sehr flexibel und erlaubt die Verwendung verschiedener physikalischer Modelle, ist aber sehr berechnungsaufwändig. Um die Rechenzeiten zu verkürzen hat man nach schnelleren Darstellungsmethoden gesucht, die die qualitativ hochwertigen Ergebnisse aus dem Raytracing möglichst gut approximieren sollten. Durch vereinfachende Annahmen über Lichtverhalten und Variation der Volumendaten zwischen den Sample-Punkten des Gitters wurden sowohl schnelle Software-Verfahren als auch die Ausnutzung von Hardwarebeschleunigungen möglich. Reguläre Gitter haben sich für Hardwarebeschleunigungen als sehr hilfreich erwiesen (z. B. 3D-Texturierung [29]), ermöglichen aber auch Softwaretechniken, die erhebliche Geschwindigkeitsvorteile bieten können (z. B. Shear-Warp-Transformation [15]). Um diese schnellen Verfahren auch für nicht-reguläre Gitter verwenden zu können, wurden Versuche unternommen, diese auf reguläre Gitter abzubilden. Dieser Ansatz ist zunächst widersinnig, da das Gitter in der Regel genau für solche Daten nicht-regulär ist, die an bestimmten Regionen besonders detailreich sind. Durch ein Resampling würden genau diese Details wieder verlorengehen, oder man müsste das reguläre Zielgitter sehr fein auslegen, was jedoch wegen des kubischen Speicherzuwachses einen immensen Speicheraufwand bedeuten würde. Eine Lösung für dieses Problem sind hierarchische Verfahren. Daneben gibt es jedoch auch Verfahren, die ohne ein Resampling auskommen und direkt auf nichtregulären Gittern arbeiten können. Beispielsweise haben Shirley und Tuchman [4] eine Methode für Tetraedernetze vorgeschlagen, für die es mittlerweile sogar Ansätze zur Hardwarebeschleunigung mit Consumer-Hardware gibt [5] [6]. Man kann die bestehenden Techniken klassifizieren in Objektraum-Verfahren (Object-Order) und Bildraum-Verfahren (Image-Order). Object-Order bedeutet, dass pro Frame für jede Gitterzelle ein bestimmter Algorithmus durchlaufen wird, der diese Zelle visualisiert. Die Gesamtheit der visualisierten Zellen ergibt das gewünschte Resultat. Bei Image-Order-Techniken wird stattdessen ein Algorithmus für jedes Pixel der Sichtebene durchlaufen, um für dieses Pixel den passenden Farbwert zu erhalten. Eine andere wichtige Einteilung der Visualisierungsverfahren ergibt sich aus den Gittern, auf denen die Verfahren arbeiten können. Während Raytracing auf allen Gittertypen funktioniert, benötigt beispielsweise ein 3D-Textur-Ansatz reguläre Gitter. Bevor wir jedoch eine Klassifizierung der Techniken vornehmen (Kapitel 4), werden sie zunächst etwas näher erläutert. 3.1 Raytracing Beim Raytracing von Volumendaten wird durch jedes Pixel der Sichtebene ein Sehstrahl gesendet, der das Volumen durchquert, ähnlich dem Strahl P(t) aus Abb. 2.1. Zur Intensitätsberechnung I(t n,λ) kann eines der in Abschnitt 2.5 angegeben Verfahren verwendet werden. Zum Entwurf eines effizienten Raytracers ist es nötig, die Berechnung möglichst effizient zu gestalten. Für jedes Bildpixel über den gesamten Sehstrahl zu integrieren würde sehr lange dauern. Zur Beschleunigung der Berechnung gibt es zwei grundlegende Vorschläge. Erstens kann man vollständig transparente Bereiche im Volumen einfach überspringen, zweitens kann die Integration entlang des Sehstrahls abgebrochen werden, sobald die Opazität des aktuellen Pixels ohnehin schon nahe 1 ist. Die zweite Technik wird in der Literatur auch Early Ray Termination genannt. Dafür 14

muss die Integration allerdings von vorne nach hinten anstatt von hinten nach vorne (wie in Abschnitt 2.5 angegeben) durchgeführt werden. Beide Optimierungen werden z. B. in [3] beschrieben. Trotz Optimierungen bleibt das Raytracing aber eins der langsamsten bekannten Verfahren. In Abb. 3.1 sehen wir ein Beispiel für eine per Raytracing erzeugte direkte Volumenvisualisierung. Abb. 3.1: Direkte Visualisierung des Datensatzes Lobster (Computertomographie eines Hummers) per Raytracing mit der Software AVS/Express 6.1. 3.2 Splatting Splatting wurde ursprünglich von Westover [28] vorgeschlagen. Die Idee dabei ist, für jedes Voxel eine zweidimensionale Abbildung (Splat) zu berechnen. Die Überlagerung der Splats auf der Bildebene ergibt das finale Bild. Die Berechnung der Splats besteht aus zwei Schritten. In einem Vorverarbeitungsschritt wird aus einem gewählten Filterkern durch Integration ein generischer Abdruck erzeugt und in einer Lookup-Tabelle gespeichert (generic footprint table). Je nach Kameraposition wird dieser dann pro Frame in einen blickpunktabhängigen Abdruck transformiert (viewdependent footprint table). Ein solcher Abdruck definiert die Verteilung des dem Voxel zugeordneten RGBA-Farbwertes im beeinflussten Bildbereich. Um nun den eigentlichen Splat zu berechnen, muss der Abdruck mit dem Wert des Voxels multipliziert und auf der Bildebene an die entsprechende Stelle verschoben werden. Dort kann dann ein Resampling auf die Bildpixel stattfinden. Falls in der Betrachtungstransformation eine nicht-uniforme Skalierung auftritt, haben die Splats die Form einer Ellipse; bei nur uniformen Skalierungen ergibt sich der Spezialfall eines Kreises. Splatting wurde ursprünglich für reguläre Gitter konzipiert, später aber auch auf rektilineare Gitter erweitert. Falls ein reguläres Gitter zugrunde liegt und die Betrachtungstransformation eine orthogonale Projektion ist, sind die Abdrücke für alle Voxel identisch. Daher muss dann pro Frame nur ein blickpunktabhängiger Abdruck berechnet werden. 3.3 Überblendung texturierter Ebenen Diese Visualisierungstechnik ist eng verbunden mit der Vorstellung, die Volumendaten seien aus vielen übereinanderliegenden Schichten zusammengesetzt. Für jede dieser Schichten wird repräsentativ eine RGBA-texturierte Ebene (Slice) gezeichnet. Durch die Transparenz (Alpha-Kanal) 15

wird vermieden, dass darunterliegende Slices verdeckt werden. Um die darzustellenden Slices korrekt texturieren zu können, müssen die Volumendaten auf einem regulären Gitter definiert sein. Das Beleuchtungsmodell entspricht dem in Abschnitt 2.5 vorgestellten Modell, wobei κ und ρ für den von einer Slice repräsentierten Volumenbereich als konstant vorausgesetzt werden. Häufig werden über die Anwendung der Transferfunktion nicht κ und ρ, sondern κ und direkt α ermittelt (α ist die vierte Komponente der RGBA-Textur). Ermöglicht wird dies durch das reguläre Gitter: der Abstand t zwischen zwei Slices ist konstant, daher hängt α nur noch von ρ ab (siehe Ende Abschnitt 2.5) und kann so auch direkt angegeben werden. Man unterscheidet zwischen Verfahren, die zur Hardwarebeschleunigung lediglich 2D-Texturen einsetzen und solchen, die 3D-Texturen verwenden. 3.3.1 2D-Texturen Bei 2D-Textur-Verfahren sind die Lage der einzelnen Slices und die Texturen auf den Slices konstant. Deswegen werden hier die Slices komplett vorberechnet. Um zu vermeiden, dass die Betrachtungsrichtung um mehr als 45 von der Flächennormale der Slices abweicht, werden insgesamt drei Textur-Stapel benötigt. Jeder Stapel enthält die entsprechenden texturierten Slices orthogonal zu einer der drei Hauptachsen. Pro Frame kann dann der Stapel für die Anzeige ausgewählt werden, der für die aktuelle Kameraposition am besten geeignet ist (d. h. geringste Abweichung der Sichtebenennormale von den Slicenormalen). Abb. 3.2: 2D-Textur-Darstellung des Lobster-Datensatzes, erzeugt mit AVS/Express 6.1. 16

Abb. 3.3: Eine weitere 2D-Textur-Darstellung, in der nach minimaler Kamerabewegung gegenüber Abb. 3.2 ein anderer Textur-Stapel verwendet wird. In Abb. 3.2 sieht man Streifenartefakte unten im Bild; hier sind sie oben zu sehen. Diese Methode ist sehr schnell, doch je höher der Blickwinkel auf die Slices ist, umso stärker merkt der Betrachter, dass es sich um einzelne hintereinanderliegende Slices handelt, was sich in streifenartigen Artefakten äußert. Beim Umschalten zwischen zwei Textur-Stapeln fallen diese Artefakte besonders stark auf, da sie plötzlich an der einen Stelle verschwinden und an einer anderen wieder auftreten (siehe Abbn. 3.2 und 3.3). 17

3.3.2 3D-Texturen Bei der 3D-Texturierung wird versucht, das Umschalten zwischen verschiedenen Textur-Stapeln zu vermeiden, indem die Slices in jedem Fall parallel zur Bildebene ausgerichtet werden (siehe Abb. 3.4). Eine Slice-Vorberechnung ist dann natürlich nicht mehr möglich. Die Ebenen müssen also pro Frame neu berechnet und texturiert werden. Da außerdem die Ausrichtung der Ebenen nun nicht mehr mit der der einzelnen Volumenschichten übereinstimmt, ist keine 2D-Texturierung möglich. Stattdessen legt man den Volumendatensatz als 3D-Textur ab und ordnet den Eckpunkten der Slices 3D-Texturkoordinaten zu. Durch eine hardwareunterstützte, trilineare Interpolation bleibt das Verfahren echtzeittauglich. In Abb. 3.5 sehen wir eine 3D-Textur-Darstellung. Abb. 3.4: Links: 2D-Textur-Stapel, Randartefakte fett gezeichnet. Rechts: orthogonale Ausrichtung der Slices bei der Verwendung von 3D-Texturen; Artefakte an allen Rändern möglich; Streifenartefakte immer noch vorhanden. Bei zu wenigen Slices sieht man einerseits am Rand des Volumens Artefakte (siehe Abb. 3.4); andererseits kommen im gesamten Bildbereich Streifenartefakte vor, die durch den Abstand der Überblendungsebenen zueinander in Verbindung mit deren unterschiedlicher Größe entstehen. Randartefakte treten beim 3D-Textur-Verfahren an allen Rändern auf, beim 2D-Textur-Verfahren hingegen nicht an allen Rändern (vgl. Abb. 3.4). Komplett beseitigen lassen sich die Artefakte nicht; man kann jedoch die Anzahl der Slices erhöhen bzw. den Slice-Abstand verkleinern, um die visuellen Auswirkungen zu verringern. 18

Abb. 3.5: 3D-Textur-Darstellung, erzeugt mit einer erweiterten Version des OpenSG VolumeViewers [33]. Die Streifenartefakte, die hier ansatzweise im Übergang von roten zu grünen Farbtönen zu sehen sind, werden bei einer interaktiven Betrachtung noch deutlicher. 19

3.4 Shear-Warp-Faktorisierung Die Basis für diese Technik ähnelt der des 2D-Textur-Verfahrens. Man betrachtet hauptachsenorthogonale Schnitte durch einen rektilinearen Volumendatensatz. Anstatt nun texturierte Schnittebenen im Raum zu platzieren und von der Grafikhardware rendern zu lassen, wird die Betrachtungstransformation in die drei Komponenten Scherung (im perspektivischen Fall mit Skalierung), achsenparallele Projektion und 2D-Bildtransformation (Warp) faktorisiert (siehe Abb. 3.6). Sichtstrahlen Scherung Volumen- Slices Projektion 2D-Warp Bildebene Sichtstrahlen Scherung und Skalierung Volumen- Slices Projektion 2D-Warp Bildebene Abb. 3.6: Shear-Warp-Faktorisierung der orthogonalen (oben) bzw. perspektivischen (unten) Betrachtungstransformation. Lacroute und Levoy haben dieses reine Software-Verfahren von der ursprünglichen orthogonalen auf eine perspektivische Projektion erweitert und stellen Möglichkeiten zur Beschleunigung der achsenorthogonalen Projektion vor [15]. Diese Beschleunigungen werden durch eine scanlinebasierte Traversierung von Volumenvoxeln und Bildpixeln und die Verwendung von speziellen, 20

Lauflängencodierungen verwendenden Datenstrukturen möglich. So können transparente und verdeckte Voxel übersprungen werden. Die Shear-Warp-Faktorisierung ist ein effizientes Software-Verfahren für rektilineare Gitter, jedoch treten Qualitätsverluste durch das zweimalige Resampling (Überblendung der gescherten Ebenen sowie 2D-Warp) auf, die je nach Kameraposition und Transferfunktion unterschiedlich stark ausfallen. 3.5 Shirley-Tuchman-Verfahren Das direkte Volumenrendering einer einzelnen Volumenzelle erzeugt auf der Sichtebene einen zweidimensionalen Bereich, dessen Rand identisch ist mit dem Rand der 2D-Projektion der Volumenzelle auf die Sichtebene. Diese Tatsache ist es, die dem Verfahren von Shirley und Tuchman [4] zugrunde liegt. Hier wird die Projektion einer Volumenzelle auf die Sichtebene berechnet und direkt mit 2D-Primitiven hardwarebeschleunigt gezeichnet, anstatt wie beim Raytracing über Integration Pixel für Pixel zu berechnen. Dabei ist es wichtig, die Farben und Opazitäten der 2D- Primitive so zu wählen, dass das Ergebnis aussieht wie ein aus dem Raytracing entstandenes Bild. Um nicht nur reguläre, sondern auch unstrukturierte Gittertypen mit abzudecken, wird bei diesem Verfahren für die Projektion auf die Sichtebene das Tetraeder als Grund-Volumenzelle gewählt. (Jedes Polyeder und damit jedes unstrukturierte Gitter kann in eine Menge von sich nicht durchdringenden Tetraedern zerlegt werden.) Deswegen heißt diese Technik auch Verfahren der projizierten Tetraeder (Projected Tetrahedra Algorithm). Den Rand dieser Projektion zu bestimmen ist einfach (siehe auch Abb. 3.7). Abb. 3.7: Tetraeder-Projektion auf die Sichtebene. Schwieriger ist es jedoch, die Farben und Opazitäten für die Dreiecke zu berechnen, die die Projektion darstellen und dem Betrachter ein gerendertes Tetraeder vortäuschen sollen. Hier lässt sich Formel (3) aus Abschnitt 2.5 anwenden. Der Sehstrahl wird dabei so gesampelt, dass die t i mit 0 < i < n die Grenzen zwischen je zwei benachbarten Tetraedern entlang des Sichtstrahls markieren. Werden nun mehrere Tetraeder nacheinander gerendert, ist für das Compositing auf eine korrekte Reihenfolge von hinten nach vorne zu achten. Das bedeutet aber, dass die zu zeichnende Tetraedermenge neu sortiert werden muss, sobald sich die Kameraposition ändert. Eine einfach zu ermittelnde Sortierung ergibt sich aus den Abständen zwischen Kamera und Tetraederzentren. Obwohl diese Sortierung nicht korrekt ist, wie Abb. 3.8 verdeutlicht, ermöglicht sie doch annähernd korrekte Ergebnisse und wird wegen ihrer schnellen Berechenbarkeit häufig in Echtzeitanwendungen eingesetzt. 21

Bereich in B, der von A verdeckt wird A C A C B B a b Kamera Abb. 3.8: In diesem Beispiel liegt das Zentrum C B von B näher an der Kamera als das Zentrum C A von A. Bei einer Sortierung nach Zentrumsabständen zur Kamera wird daher zuerst A und anschließend B gezeichnet. Der durch A überdeckte Teil von B wird inkorrekt dargestellt. In den vergangenen Jahren wurde viel Arbeit in die Erforschung korrekter, aber möglichst schneller Sortierverfahren für diese Anwendung gesteckt. Die derzeit schnellsten Methoden [17] [18] beruhen auf der Speicherung eines Graphen, dessen Knoten die Volumenzellen darstellen. Eine Kante existiert zwischen zwei Knoten genau dann, wenn die entsprechenden Zellen benachbart sind. Die Richtung einer Kante gibt an, welche der beiden Zellen die vordere und welche die hintere ist. Bei einer Änderung der Kameraposition wird nur die Richtung der Kanten aktualisiert. Die Kanten induzieren eine partielle Ordnung auf der Menge aller Zellen, die benutzt werden kann um eine korrekte Sortierung aller Zellen zu erhalten. 3.6 Hierarchische Verfahren Für die derzeit schnellsten Techniken der direkten Volumenvisualisierung sind reguläre Gitter notwendig. Über Resampling lassen sich zwar alle Gittertypen auf reguläre Gitter abbilden, dies bringt aber - wie am Anfang von Kapitel 3 beschrieben - Detailverluste oder einen immensen Speicheraufwand mit sich. Hierarchische Verfahren bieten hier einen Ausweg. Sie arbeiten mit einer Komposition unterschiedlich hoch aufgelöster regulärer Gitter. Dort, wo das Ursprungsgitter sehr hoch aufgelöst ist, werden die Daten auf ein sehr feines reguläres Gitter abgebildet; für gröbere Regionen sieht man ebenfalls ein gröberes reguläres Zielgitter vor. Angewendet wurde diese Idee bereits auf 3D-Textur-Verfahren [7] [11]. Hierarchische Verfahren bringen jedoch auch zwei Probleme mit sich. Zum einen können je nach Verfahren an den Übergängen zwischen je zwei regulären Gittern unterschiedlich hoher Auflösung Darstellungsartefakte entstehen. Für hierarchische 3D-Texturen ist die Beseitigung dieser Artefakte ein aktueller Forschungsgegenstand. Zum anderen ist darauf zu achten, dass je nach Feinheit des regulären Zielgitters evtl. einige Parameter der verwendeten Visualisierungstechnik angepasst werden müssen. Bei hierarchischen 3D-Texturen ist eine Alpha-Korrektur nötig, um die höher aufgelösten Bereiche nicht durch eine zu hohe Opazität hervorstechen zu lassen. 22

4 Anforderungen und Ziele In dieser Masterarbeit soll ein Modul für AVS/Express entwickelt werden, das direkte Volumenvisualisierung auf unstrukturierten Daten möglich macht. Für die Visualisierung soll der Szenengraph OpenSG verwendet werden. AVS/Express bietet bislang kein solches Visualisierungsverfahren auf unstrukturierten Gittern an. Man kann zwar ein Resampling auf ein reguläres Gitter durchführen, jedoch verliert man dadurch entweder Detailinformationen oder benötigt unverhältnismäßig viel Speicher und, damit verbunden, auch sehr hohe Rechenzeiten. Die Verwendung von AVS als eine Basis für diese Arbeit ist sinnvoll, weil dadurch bereits unterschiedliche Datenimport- und Vorverarbeitungsmöglichkeiten existieren. Außerdem bietet AVS eine sehr effiziente Erstellung von grafischen Benutzeroberflächen. Die Programmierung dieses Moduls unter Verwendung der OpenSG-Bibliothek hat eine gute Erweiterbarkeit und Wartbarkeit zur Folge. Die Erweiterbarkeit bezieht sich z. B. auf das Einbinden weiterer Rendertechniken oder das Unterstützen unterschiedlicher Ausgabegeräte (wie etwa die Visualisierung in einem Rechner-Cluster). Als Rendertechnik soll hier nicht das Resampling auf ein einziges reguläres Gitter angewendet werden. Die Nachteile dieser Methode wurden oben bereits erwähnt, außerdem wird dieses Feature bereits von AVS unterstützt. Ein Ziel ist die möglichst echtzeitnahe Darstellung, d. h. dass ein Benutzer im Idealfall den unstrukturierten Datensatz ohne merkbare Verzögerungen von allen Seiten interaktiv betrachten kann. Wir wollen nun die in Kapitel 3 vorgestellten Methoden zur direkten Volumenvisualisierung bezüglich dieser Bedürfnisse untersuchen. Die wesentlichen Aspekte sind der erlaubte Gittertyp und die Renderzeit für ein Frame. Der Vergleich von Renderzeiten für unterschiedliche Verfahren ist problematisch, da diese Zeiten nicht nur vom Verfahren selbst, sondern auch von der Beschaffenheit des dargestellten Datensatzes und der gewählten Transferfunktion abhängen. Außerdem hängt die Schnelligkeit einer Implementierung natürlich davon ab, welche Optimierungen eingesetzt werden. Es sei zudem darauf hingewiesen, dass die Änderung gewisser Parameter sich für unterschiedliche Verfahren unterschiedlich stark in der Rechenzeit auswirkt. Wenn man z. B. die Auflösung des Viewports erhöht, steigt die Rechenzeit beim Raytracing wesentlich stärker an als bei Gittertyp Renderzeit / Frame [sec.] Fuel Neghip Skull Blood Shock 64 3 64 3 256 3 256 3 64 2 x512 Raytracing unstr. 4,96 8,15 7,78 12,31 3,02 Splatting rektilinear 1,147,35 11,09 1,87 21,77 Shear-Warp rektilinear 0,09 0,240,27 0,09 0,91 3D-Texturen regulär 0,06 0,040,7 0,7 0,14 Shirley-Tuchman unstr. Tabelle 4.1: Aufstellung unterstützter Gittertypen für die in Kapitel 3 beschriebenen Verfahren, sowie Renderzeiten für verschiedene reguläre Datensätze (entnommen aus [12]). Das in [12] angegebene Testsystem besteht aus einer SGI Octane (R10000 CPU @ 250 MHz) mit 256 MB Hauptspeicher und einer MXE-Grafikkarte mit 4 MB Texturspeicher. 23

einer 3D-Textur-Darstellung. In [12] wird ein Vergleich vier verschiedener Renderverfahren versucht. Die dort für unterschiedliche Datensätze gemessenen Renderzeiten sind in Tabelle 4.1 zusammengestellt. Wie wir der Tabelle entnehmen, sind Raytracing und Splatting in jedem Fall deutlich langsamer als das Shear-Warp-Verfahren und die 3D-Textur-Darstellung. Leider ist davon das Raytracing die einzige Methode für unstrukturierte Gitter. Mit der Shirley-Tuchman-Methode wurden unter Verwendung von Vertex-Shadern bereits Renderzeiten erzielt, die für Gittergrößen bis zu 40.000 Tetraedern im Echtzeitbereich liegen [5], wobei allerdings die Zeit zum Sortieren der Tetraeder nicht berücksichtigt wurde. Einen Teil der Ergebnisse aus [5] sehen wir in Tabelle 4.2. Datensatz # Tetraeder GPU-Zeit (sec.) GPU-Zeit / 40 000 Tetraeder Blunt Fin 187 395 0,20 0,043 Oxygen Post 513 375 0,55 0,043 Delta Wing 1 005 675 1,07 0,043 Tabelle 4.2: GPU-Renderzeiten des mit Vertex-Shadern implementierten Shirley-Tuchman-Verfahrens aus [5] für drei verschiedene Datensätze. Die Zeiten beinhalten nicht die nötige Tetraedersortierung (Daten hierüber gibt das Paper nicht her). Es wird von einem konstanten Volumenwert innerhalb der Tetraeder ausgegangen. Das direkte Rendern von unstrukturierten Daten (Tetraedern) ist nur per Raytracing oder mit dem Shirley-Tuchman-Verfahren möglich. Raytracing scheidet wegen seiner Langsamkeit für Echtzeitanwendungen aus. Daher wurde für diese Arbeit die Entscheidung getroffen, die Shirley-Tuchman- Methode zu benutzen. Über hierarchisches Resampling auf reguläre Gitter ist auch jedes andere Verfahren aus Kapitel 3 auf unstrukturierten Daten verwendbar. Über Verfeinerungen an detaillierteren Gitterbereichen kann gerade dort eine genauere Visualisierung erfolgen. Die Verfeinerungen können zudem adaptiv den Möglichkeiten des eingesetzten Rechners angepasst werden. Diese Technik eignet sich hervorragend für Echtzeitanwendungen und wurde daher in dieser Arbeit ebenfalls am Beispiel von hierarchischen 3D-Texturen implementiert. Programmiert wurde auf der Windows-Plattform; als Compiler wurde der Intel Compiler 7.1 benutzt. Die Entwicklungsumgebung zum Compilieren der OpenSG-Erweiterungen war Cygwin 1.5; für die Entwicklung des AVS-Moduls wurde Microsoft Visual Studio 6.0 eingesetzt; zum Testen diente AVS/Express 6.1 [34]. 24

5 Implementierung des Shirley-Tuchman-Verfahrens Das Shirley-Tuchmann-Verfahren ist ein Object-Order-Verfahren. Pro Frame wird jedes Tetraeder genau einmal gezeichnet. In den Abschnitten 5.1 und 5.2 schauen wir uns zunächst an, welche Schritte pro Frame durchgeführt werden. Implementiert man diese Visualisierungstechnik genau so, wie sie im Paper [4] von Shirley und Tuchman beschrieben wird, so erhält man deutliche Artefakte. 5.3 zeigt ein Beispiel solcher Artefakte und beschreibt, wie man sie vermeiden kann. Da wegen der Transparenz die Tetraeder von hinten nach vorne gerendert werden müssen, muss vor jedem Frame eine Sortierung der Tetraeder stattfinden. 5.4 beschäftigt sich mit dieser Thematik und gibt eine sehr einfache und schnelle Art der Sortierung an. Abschnitt 5.5 beschreibt den Gesamtablauf für das Rendern eines Frames. 5.6 präsentiert visuelle Ergebnisse und Zeitmessungen, bevor 5.7 das Kapitel mit Beschreibungen der entworfenen C++ Klassen abschließt. Das OpenSG-Paket wurde im Zuge dieser Arbeit um die neue Library UnstructuredVolRenLib erweitert, die nun unter anderem einen OpenSG-Knoten ProjectedTetrahedra zur Benutzung des Shirley-Tuchman-Verfahrens anbietet. In den folgenden Abschnitten wird neben den detaillierten Verfahrensbeschreibungen auch auf diese Erweiterung eingegangen. 5.1 Klassifizierung Stellen wir uns das zu projizierende Tetraeder als Drahtmodell vor, so besteht die 2D-Projektion auf der Sichtebene je nach Lage dieser Ebene aus einem, zwei, drei oder vier Dreiecken. Da es später genau diese Dreiecke sind, die wir zeichnen möchten, ist es sinnvoll zunächst festzuhalten um welchen Fall es sich handelt. Für die spätere Farbgebung ist aber nicht nur die Anzahl der zu zeichnenden Dreiecke wichtig, sondern auch die Information, welche Seite des Tetraeders der Ka- Klasse 0 + + + - Klasse 1 + - - - Klasse 2 + + - - Klasse 3 + + - 0 Klasse 4 + - - 0 Klasse 5 + - 0 0 Abb. 5.1: Klassifizierung projizierter Tetraeder. 25

mera zu- und welche ihr abgewandt ist. Analog zu Shirley und Tuchman definieren wir hier sechs Tetraeder-Klassen über die Anzahl der zur Kamera gerichteten ( + ), abgewandten ( - ) und orthogonal zur Blickrichtung orientierten ( 0 ) Seitenflächen (siehe Abb. 5.1). Da die Normalen der Seitenflächen für die Klassifizierung eine entscheidende Rolle spielen und somit in jedem Frame benötigt werden, sind sie Member-Variablen der Tetraederklasse ClassifiedTetrahedron und werden direkt beim Erzeugen eines Tetraeders berechnet. Der Klassifizierungs-Funktion classify in der Klasse ProjectedTetrahedra wird ein Tetraeder und die Kamera-Position übergeben. Während der Klassifizierung wird für jede der vier Seitenflächen das Skalarprodukt zwischen der Flächennormale und dem Vektor von einem Flächenpunkt zur Kamera berechnet. Je nach Ergebnis (nahe 0, größer als 0, kleiner als 0) liegt die Fläche orthogonal zur Blickrichtung, der Kamera zu- oder abgewandt. In der Klasse ClassifiedTetrahedron gibt es eine 16-bittige Variable classification, die in den Bits 0 bis 5 die Anzahl der + -, 0 - und - -Flächen speichert und in den Bits 6 bis 13 den Zustand (+, 0 oder -) für jede Fläche einzeln festhält (siehe Abb. 5.2). So wird viel Information mit geringem Platzbedarf übersichtlich und schnell abfragbar bereit gehalten. Bit 15 Bit 0 xx xx xx xx xx xx xx xx Zustand Fläche BCD Anzahl + -Flächen Zustand Fläche ACD Zustand Fläche ABD Anzahl 0 -Flächen Anzahl - -Flächen ungenutzt Zustand Fläche ABC Abb. 5.2: Codierung der Klassifizierungsdaten in der Variablen classification der Klasse ClassifiedTetrahedron. Für die Flächenzustände steht der Bitcode 00 für eine - -Fläche, 01 für eine 0 -Fläche und 10 für eine + -Fläche. 5.2 Dickpunktbestimmung und Farbzuweisung Da wir die Dreiecke mit Hardwareunterstützung zeichnen möchten, genügt es, die Farben und Opazitäten für die Eckpunkte der Dreiecke zu bestimmen. Die Grafikhardware führt dann eine bilineare Interpolation für die Punkte innerhalb des Dreiecks durch. Für die folgenden Beschreibungen benötigen wir zunächst einige Definitionen. Wir stellen uns Strahlen vor, die ausgehend von der Kameraposition das Tetraeder durchdringen oder berühren. Jeder dieser Strahlen markiert auf der Sichtebene einen Punkt auf der 2D-Projektion des Tetraeders. Sei der Punkt S R ein solcher Punkt für den Strahl R. Dann definieren wir den Schnitt von R mit dem Tetraeder als Schnittstrecke D R. Die Länge von D R nennen wir Dicke d R des Strahls R oder auch Dicke von S R. Von allen Strahlen gibt es genau einen Strahl M mit maximaler Dicke. S M bezeichnen wir mit Dickpunkt, D M mit Dickstrecke, d M mit Tetraederdicke (siehe Abb. 5.3). Wir entnehmen Abb. 5.4, welche Dreiecke man je nach Tetraederklasse sinnvollerweise zeichnet, um eine Tetraederprojektion zu approximieren. Es fällt sofort auf, dass bei jedem Dreieck genau 26

d M M S M D M Abb. 5.3: Definition von Dickpunkt S M, Dickstrecke D M und Tetraederdicke d M. Klassen 0, 1 Klasse 2 Klassen 3, 4 Klasse 5 3 Dreiecke 4 Dreiecke 2 Dreiecke 1 Dreieck Abb. 5.4: Zerlegung der Tetraederprojektionen in Dreiecke. Die Dickpunkte sind durch Kreise markiert. ein Eckpunkt ein Dickpunkt ist. Die übrigen beiden Eckpunkte sind jeweils Punkte mit einer Dicke von 0. Farbe und Opazität für Punkte mit einer Dicke von 0 zu ermitteln ist einfach: man wendet lediglich die Transferfunktion auf den Skalarwert an einem solchen Punkt an und erhält die gewünschte Farbe. Die Opazität wird für diesen Punkt zu 0 gesetzt, da bei einem durch den Punkt fallenden Lichtstrahl weder Absorption noch Emission auftreten. Handelt es sich um einen Dickpunkt, wird zwar die Farbe wieder direkt über die Transferfunktion ermittelt, die Opazität ist jedoch ungleich 0 und muss aus Tetraeder-Dicke und optischer Dichte berechnet werden. Die optische Dichte wird abhängig vom Skalarwert am Dickpunkt über die Transferfunktion definiert (vierte Komponente nach RGB). Um Verwechslungen zu vermeiden beachte man, dass der durch die Transferfunktion gelieferte Alpha-Wert der optischen Dichte ρ(v) entspricht und sich unterscheidet von der Opazität α des Dickpunktes. Diese Dickpunkt-Opazität 27

wird berechnet nach der Formel α =1 e ρ(v) d c (5.1) Dabei ist d die Tetraederdicke relativ zum Gesamtausmaß des unstrukturierten Gitters. Im Exponenten werden die beiden variablen Faktoren ρ(v) und d benötigt. Einerseits möchte man über die optische Dichte ρ(v), die der Transferfunktion entnommen wird, Einfluss auf die Opazität des Tetraeders gewinnen. Andererseits muss für feste optische Dichte ein dickeres Tetraeder opaker wirken als ein nicht so dickes. ρ(v) und d liegen beide im Intervall [0,1]. Wir möchten, dass α ebenfalls in diesem Intervall liegt. Um dies zu erreichen, wurde im Exponenten in (5.1) ein konstanter Skalierungsfaktor c eingefügt. Je größer c ist, umso mehr nähert sich das maximal mögliche α (für ρ = d = 1) der Zahl 1. Das Intervall [0,1] wird also umso besser abgedeckt, je größer c ist. Ein großes c hat jedoch den Nachteil, dass die Funktion α c (t = ρ d) =1 e t c nur für kleine t den Funktionswert α c (t) im kompletten Intervall [0,1] variieren lässt. Für t > 0 geht α c (t) sehr schnell gegen 1. Ein solches Verhalten ist unerwünscht, weil dadurch die Kontrollierbarkeit der Funktionswerte über den Parameter ρ stark eingeschränkt wird. Wir dürfen also c nicht zu groß wählen. Ein vernünftiger Wert für c ist 6,9; dadurch sind α-werte zwischen 0 und 0,999 möglich, und ein zu steiler Verlauf des Graphen für kleine t wird vermieden (siehe Abb. 5.5). a c (t) 1 0.8 c = 100 c = 10 c = 6,9 c = 4 c = 1 0.6 0.4 0.2 0 0 0.2 0.4 0.6 0.8 1 Abb. 5.5: Graph der Funktion α c (t) für verschiedene c. t = r d Die Tetraederdicke d wird aus der Kameraposition und den Tetraedereckpunkten berechnet. Shirley und Tuchman schlagen in ihrer Veröffentlichung [4] vor, das Tetraeder auf die Sichtebene zu projizieren, dort eine Bestimmung des Dickpunktes durchzuführen und zur Berechnung der Tetraederdicke eine Rücktransformation in den 3D-Raum vorzunehmen. Die Bestimmung des Dickpunktes auf der Sichtebene motivieren sie mit dem Argument, das Tetraeder müsse zur Darstellung ohnehin auf die Sichtebene projiziert werden. Da heutzutage diese Transformation von der Grafikhardware gemacht wird, zählt dieses Argument jedoch nicht mehr. In der Implementierung dieser Arbeit 28

findet deswegen keine softwareseitige 2D-Projektion statt. Die Berechnung des Dickpunktes erfolgt im 3D-Raum über Geraden- und Ebenenschnitte, und für Positionen der einzelnen Dreiecke werden direkt die Koordinaten der Tetraedereckpunkte verwendet. 5.3 Alpha-Korrektur Die in 5.2 beschriebene Farbgebung ist zwar für die Eckpunkte korrekt, aber die bilineare Interpolation liefert für die übrigen Dreieckspunkte falsche Opazitäts-Werte. Dies soll anhand Abb. 5.6 verdeutlicht werden. a 3 = 1 - e -rdc a 4 Abb. 5.6: Bilineare Interpolation liefert inkorrekte Opazitätswerte. Der Wert α 4 auf halber Strecke zwischen α 0 und α 3 ist bei einer bilinearen Interpolation genau der Mittelwert, also α 4,bilinear = 1 2 1 2 e ρ d c Der korrekte Wert für α 4 ist jedoch α 4 =1 e ρ d 2 c α 4 und α 4, bilinear sind nur für ρ = 0 oder d = 0 identisch, allgemein liefert die bilineare Interpolation hier demnach falsche Ergebnisse. Dies äußert sich in der Darstellung durch Artefakte, wie sie in Abb. 5.7 zu sehen sind. Dieser Fehler lässt sich durch Texturierung des Dreiecks korrigieren. Die Farben werden weiterhin durch bilineare Interpolation aus den drei Eckpunkten ermittelt, und der Alpha-Wert wird zunächst zu 1 gesetzt. Anschließend modulieren wir eine Luminanz-Alpha-Textur über die bisherige Dreieckseinfärbung, wobei die Farben unverändert bleiben (Textur-Luminanz = 1) und der Alpha-Wert aus der Textur übernommen wird. So kann für jedes Dreieck ein und dieselbe Textur verwendet werden. Mit den Texturkoordinaten ρ und d (optische Dichte und Tetraederdicke) wird in einem Vorverarbeitungsschritt diese Alpha-Korrektur-Textur analog zu Gleichung (5.1) wie folgt initialisiert: tex(ρ, d) =1 e ρ d c a 1 = 0 a 2 = 0 Der Alpha-Kanal ist in Abb. 5.8 illustriert. Für das Setzen der Texturkoordinaten für jeden Dreiecks-Eckpunkt benötigt man die optische Dichte (wird wie in Abschnitt 5.2 ermittelt) sowie die Tetraederdicke. 29

Abb. 5.7: Oben: Artefaktbildung ohne Alphakorrektur; unten: mit Alphakorrektur. r r 1 1 1 d 1 d Abb. 5.8: Links: Alpha-Kanal der Alpha-Korrektions-Textur. Auf der x-achse ist die Tetraederdicke aufgetragen, auf der y-achse die optische Dichte. Rechts: beispielhafte Positionierung eines zu zeichnenden Dreiecks im Textur-Koordinatenraum. 30

5.4 Tetraeder-Sortierung In einer nicht gut durchdachten Implementierung des Shirley-Tuchman-Verfahrens kann die Echtzeitdarstellung schon an einer zu zeitaufwändigen Tetraedersortierung scheitern. Daher ist es besonders wichtig, hier so viel Rechenzeit einzusparen wie möglich. Um dies zu erreichen, kann man sehr schnelle Sortieralgorithmen einsetzen, die speziell auf dieses Problem zugeschnitten sind [17] [18]. Eine andere Möglichkeit ist, lediglich eine approximative Sortierung vorzunehmen, d. h. potenziell in nicht jedem Fall eine korrekte Sortierung zu erhalten, dafür aber Rechenzeit zu sparen. Da sich beim Testen der zuletzt genannten Möglichkeit gute visuelle Ergebnisse zeigten, wird hier ein einfaches, approximatives Sortierverfahren eingesetzt. Die gewählte Methode ist eine Kombination aus drei Approximationen. Als erste Approximation werden lediglich die Tetraederzentren betrachtet anstatt Tetraederverdeckungen zu untersuchen. So werden keine Zusammenhangsinformationen für die einzelnen Tetraeder benötigt. Zum Sortieren der Tetraeder nach dem Abstand ihrer Zentren zur Kamera kommt ein Bucketsort-Algorithmus zum Einsatz, der in nur einem Durchlauf durch die Tetraederliste die Tetraeder grob in je einen von 100 Abstandsbereichen einsortiert. Diese zweite Approximation ist sinnvoll, da sich viele der Tetraeder mit annähernd gleichem Abstand zur Kamera ohnehin nicht überdecken. Mit diesen beiden Approximationen hat man bereits sehr viel Rechenzeit gegenüber einer exakten Sortierung mit Quicksort eingespart (siehe Abb. 5.9). Sortierzeit in ms QuickSort 330 approx. BucketSort 34,9 PreSort 0,0677 Init. PreSort 454 Abb. 5.9: Sortierzeit verschiedener Algorithmen für 74884 Tetraeder (AMD Athlon XP CPU @ 1666 MHz). PreSort: nur Auswahl der vorsortierten Liste. Init. PreSort: Anwendung von approx. BucketSort für 13 verschiedene Richtungen. Ohne viel Mehraufwand kann die Framerate aber noch weiter gesteigert werden. Wir machen eine Vorsortierung der Tetraeder für 13 unterschiedliche Blickrichtungen. Für diesen Vorverarbeitungsschritt könnte man zwar anstatt des schnellen Bucketsort-Algorithmus auf einen langsameren, exakten Algorithmus umsteigen, aber da Bucketsort in hier vorgenommenen Tests sehr gute Resultate geliefert hat, wird dieser Algorithmus auch zur Vorsortierung eingesetzt. Eine schnelle Vorverarbeitung ist für eine Applikation, die das Shirley-Tuchman-Verfahren benutzt, angenehm. Zur Bestimmung der Sortierungs-Richtungen stellen wir uns eine Einheitskugel um das Zentrum der globalen Boundingbox vor (siehe Abb. 5.10). Die Oberfläche der Einheitskugel ist parametrisierbar über Längengrad λ und Breitengrad β, mit 0 <= λ < 360 und -90 <= β <= 90. Mit den 13 in Abb. 5.8 über Längen- und Breitengrad angegebenen Richtungen wird die gesamte Kugel abgedeckt, wenn man berücksichtigt, dass sich durch Spiegelung am Kugelzentrum 13 weitere Positionen ergeben. Im Programm entspricht eine Spiegelung am Kugelzentrum dem Rückwärtsablaufen der sortierten Tetraederliste. Pro Frame muss nun nur noch eine der vorsortierten Tetraederlisten ausgewählt werden. Dazu wird die aktuelle Kameraposition auf die Einheitskugel abgebildet, und Längen- und Breitengrad (λ p, β p ) dieser Projektion werden berechnet. (λ p, β p ) wird dann durch separate Rundung der beiden Komponenten einer der 26 Vorsortierungs-Richtungen zugewiesen. 31