Praktikum Medizinische Bildverarbeitung in C#: Volume-Rendering Technische Universität München / Lehrstuhl Informatik IX WS 2004/05 Dr.

Ähnliche Dokumente
Blender Tutorial Dresden in 3D

Inhalt Das Zeichnen von Strukturformeln mit ISIS/Draw

Blender für Anfänger

Hochschulrechenzentrum Justus-Liebig-Universität Gießen. CorelDRAW X7. Zoomen

Anleitung zur Pflege der Homepage über den Raiffeisen-Homepage-Manager

[ tutorial - block animation ]

Chemische Elemente. Chemisches Element mit einer Folie im Präsentationsprogramm PowerPoint vorstellen

Hannover: Lebensqualität in der Südstadt

Wima-Praktikum 2: Bildsynthese-Phong

2. Den einzelnen Objekten Material zuteilen. Die Materialien können mit Farben versehen werden (siehe 4) oder mit einer Image Textur (siehe 5).

10.2 Grafische QM-Verfahren 1

1. Das Koordinatensystem

F+R V 5.x -> FFR V 6.x Seite 1 von 5 Informationen und Verfahren zur Übernahme der Pläne

Eclipse Tutorial.doc

INHALTSVERZEICHNIS. 2D-DXF / DWG Import Allgemeines

Adobe Illustrator 01. Turorial_Übung_03. Darstellungsmethoden WS 2013/ Neues Dokument. 1.2 Formatgröße bestimmen 1.3 Ebenen

Startseite. Primadenta Joomla. Unterseite

Let's talk Gimp 2.8. Lektion. Die Fenster. Digitales Gestalten mit Open Source

Kleines Einführungstutorial zu DAZ-Studio

Mit Steuerung auf eine Ebene mit einem freigestelltem Objekt klicken (linke Maustaste), um nur dieses Objekt zu markieren

IFA-Formulare im PDF-Format mit Adobe Acrobat Reader DC öffnen. Inhalt. Einleitung. 1. PDF-Formular lokal speichern und öffnen

Der Einsatz von HDRIs in LightWave 7

Handbuch zum VivaWeb-Serienbrief-Programm

PDF-Kurs 2010 (1. Tag)

Formulare. Datenbankanwendung 113

DIE TASKLEISTE VON WINDOWS 10

Artikel Schnittstelle über CSV

Neuerungen in Version 6.1

Arbeiten mit Dokumenten-Mustern

Computer Tastatur und Funktionsweisen

TEXTEFFEKTE TEXTFELDER VERWENDUNG VON TEXTFELDERN. Markieren Sie den Text, und klicken Sie in der Registerkarte Start auf das Symbol

Arabische Ornamente in OpenOffice bearbeiten

Präsentieren mit Power Point Einführung

Ausbildungsziel: Die Nutzung der Zwischenablage -Kopieren und Einfügen-

b.a.b-technologie gmbh ThemeEditor Dokumentation

VERWENDETE BRICSCAD VERSION

Dateiansichten in Ordnern

RÖK Typo3 Dokumentation

Einführung in QtiPlot

Kalendarium M. Belz, W. Kornfeld GbR Engeldorfer Str.25 D Brühl Tel.: Fax:

Gratis Bildbearbeitungsprogramm

Handbuch Datenpunktliste - Auswerte - Tools

TYPO3 Redaktoren-Handbuch

Arbeiten mit XnView. E:\Schmitt\Fortbildung XnView\Arbeiten mit XnView.doc

Dynamische Geometrie

Übersichtlichkeit im Dokumentenmanagement

Panoramen erstellen & bearbeiten

Kennen, können, beherrschen lernen was gebraucht wird

DashCommand. Anleitung. Version OBD-2 Software für Touchscreen-PC und ELM-Interfaces. Copyright 2008 CarCode Müller All rights reserved

Ausbildungsziel: Sicherer Umgang mit der Maus

Blatt 1. Wie kann man Eigenschaften wie Größe oder Titel eines Fensters ändern?

Erste Schritte mit AmphIdent

Handbuch DatInf Measure

Bilder schnell mit Lightbox verbessern:

Favoriten speichern und verwalten im Internetexplorer 7.x

PG5 Starter Training PG5 Core und Webeditor 8 Daniel Ernst DE

Das Anpassen der Stammdatenansichten

Schalter für Zeichnungshilfen Statuszeile

3 GRAFIKEN, BILDER, ZEICHNUNGSOBJEKTE

ECDL-Vorbereitungskurs Modul 4 (Excel) - Syllabus 5

"rendern" = ein abstraktes geometrisches Modell sichtbar machen

2 SolidWorks Vorlagendateien

Stapelverarbeitung Skalieren von Bildern

MODELLIERUNG UND ANIMATION EINER KTM 250 EXC MIT LIGHTWAVE 3D

Ausbildungsziel: Erstellung eines Briefes mit Hilfe von Vorlagen

LÖSUNGEN AUFGABEN: EXCEL XP (OHNE DATEIEN)

Erstellen von Bildschirmpräsentationen mit Powerpoint 2003

Wir erklären nun die wichtigsten Arbeiten wie einfachen Text anlegen, Rundtext erstellen und Bilder einbinden.

SilverFast - Pioneer in Digital Imaging. SilverFast 8. Professionelle Scanner-Software Professionelle Bildbearbeitungs-Software DEUTSCH.

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Rezepte in der Klammer-Strich-Methode schreiben

Erstellung eines elektronischen Bilderbuchs mit Open Office

Kalenderfunktion im ecampus

Licom AlphaCAM 2012 R1

Start. 34 Symbolleiste einrichten. Wissen

Das Vorgehen bei der Veränderung der Breiten wird sowohl bei Spalten als auch bei Höhe der Zeilen auf gleiche Art und Weise durchgeführt.

Structure/Draw: zwischen den Modi wählen (Structure-Modus zum zeichnen von Molekülen, Draw-Modus zum zeichnen von Geräten und Apparaturen)

Übung 1: CAM-Teil Definition

DAS EINSTEIGERSEMINAR

SMART PODIUM EINFÜHRUNG FÜR LEHRENDE

1 Arbeit mit Ebenen 1

Bildbearbeitung in Word und Excel

Das mittlere Fenster wird Bildfenster genannt. Links befindet sich der Werkzeugkasten.

Tipps & Tricks ArCon. Schriftfeldmakro. Informationszeitschrift der DI KRAUS & CO GesmbH Seite 18

mgssepa.dll SEPA LIBRARY MICHAEL GRUBE MG SOFTWARE ENTWICKLUNG

Öffnen Speicher, Ausschneiden, Kopieren Zoomen Bildanzeige

Kurzanleitung Zeichnungsmodul ACD Chemsketch 11.0 Freeware

1.1 Erstellen von Anwenderdefinierten Symbolen

VHS-Kurs Homepage Tutorial zum Kursnachmittag 1, Bilder für Homepage skalieren mit GIMP

Arbeiten im Tiparlo WICHTIG! TIPARLO funktioniert unter Firefox! Internet Explorer kann zu Problemen führen!

MBF III 342- Zentrale. Abschlüsse

Bedienungsanleitung. Online - Option

Lesegerät am PC verwenden

Adobe Photoshop CS2 Teil 1

Poser Tutorial by Margy

Verknüpfen & Einbetten von Daten

FreeQDA. Eine freie Software zur Analyse qualitativer Forschungsdaten. Anleitung. von Jörg große Schlarmann. und Dirk Kitscha

GI Vektoren

Transkript:

Praktikum Medizinische Bildverarbeitung in C#: Volume-Rendering Technische Universität München / Lehrstuhl Informatik IX WS 2004/05 Dr. Michael Roth Prof. Dr. Bernd Radig Aufgabe 37 Blatt 9 Erweitern Sie Ihre Klasse TriangleObject3D um einen Konstruktor, welcher als Parameter den Dateinamen einer Videoscape-Datei (siehe Hilfebox) erwartet und diese einliest. Es soll in Ihrem Programm möglich sein, ein Objekt über einen Menüpunkt Load Object mit anschließendem Dateiauswahldialog zu laden. Zum Einlesen der Datei wird Ihnen die Klasse ParseStream auf den WWW- Seiten des Praktikums zur Verfügung gestellt, die diverse Hilfsfunktionen zum Verarbeiten einer Textdatei bietet. Ebenfalls auf den WWW-Seiten finden Sie einige Beispiel-Dateien im Videoscape-Format. Wie sieht eine VideoScape-Datei aus? Dateien in diesem Format sind einfache Text-Dateien, deren erste Zeile den zur Identifikation einer Videoscape-Datei dienenden String 3DG1 enthält. Danach folgt in der nächsten Zeile die Anzahl der Vertices des Objekts. Diese werden in den darauf folgenden Zeilen angegeben. Dabei enthält jede Zeile einen Vertex aufgeschlüsselt in die X-, Y- und Z-Komponenten des Positionsvektors. Nach den Vertices enthalten die restlichen Zeilen nur noch die Flächeninformation, wieder jeweils eine Fläche pro Zeile. Der erste Wert ist dabei die Anzahl der Eckpunkte der Fläche (in unserem Praktikum immer 3) danach die drei Indices der Vertices. Das letzte Element einer solchen Zeile enthält die Farbe des Vertex als Hexadezimale Zahl, die wir aber ignorieren können. Hier ein Beispiel für eine Videoscape-Datei (eine simples Rechteck): 3DG1 4-1.0-1.0 0.0 1.0-1.0 0.0-1.0 1.0 0.0 1.0 1.0 0.0 3 0 1 2 0xFF0000 3 0 2 3 0xFF0000 Wie funktioniert die Klasse ParseStream? Mit dem Konstruktor wird ein ParseStream für eine Datei erzeugt. Danach können Sie mit den Methoden ReadString(), ReadInt() oder ReadDouble() das nächste Datenelement in der Datei auslesen. Dabei werden automatisch führende Leerzeichen oder Neue-Zeile-Symbole übersprungen und zum nächsten Datenelement vorgerückt. Seite 1 von 6

Aufgabe 38 Wenn Sie eine Videoscape-Datei einlesen, dann kann es vorkommen, dass das Objekt zu groß oder nicht zentriert dargestellt wird. Um dies auszugleichen müssen die Vertex- Positionen des Objekts noch geeignet verarbeitet werden. Verwenden Sie die in den folgenden Teilaufgaben beschriebenen Methoden um ein TriangleObject3D nach dem Einlesen zu zentrieren und die Größe geeignet einzustellen. a.) Erweitern Sie die Klasse TriangleObject3D um eine Methode Center(), welche den Schwerpunkt des Objekts (die durchschnittliche Position aller Vertices) berechnet und von allen Vertex-Positionen abzieht. b.) Mittels einer weiteren Methode SetScale(double s) soll der Maßstab des Objekts verändert werden können, und zwar so, dass der durchschnittliche Abstand der Vertices zum Ursprung gleich s wird. Dazu muss zunächst der tatsächliche durchschnittliche Abstand t ermittelt werden. Wenn Sie nun alle Vertex-Positionen mit s/t multiplizieren, wird Ihr Objekt geeignet verkleinert oder vergrössert. Aufgabe 39 Für eine realistischere Darstellung von 3D-Objekten bietet OpenGL Möglichkeiten für schattierte Oberflächen. Dazu müssen folgende Dinge über OpenGL-Kommandos eingestellt werden: Materialeigenschaften der Oberfläche Lichteigenschaften wie Position und Farbe des Lichts Orientierung der Oberfläche, da die Menge des reflektierten Lichts von dem Einfallswinkel der Lichtstrahlen abhängt. Es bietet sich an, die ersten zwei Konzepte objektorientiert in eigenen Klassen zu kapseln: a.) Programmieren Sie eine Klasse Material im Namensraum Rendering mit den Properties Color Ambient, Color Diffuse und Color Specular sowie einer Property float Shininess. Jedes TriangleObject3D hat ein eigenes Material, welches über eine geeignete Property zugänglich ist. b.) Programmieren Sie eine Klasse Light, ebenfalls im Namensraum Rendering. Ein Objekt dieses Typs besitzt eine Position und eine Farbe, die wie immer über Properties zugänglich sein sollen. Es gibt in diesem Praktikum nur ein Licht-Objekt, das im Document gespeichert ist. Mit der Methode GLCode() können für beide Klassen die Eigenschaften für die aktuellen OpenGL Rendering-Vorgang gesetzt werden. Die Orientierung einer Fläche wird in der Computergrafik durch eine so genannte Oberflächennormale angegeben, dies ist ein Einheitsvektor der senkrecht auf der Oberfläche steht. Dabei kann für jeden Vertex eine eigene Normale angegeben Seite 2 von 6

werden, dadurch kann man z.b. den Eindruck einer gekrümmten Oberfläche erwecken. Erweitern Sie Ihre Vertex-Klasse um einen Vektor, der die Normale enthält. Damit Sie die Schattierung auch Testen können, sollten Sie zu TriangleObject3D eine Methode AddVertex( Vector3D pos, Vector3D normal ); hinzufügen, mit der Sie Vertices mit einer Normale an das Objekt anhängen können. Erzeugen Sie unter Verwendung dieser Methode ein TriangleObject3D mit nur einem Dreieck und stellen Sie dieses schattiert dar. Wie werden Materialeigenschaften in OpenGL definiert? Dafür wird nur der Befehl PGL.glMaterialfv( PGL.GL_FRONT_AND_BACK, <Material- Eigenschaft>, <Farbe in einem Float-Array der Länge 4 im RGBA-Format>); benötigt. Es bietet sich dabei an, eine Hilfsmethode bereitzustellen, die ein System.Drawing.Color-Objekt in ein entsprechendes float-array umwandelt, z.b. float[] ToFloatArray( Color c );. Es ist dann möglich die Properties der Material-Klasse einfach auf die OpenGL- Materialeigenschaften abzubilden: PGL.glMaterialfv( PGL.GL_FRONT_AND_BACK, PGL.GL_DIFFUSE, ToFloatArray( this.diffuse ) ); Die weiteren nötigen Konstanten lauten PGL.GL_AMBIENT und PGL.GL_SPECULAR. Lediglich der Shininess-Parameter weicht hiervon ab, weil er keine Farbe enthält: PGL.glMaterialfv( PGL.GL_FRONT_AND_BACK, PGL.GL_SHININESS, ref this.shininess ); Wie werden die Licht-Eigenschaften in OpenGL definiert? Zunächst muss die Beleuchtungsberechnung aktiviert werden: PGL.glEnable( PGL.GL_LIGHTING ); PGL.glEnable( PGL.GL_LIGHT0 ); // Beleuchtung einschalten // Erste Lichtquelle aktivieren Die weiteren Lichteigenschaften werden analog zu PGL.glMaterialfv() durch den OpenGL-Befehl PGL.glLightfv( <Licht-Nummer, im Prakikum immer PGL.GL_LIGHT0>, <Licht-Eigenschaft>, <float-array der Länge 4> ); Für <Licht-Eigenschaft> kann PGL.GL_POSITION oder PGL.GL_DIFFUSE eingesetzt werden. Der Aufbau des Arrays ist für PGL.GL_DIFFUSE klar, bei PGL.GL_POSITION taucht jedoch das Problem auf, dass offensichtlich ein Positionvektor übergeben wird, dieser aber nur drei Komponenten X,Y und Z besitzt. Die Lösung hierfür: Der Vektor wird als so genannter homogener Vektor angeben, dies ist ein vierdimensionaler Vektor dessen letzte Komponente (häufig W genannt) für Positionsvektoren immer 1 ist. Die Position wird durch die aktuelle ModelView-Matrix transformiert, so dass das Setzen der Licht- Position bevorzugt nach einem PGL.glLoadIdentity() aber noch vor dem Setzen der Transformation für das 3D-Objekt kommen sollte. Wie werden die Normalen für einen Vertex gesetzt? Mittels der Methode PGL.glNormal3d( x, y, z ); kann ein Normalenvektor für die nachfolgenden Vertices gesetzt werden. Seite 3 von 6

Aufgabe 40 Wenn Sie ein 3D-Objekt aus einer Datei einlesen, haben Sie keine Normalen- Vektoren, weil diese im Videoscape-Format nicht gespeichert werden. Die Normalenvektoren eines Triangles können aber recht einfach aus den Vertex- Positionen und dem Kreuzprodukt berechnet werden: Normale n C-A A B-A Mathematisch formuliert: n = ( B A) ( C A) C B Für einen Vertex kann dann eine Normale berechnet werden, indem die Normalen der angrenzenden Triangles gemittelt und wieder normalisiert werden. Zusatzfrage: Ist die Division bei der Mittelung noch nötig, wenn man normalisiert? Erweitern Sie die Klasse Triangle um eine Property Normal (die über obige Formel entsprechend gesetzt wird, z.b. in AddTriangle(...)) sowie die Klasse TriangleObject3D um eine Methode CalculateNormals(), die den beschriebenen Algorithmus für die Normalen der Vertices kapselt und automatisch aufgerufen wird, sobald ein Objekt geladen wird. Aufgabe 41 Wenn Sie nun ein eingelesenes Dreiecksobjekt auf dem Bildschirm darstellen, dann kann es sein, dass ein Dreieck im Vordergrund durch ein weiter hinten liegendes Dreieck überzeichnet wird. Um dieses Problem zu lösen unterstützt OpenGL so genannte Depth-Buffers (häufig auch Z-Buffer genannt). Es wird dabei in einem zusätzlichen Buffer für jeden Pixel eine Tiefe (die Z-Komponente des zugehörigen 3D Oberflächenpunktes nach Anwendung der Model-View-Matrix) gespeichert. Dadurch kann dann jedes Mal wenn der Pixel mit einem neuen Oberflächenpunkt überzeichnet werden soll überprüft werden, ob sich der neue Punkt vor oder hinter dem bereits gezeichneten Punkt befindet. Im letzteren Fall wird der neue Punkt ignoriert und so die Dreiecke in korrekter Reihenfolge dargestellt. Verwenden Sie einen Depth-Buffer für Ihre Darstellung im OpenGLView, dafür brauchen Sie nur: a.) den Depth-Buffer einschalten, dies geschieht mittels PGL.glEnable( GL_DEPTH_TEST ); b.) den Depth-Buffer vor jedem Rendering-Durchlauf löschen, indem Sie bei dem glclear-aufruf noch das PGL.GL_DEPTH_BUFFER_BIT setzen. Dieser Wert kann mittels einem bitweisem Oder mit PGL.GL_COLOR_BUFFER_BIT verknüpft werden, so dass Sie glclear nur einmal verwenden brauchen. Seite 4 von 6

Optionale Aufgabe 4 Diese Aufgabe soll Ihnen zeigen, wie Sie mittels des Freeware-3D- Modellierungs-Tools Blender eigene 3D-Objekte im Videoscape-Format für das Praktikums-Programm erzeugen können. Blender ist von der Seite www.blender3d.org downloadbar. Wenn Sie Blender starten, erscheint zunächst ein 3D-Fenster mit der Default- Szene, bestehend aus einem Würfel, einer Kamera und einer Lichtquelle. Das Programm wird mit einer Mischung aus Maus und Tastatur-Kürzeln bedient, wobei sich die Tastatur-Kommandos meist auf das aktuelle Objekt beziehen, welches in der 3D-Ansicht Rosa dargestellt wird. Das aktuelle Objekt kann durch Anklicken mit der rechten Maustaste ausgewählt werden. Die wichtigsten Tastatur-Kürzel sind: r Rotieren g Verschieben ( grab ) s Skalieren n Numerische Eingabe der Transformation x Löschen Ctrl+x Alles Löschen und zur Default-Szene a Alle Objekte auswählen/abwählen b Bereichsauswahl Tab Wechsel zwischen Vertex-/Objekt-Editor und Szenen-Editor F12 Rendern der aktuellen Szene Shift+a Menü mit dem man neue Objekte einfügen kann Zusätzlich kann man den Tasten auf dem Nummernblock (Num-Lock muss aktiv sein) die Ansicht auf die Szene verändern. Um z.b. einen 3D-Text zu erstellen gehen Sie folgendermaßen vor: 1. Löschen Sie den Würfel, indem Sie es mit der rechten Maustaste auswählen und dann die x-taste drücken. Es erscheint ein Menü mit Erase Selected, klicken Sie diesen Menüpunkt an und das Rechteck ist verschwunden. 2. Drücken Sie Shift+a und wählen Sie in dem erscheinenden Menü den Punkt Add/Text aus. Es wird dadurch ein 3D-Text erzeugt, den Sie ganz normal mit der Tastatur editieren können. Mit der Tab-Taste können Sie den Editor-Modus wieder verlassen. 3. Das Objekt ist momentan noch flach, wie Sie z.b. sehen können, wenn Sie mittels des Nummernblocks die Ansicht auf das Objekt verändern. Um dies zu ändern, drücken Sie die F9-Taste (Sie können auch auf das Icon der Edit-Buttons klicken). Dadurch wechselt in der unteren Hälfte des Bildschirms das Fenster. Mit den Buttons Ext1 und Ext2 können Sie die Tiefe und die Stärke der Kantenabflachung des Texts einstellen. Dies Seite 5 von 6

geschieht durch die linke Maustaste und Mausbewegungen nach Links und Rechts. Wenn Sie zusätzlich die Alt-Taste drücken, können Sie den Wert feiner einstellen oder Sie können den Button mit Shift und der linken Maustaste anklicken, dadurch wird eine Werteingabe per Tastatur ermöglicht. Sinnvolle Werte sind z.b. Ext1=0.1 und Ext2 = 0.03. 4. Bis jetzt verwaltet Blender das Objekt noch als Text, für den Videoscape- Export muss es aber in ein Mesh umgewandelt werden. Dies geschieht, indem Sie zweimal Alt+c drücken. Dadurch wird das Objekt zuerst in eine Curve und dann in ein Mesh umgewandelt. 5. Leider hat die Text-Funktion in Blender einen kleinen Bug. Diesen sehen Sie, wenn Sie F9 drücken und die Option Double-Sided deselektieren und in der 3D-Ansicht die Taste z drücken. Teile des Objekts werden Schwarz dargestellt, weil die Normalen der Dreiecke in die falsche Richtung zeigen. Der nächste Schritt behebt das Problem. 6. Wählen Sie mit den Tasten auf dem Nummern-Block eine Ansicht, bei der Sie von oben auf den Text schauen. Wechseln Sie mit der Tab-Taste in den Edit-Mode, drücken Sei einmal die b-taste und ziehen Sie mit der linken Maustaste ein Rechteck um die falsch orientierten Dreiecke aus. Die Normalen für die ausgewählten Dreiecke können Sie nun mit dem Button Flip Normals spiegeln. 7. Verlassen Sie den Edit-Modus und wählen Sie im Menü File/Save Videoscape. Im anschliessenden Dialog können Sie einen Dateinamen auswählen und das Objekt speichern. Soweit die Kurzeinführung in Blender. Im Internet gibt es weiterführende Tutorials, z.b. unter http://www.blender3d.org/education/, in denen auch gezeigt wird, wie man mit Blender z.b. Animationen macht. Optionale Aufgabe 5 Die in der optionalen Aufgabe 1 erstellte Datei ist zwar eine Videoscape-Datei, Ihr Programm wird sie aber noch nicht lesen können weil die Laderoutine nicht leistungsfähig bzw. robust genug ist: Die folgenden beiden Probleme können aber leicht behoben werden: Die Datei enthält nicht nur Dreiecke sondern auch Vierecke. Diese kann man aber abfangen und in zwei Dreiecke aufspalten. Es treten vereinzelt degenerierte Dreiecke auf. Das sind Dreiecke, bei denen alle Punkte auf einer Linie liegen. Dies ist eigentlich nicht schlimm, führt aber dazu, dass die Normale für ein solches Dreieck (0,0,0) ist und in GetNormalized() dann durch 0 geteilt wird. Dadurch entsteht eine ungültige Normale über die sich dann PGL.glNormal3d() beschwert. Die einfachste Behandlung dieses Problems ist GL.glNormal3d() anstelle von PGL.glNormal3d() zu verwenden. Dadurch wird einfach die entsprechende Fehlermeldung ausgeschaltet. Seite 6 von 6