30.11.2012 Aufrufe

CG1-01-15.pdf

CG1-01-15.pdf

CG1-01-15.pdf

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

1<br />

Computergrafik II<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Fakultät Informatik/Mathematik<br />

HTW Dresden<br />

11. Einführung Ei füh in i die di Computergrafik<br />

C t fik 99. HHelligkeits- lli k it undd FFarbdarstellung bd t ll<br />

2. OpenGL: Struktur und Programmierung 10. Rasterkonvertierung von Linien und Flächen<br />

3. OpenGL: Ansicht und Transformation 11. Klippen und Glätten<br />

4. OpenGL: p Kurven und Flächen<br />

12. Sichtbarkeitsbestimmungg<br />

5. OpenGL: Material und Beleuchtung 13. Geometrische Transformationen<br />

6. OpenGL: Bitmaps, Bilder und Texturen 14. Geometrische Projektionen<br />

7. OpenGL: Effekte, Puffer und Interaktion 15. Mathematische Grundlagen<br />

88. OpenGL: Shading Language Language<br />

Praktikum: OpenGL, C


2<br />

Literatur<br />

• Orlamünder Orlamünder, D.; D ; Mascolus, Mascolus W.: W : Computergrafik und und OpenGL. OpenGL Fachbuchverlag Fachbuchverlag, Leipzig, Leipzig 2004 2004<br />

• Hill, F.: Computer Graphics Using OpenGL. Prentice Hall, Upper Saddle River, 1990<br />

• Shriner, D.; Woo, M.; Neider, J.; Davis, T.: OpenGL Programming Guide. Addison-Wesley, Paris, 2006<br />

• Shriner, D. (Ed.): OpenGL Reference Manual. Addison-Wesley, Munich, 2000<br />

• Burggraf,L.: OpenGL: Der einfache Einstieg in die Schnittstellenprogr. Markt+Technik, München, 2003<br />

• Aperti, M.: OpenGL: Das umfassende Praxis-Handbuch. Mitp, Heidelberg, 2<strong>01</strong>0<br />

• Wright, R.; Haemel, N.; et al.: OpenGL SuperBible. Pearson Education, Boston, 2<strong>01</strong>1<br />

• Shriner Shriner, D.; D ; Woo, Woo M.; M ; Neider, Neider J.; J ; et et al.: al : OpenGL OpenGL Programming Guide. Guide Pearson Pearson Education, Education Boston, Boston 2<strong>01</strong>0 2<strong>01</strong>0<br />

• Rost, R.; et al.: OpenGL Shading Language. Pearson Education, Boston, 2<strong>01</strong>0<br />

• Foley, J.; van Dam, A.; Feiner, S.; Hughes, J.: Computer Graphics. Addison-Wesley, Bonn, 1990<br />

• Encarnacao Encarnacao, J J.; ; Straßer Straßer, W.: W : Graphische Datenverarbeitung 1 und und 2. 2 Oldenbourg Oldenbourg, München, München 1996, 1996 1997 1997<br />

• Bender, M.; Brill, M.: Computergrafik. Hanser, München, 2003<br />

• Nischwitz, A.; Haberäcker, P.: Masterkurs Computergrafik und Bildverarbeitung. Vieweg, Wiesb., 2004<br />

• Vince, J.: Mathematics for Computer Graphics. Springer, London, 2006<br />

Internet: www.opengl.org, www.sgi.com/products/software/opengl<br />

www.computer.org/cga, www.siggraph.org<br />

Tag Tagung: ng: Si Siggraph, h Eurographics<br />

E hi<br />

Zeitschrift: IEEE Computer graphics and applications, ACM Transactions on graphics<br />

Institution: SGI, FhG/IGD, ZGDV, INI-Graphics Net ,GI-ANIS<br />

Die Lehrveranstaltung baut inhaltlich auf obiger Literatur auf.<br />

Verwendung des Skriptes nur für den privaten Gebrauch!


3<br />

1. Einführung g in die<br />

Computergrafik<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziel:<br />

Vermittlung<br />

- nutzbarer Fertigkeiten, computergraphische Softwarekomponenten zu entwickeln<br />

und computergraphische computergraphische Konzepte in in Anwendungssysteme einzubringen<br />

- theoretisch fundierter praxis- und anwendungsorientierter Kenntnisse über<br />

computergraphische Modelle, Verfahren und Systeme<br />

Methodik:<br />

• Wissensvermittlung über Vorlesung<br />

• Demonstration und ÜÜbung<br />

an anwendungsorientierten Beispielen<br />

• Eigene problemorientierte Entwurfs- und Programmiertätigkeit<br />

• Orientierung an allgemeiner Standardliteratur mit Verweis auf Spezialliteratur<br />

• Nutzung von Standardsystemen Standardsystemen (OpenGL)<br />

Schwerpunkt: Generative Computergrafik


4<br />

Geschichte<br />

Vorgeschichte: - Mathematik: Algebra, Geometrie, Numerik, Vektorrechnung<br />

- Zeichen- und Maltechniken<br />

- 350 v.u.Z., 980: Camera Obscura (Aristoteles, Alhazen)<br />

- 1435 1435: ZZentralperspektive l k i (L (L. BB. Alb Alberti) i)<br />

- 1510: Perspektivmaschine (L. da Vinci, A. Dürer)<br />

- Foto, Film, Fernsehen, Kunst<br />

TTriebkraft: i bk f - Hardwareentwicklung<br />

- Einzelfertigung � Serienfertigung � Massenmarkt<br />

1941: Computer als neue technische Basis<br />

1950: Plotter, Kathodenstrahlröhre, Lichtgriffel<br />

1960: Grafikkonzepte, Vektorgrafik<br />

1970: CAD-Systeme in Industrie, firmenspezifisch, einzelne teure Systeme<br />

1980 1980: Schnittstellen und allgemeine Standards<br />

Rastergrafik, massenhafte kostengünstige Systeme<br />

1990: Geräteunabhängige Systeme und Industriestandards<br />

2000: Virtuelle Virtuelle Realität, Realität Realistische Realistische Darstellung, Darstellung Animation Animation<br />

Gegenwart: Vielzahl von Entwicklungs- und Anwendungssystemen<br />

Zukunft: - Grafik als integraler Bestandteil aller nutzerorientierten nutzerorientierten Softwaresysteme<br />

Softwaresysteme<br />

- realistische 3D-Grafik als tragendes Element aller Nutzerschnittstellen<br />

- Liniengrafik � Flächengrafik � Volumengrafik


5<br />

Grundbegriffe<br />

Grafische Datenverarbeitung: Methoden und Techniken zur Konvertierung von Daten<br />

zwischen Computer und grafischen Endgeräten<br />

Teilgebiete:<br />

Computergrafik: realisiert Verfahren zur Produktion und Manipulation von Bildern als<br />

Repräsentanten rechnerinterner Darstellungen zur Visualisierung auf<br />

grafischen Ausgabegeräten<br />

Bildverarbeitung: transformiert natürliche von grafischen Eingabegeräten bereitgestellte<br />

Bilder zu neuen Bildern und wertet sie nach ihren Inhalten und<br />

Bedeutungen aus<br />

Alternative Begriffe:<br />

- computer graphics, image processing<br />

- generative Computergrafik, Bildsynthese<br />

- kkognitive iti Computergrafik, C t fik Bildanalyse Bild l<br />

- Grafiktransformation, Bildbearbeitung<br />

- Computeranimation, Videoverarbeitung


6<br />

Systematisierung der Teilgebiete<br />

Grafische Datenverarbeitung<br />

Bildverarbeitung<br />

GGrafik fi<br />

Objekte<br />

Grafiktransformation<br />

zeitlicher Prozess<br />

Raumstruktur<br />

Bildanalyse Bildsynthese<br />

Bild<br />

Pixel<br />

zeitlicher Prozess<br />

Bildbearbeitung<br />

Matrixstruktur<br />

Computergrafik


7<br />

Generative Computergrafik<br />

Zielobjekt ist der Mensch mit seinen visuellen und manuellen Fähigkeiten:<br />

Verarbeiten und - ebenen und räumlichen Darstellungen<br />

Erzeugen g von - graustufigen g g und farblichen Darstellungen g<br />

- statischen und bewegten Darstellungen<br />

- attributierten Darstellungen<br />

AAusgabekonzepte: b k t Vi Visualisieren, li i Animieren, A i i Schreiben S h ib<br />

Eingabekonzepte: Deuten, Zeigen, Wählen, Benennen<br />

Klassifikation:<br />

Passives System: System erzeugt grafische Darstellungen und übergibt sie dem Nutzer<br />

Aktives System: Nutzer erzeugt grafische Darstellungen und übergibt sie dem System<br />

Interaktives Systeme: wechselseitiges Erzeugen und Verarbeiten von grafischen Darstellungen<br />

Systemkonzept:<br />

y p<br />

Verarbeiten<br />

Nutzer<br />

Erzeugen<br />

Erzeugen<br />

Anwendungs- Grafiksystem<br />

system<br />

Verarbeiten


8<br />

Systemarchitektur<br />

iinteraktive k i generative i grafische fi h Systeme S<br />

Einheitliches Modell (Grundkonfiguration, ( g , Kernsystem) y ) für grafische g Hardware-Software-Systeme y<br />

Nutzer<br />

Anwendungs- GrafikGrafik-<br />

programme software fthhardware<br />

d<br />

Gerätedaten<br />

Grafikdaten<br />

Anwendungsdaten<br />

Mensch<br />

Anwendungsschnittstelle Anwendungsschnittstelle Geräteschnittstelle Nutzerschnittstelle<br />

Auswahlkriterien:<br />

…system<br />

.<br />

.<br />

.<br />

� Auflösung<br />

� Farbe<br />

� Größe<br />

� Geschwindigkeit<br />

Grafik…<br />

.<br />

.<br />

.<br />

� Verfahren<br />

� Interaktion<br />

� Sprache<br />

� Elemente<br />

Anwendungssystem<br />

.<br />

.<br />

.<br />

� Modelle<br />

� Strukturen<br />

� Algorithmen<br />

� Sichten


9<br />

Grafische Datenstrukturen<br />

Anwendungsdaten: Daten zur Repräsentation von Objekten, Beziehungen, Prozessen und<br />

Gesetzmäßigkeiten des Anwendungsbereiches einschließlich topologischer und<br />

geometrischer Daten<br />

Struktur: Frames, Hierarchien, Netze, Topologien, Geometrien<br />

Eigenschaft: Komplexität, Konnektivität, Abstraktionsgrad<br />

Operation: Modellieren, Simulieren, Überwachen, Berechnen, Bewerten<br />

Grafikdaten: primitive und komplexe Objekte zur grafischen Repräsentation mit zugehörigen<br />

Hierarchien, , Eigenschaften g und Operationen p<br />

Struktur: Raster, Vektor; 2D, 3D; Punkt, Linie, Fläche, Volumen, Text<br />

Eigenschaft: Position, Lage, Sichtbarkeit, Farbe, Identifizierbarkeit<br />

OOperation: ti Erzeugen, E Löschen, Lö h Kopieren, K i Transformieren, T f i Modifizieren<br />

M difi i<br />

Gerätedaten: Einheiten zur Ansteuerung der elementaren Funktionen der Gerätetechnik zum<br />

Zwecke der Eingabe und Ausgabe<br />

Struktur: - Vektor mit Richtung und Länge<br />

- Rasterpunkt mit Koordinaten Koordinaten und Farbwert;<br />

- höhere grafische Primitive<br />

Tendenz: Annäherung zwischen Geräte- und Grafikdaten


10<br />

Grafische Programmiersprachen<br />

Grafiksprache: Sprache, die die Bearbeitung, Verarbeitung, Eingabe und Ausgabe<br />

grafischer Daten ermöglicht<br />

Eb Ebene:<br />

RRealisierung: li i<br />

- eigenständige Sprache<br />

- Unterprogrammpaket (Bibliothek)<br />

- SSpracherweiterung h i über b CCompiler il<br />

- Spracherweiterung über Präprozessor<br />

- erweiterbare Sprache<br />

- Maschinensprache<br />

- maschinenorientierte Programmiersprache<br />

- problemorientierte bl i i Programmiersprache i h<br />

- benutzerorientierte Programmiersprache<br />

- Kommandosprache<br />

Software:<br />

- Standards: PHIGS PHIGS, GKS GKS, VRML VRML, X3D<br />

- Industriestandards: OpenGL, DirectX, Direct3D, Java3D<br />

- Systeme: AutoCAD, 3D Studio MAX, IDL<br />

Blender, Cinema 4D, Maya<br />

Autodesk Inventor, Solid Works


11<br />

Grafik-Standards<br />

Grafik-Standard: Festlegung elementarer grafischer Strukturen und zugehöriger Operationen,<br />

dadurch Definition der Schnittstelle zwischen Anwendungssystem und Grafik-System<br />

mit den Zielen Wiederverwendbarkeit, Portabilität und Effizienz<br />

aus: Encarnacao u.a.: Graphische Datenverarbeitung 1, Oldenbourg, 1996


12<br />

Historische Entwicklung<br />

Zeitskala:<br />

Echte Standards: Industrie-Standards Jahr:<br />

-------------------------------------------------------------<br />

GKS 1985<br />

GKS-3D 1987<br />

X11 1987<br />

HOOPS 1987<br />

PHIGS 1988<br />

PEX 1989<br />

OpenInventor 1990<br />

PHIGS+ 1991<br />

OpenGL 1992<br />

DirectX 1995<br />

Mesa3D 1995<br />

Direct3D 1996<br />

VRML 1997<br />

Java3D 1998<br />

OOpenSceneGraph S G h 20<strong>01</strong><br />

SVG 20<strong>01</strong><br />

X3D 2004<br />

OpenGLSL 2004<br />

CUDA 2007<br />

OpenCL 2008


13<br />

Grafische Standards, Normen und Systeme<br />

- GKS: Graphical Kernel System, ISO7942, 1985<br />

- GKS-3D: Graphical Kernel System for Three Dimensions, ISO8805, 1988<br />

- PHIGS: Programmers Hierarchical Interactive Graphics System, ISO9592-1, 1989<br />

- PHIGS PLUS: Erweitertes PHIGS, ISO9592-1, 1992<br />

- X: X-Windows-System, Unix-Arbeitsplätze, 2D, 1986<br />

- PEX: PHIGS Extensions for X-Windows, 3D, 1989<br />

- OpenGL: SGI Graphic Graphic Library, Library 1993 1993<br />

- HOOPS: Hierarchical Object-Oriented Picture System, ITHACA Software, 1991<br />

- GKS-C: Sprachanbindung an Programmiersprache C (analog für Fortran, Pascal, …)<br />

- CGI: Common Graphics Interface, Virtuelle Geräteschnittstelle, ISO9636, 1991<br />

- CGM: Common Graphics Metafile, Bilddaten, ISO8632, 1987<br />

- IGES: Initial Graphics Exchange Specification, Technische Zeichnungen<br />

- VDA-FS: Flächenschnittstelle (D)<br />

- SAT SAT, SET: SET: 3D CAD-Formate CAD Formate (USA (USA, FR) FR)<br />

- DWG, DXF: AutoCAD-Formate<br />

- STEP: Standard for the Exchange of Product Model Data, ISO10303, 1993<br />

- DIRECT3D: 3D-Graphics API for real time<br />

- Java 3D: Klassenbibliothek zur Modellierung und Manipulation von 3D Objekten<br />

- VRML: Virtual Reality Modelling Language, ISO14772-1, 1997<br />

- X3D: Extensible 3D, ISO19775, ISO19776, ISO19777, 2004<br />

- verschiedene Schnittstellenformate Schnittstellenformate im Geometrie-, Geometrie- Bild- und Ausgabebereich<br />

Ausgabebereich<br />

- OPENGL ES, M3G: Mobile Grafik-Standards, 20<strong>01</strong>, 2002<br />

- SVG: Scalable Vector Graphics


14<br />

Grafische Hardware<br />

Hardware:<br />

- Computer, Speicher, Peripherie, Peripherie, Netz<br />

- Grafikkarte (NVIDIA, ATI)<br />

- Drucker, Plotter<br />

- Display, Stereo-Display, Stereobrille,<br />

- HHead-Mounted-Display, d M d Di l PProjektor, j k CCave<br />

- Tastatur, Maus, Lichtstift, Zeichentablett<br />

- Spaceball, Datenhandschuh,


15<br />

Anwendungsgebiete<br />

Bereiche: - Maschinenbau<br />

- Architektur und Bauwesen<br />

- Geoinformation, Kartografie<br />

- Gebrauchs- und Geschäftsgrafik<br />

- Medizin<br />

- Modellierung und Simulation<br />

- PProzessüberwachung üb h<br />

- Unterhaltung und Spiele<br />

- Konstruktion, Entwurf und Design<br />

- wissenschaftlich-technische w sse sc a c ec sc e Visualisierung<br />

V sua s e u g<br />

- Kunst<br />

- Mensch-Maschine-Kommunikation<br />

- Computeranimation, Virtuelle Realität<br />

Kategorien: - technisch<br />

- wissenschaftlich<br />

- institutionell<br />

- wirtschaftlich<br />

- privat


16<br />

2. OpenGL: Struktur und<br />

Programmierung<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Kennenlernen grundlegender Strukturen von OpenGL-Programmen<br />

• Einführung elementarer Zeichenfunktionen<br />

Abschnitte:<br />

Grundlegendes und<br />

einfache Zeichenfunktionen<br />

- Überblick<br />

- Grafik-Bibliotheken<br />

- Realisierung<br />

- Sprachsyntax<br />

- Programmierung<br />

- Zeichnen im Raum<br />

- Punkte, Linien<br />

- Dreiecke Dreiecke, Rechtecke, Rechtecke Polygone Polygone<br />

- Darstellungsattribute<br />

- Funktionsreferenz


17<br />

Überblick<br />

OpenGL Eigenschaften:<br />

- Software Software Interface Interface zu zu grafischer grafischer Hardware Hardware<br />

- portables und effizientes 3D-Grafik- und -Modellierungswerkzeug<br />

- keine Programmiersprache, sondern eine Laufzeitbibliothek<br />

- Industriestandard, 1992 entwickelt aus IRIS GL von Silicon Graphics<br />

- kontrolliert durch Architectural Review Port (ARB)<br />

- Führung durch Industriekonsortium Khronos Group (ATI, NVIDIA, Intel, SGI, Sun)<br />

- Versionen: 1: 1992, 2: 2004, 3: 2008, 4: 2<strong>01</strong>0<br />

- verfügbar für alle bedeutenden bedeutenden Hardware- Hardware-, Betriebs- und Programmiersysteme<br />

Programmiersysteme<br />

OpenGL Arbeitsweise:<br />

• Prozedurales (kein deskriptives) grafisches API<br />

• ca. 220 Befehle (GL + GLU)<br />

• ca. 240 Zustandsvariablen<br />

• arbeitet als Zustandsmaschine (grafische Ausgabe bestimmt sich aus Zustand und Eingabe)<br />

• schrittweise Abarbeitung in einer Pipeline (von Befehlsaufruf bis zur Bildschirmanzeige)<br />

Portabler und offener Industriestandard


18<br />

Grafik-Bibliotheken<br />

GL GL: OOpenGL GL BBasis i Bibliothek Bibli th k (gl.h, ( l h opengl32.dll) l32 dll)<br />

- sämtliche Basisfunktionen und Zustandsvariablen in C<br />

GLU: GLU: OpenGL Utility Library (glu.h, (glu h glu32.dll) glu32 dll)<br />

- auf Basisfunktionen aufsetzende komplexe Funktionen in C<br />

- z.B. Perspektive, Projektion, Polygonzerlegung, Oberflächengestaltung<br />

GLUT GLUT: OOpenGL GL UUtility ili TToolkit lki ( (glut.h, l h glut32.dll) l 32 dll)<br />

- systemunabhängige Funktionen zur Window-Verarbeitung<br />

- z.B. Window-Management, Ereignisbehandlung, 3D-Objekt-Zeichnung<br />

Arbeit be t mit t Display sp ay Callbacks, Ca bac s, Programmen og a e und u d Prozessen o esse<br />

GLX, WGL: spezifische Erweiterungen für Window Systeme:<br />

X Window System, Microsoft Windows<br />

Open Scene Graph, Open Inventor: objektorientierter Werkzeugkasten<br />

- vorgefertigte Objekte und Methoden in C++<br />

- zur Erzeugung Erzeugung interaktiver interaktiver 3D-Grafik-Anwendungen<br />

3D Grafik Anwendungen<br />

Extensions: (noch) nicht standardisierte Erweiterungen<br />

- GL_ARB_..., GL_EXT_..., GL_ATI_..., GL_NV_..., . . .<br />

GLEW, Glee: Verwaltung von Erweiterungen und Kernfunktionen (Testen, Laden, Einbinden)<br />

- plattformübergreifende Unterstützung


19<br />

Versionen<br />

Bibliothek/Version: Jahr: neuer Inhalt:<br />

-----------------------------------------------------------------------------------------------------------------------<br />

OpenGL 1.0 1992 erste Veröffentlichung<br />

1.1 1997 Vertex Arrays, Texture Objects, Polygon Offset<br />

1.2 1998 3D-Texturen, Pixelformate, LOD<br />

1.3 20<strong>01</strong> komprimierte Texturen, Cube-Maps, Multitexturing<br />

11.4 4 2002 Tiefentexturen Tiefentexturen, Mip-Maps Mip Maps, Nebelkoordinaten<br />

1.5 2003 Pufferobjekte, Occlusion Queries<br />

2.0 2004 GLSL 1.1, Multiple Render Targets, große Texturen<br />

2.1 2006 Pixel Buffer Objects, GLSL 1.2, sRGB-Texturen<br />

3.0 2008 GLSL 1.3, Entfernen f von Altlasten, l l keine k i Abwärtskompatibilität<br />

b k ibili<br />

3.1 2009 entfernte Altlasten, über compatibility extension verfügbar,<br />

GLSL 1.4, Uniform Buffer Objects, Primitive Restart, Instancing<br />

3.2 2009 2009 höhere Geschwindigkeit, Geschwindigkeit, verbesserte Darstellungsqualität,<br />

vereinfachte Portierung von Direct3D, GLSL 1.50<br />

3.3 2<strong>01</strong>0 Einbindung von OpenCL, Geometrie-Shader, GLSL 3.3<br />

4.0 2<strong>01</strong>0 Tessellations-Shader, GLSL 4.0<br />

44.1 1 2<strong>01</strong>0 2<strong>01</strong>0 iinäre ä Shader, Sh d höhere höh PPräzision ä i i dder Sh Shader, d GLSL 44.1 1<br />

4.2 2<strong>01</strong>1 atomic counters, image store and load, GLSL 4.2<br />

OpenGLSL 1.x 2004 Programmierbare Vertex- und Fragment-Shader<br />

33.x 2<strong>01</strong>0 PProgrammierbare i b Geometrie-Shader<br />

G i Sh d<br />

4.x 2<strong>01</strong>0 Programmierbare Tesselations-Shader


20<br />

Realisierung<br />

Software- und Hardware-Implementation:<br />

AApplication li ti Program P<br />

Graphics Device Interface Software Rasterizer<br />

OpenGL<br />

Display /Window System Hardware Driver<br />

Rendering g Pipeline: p<br />

Vertex Data Evaluators Vertex Operations Primitive Assembly<br />

Framebuffer<br />

Fragment<br />

Operations<br />

Display List Rasterization<br />

Pixel Data Pixel Operations Texture Assembly


21<br />

Sprachsyntax<br />

Funktionsnamen: glColor3f (x,y,z)<br />

mit Bibliothek, Funktion, Argumentanzahl, Argumenttyp<br />

Variablenamen: GL_COLOR_BUFFER_BIT<br />

mit Bibliothek, Variable<br />

Datentypen: yp<br />

OpenGL-Typ: Suffix: C-Typ: Datentyp:<br />

------------------------------------------------------------------------------------------------------------------------<br />

GLbyte b signed char 8-bit integer<br />

GL GLshort h t s short 16 16-bit bit integer integer<br />

Glint, GLsizei i int, long 32-bit integer<br />

GLfloat, GLclampf f float 32-bit floating-point<br />

GLdouble, GLclampd p d double 64-bit floating-point g p<br />

GLubyte, GLboolean ub unsigned char 8-bit unsigned integer<br />

GLushort us unsigned short 16-bit unsigned integer<br />

GLuint, Glenum, ui unsigned int, unsigned long 32-bit unsigned integer<br />

GLbitfield<br />

Arrays und Pointer: GLshort shorts[10]; glColor3iv(cv); glVertex3fv(vv);<br />

GLdouble *doubles;<br />

Weitere Kürzel: gluPerspective(); GLU_FILL<br />

glutSetColor(); GLUT_RGB


22<br />

Programmierung<br />

Rahmenprogramm:<br />

static void myReshape<br />

(int w,int h)<br />

{glViewport(0,0,w,h);<br />

glMatrixMode(GL_PROJECTION);<br />

glLoadIdentity();<br />

gluOrtho2D(0.0,1.0,0.0,1.0);}<br />

2 0 0 0 0 0 0<br />

#include <br />

# #include /<br />

#include <br />

static void myinit<br />

(void) i<br />

{glClearColor (0.0,0.0,0.0,1.0);}<br />

void main(int argc,char** argv)<br />

{glutInitDisplayMode(GLUT_SINGLE|<br />

GLUT_RGB|GLUT_ALPHA|GLUT_DEPTH);<br />

| | )<br />

glutInitWindowPosition(0,0);<br />

glutInitWindowSize(500,500);<br />

glutInit(&argc,argv);<br />

glutCreateWindow(argv[0]);<br />

l C i d ( [0])<br />

myinit();<br />

glutReshapeFunc(myReshape);<br />

glutDisplayFunc(myDisplay);<br />

glutMainLoop();}<br />

l tM i L () }<br />

static void myDisplay<br />

( (void) id)<br />

{glMatrixMode(GL_MODELVIEW);<br />

glLoadIdentity();<br />

glClear(GL_COLOR_BUFFER_BIT);<br />

glColor3f(1,1,1);<br />

lC l 3f(1 1 1)<br />

glBegin(GL_LINE_LOOP);<br />

glVertex2f(0.25,0.25);<br />

glVertex2f(0.75,0.25);<br />

glVertex2f(0.75,0.75);<br />

lV t 2f(0 75 0 75)<br />

glVertex2f(0.25,0.75);<br />

glEnd();<br />

glFlush();}


23<br />

Funktionsreferenz<br />

GLUT:<br />

glutAddMenuEntry - Erzeugen eines Menü-Eintrages<br />

glutAddSubMenu l tAddS bM - EErzeugen eines i Unter-Menüs<br />

U t M ü<br />

glutAttachMenu - Bindung eines Menüs an eine Maustaste<br />

glutCreateMenu - Erzeugen eines Popup-Menüs<br />

glutCreateWindow g - Erzeugen g eines OpenGL-fähigen p g Fensters<br />

glutDisplayFunc - Setzen der Anzeige Callback Funktion<br />

glutInitDisplayMode - Initialisieren des Anzeigemodus<br />

glutIdleFunc - Setzen der Lehrlauffunktion<br />

glutInit l tI it - IInitialisieren iti li i von GLUT GLUT mit it Argumentübergabe<br />

A tüb b<br />

glutInitWindowPosition - Festlegen der Fensterposition<br />

glutInitWindowSize - Festlegen der Fenstergröße<br />

glutKeyboardFunc g y<br />

- Setzen der Tastatur Callback Funktion<br />

glutMainLoop - Starten der Hauptverarbeitungsschleife<br />

glutMotionFunc - Setzen der Mausbewegung Callback Funktion<br />

glutMouseFunc - Setzen der Mausbutton Callback Funktion<br />

glutReshapeFunc l tR h F - Setzen der der Fensteränderung Callback Funktion<br />

glutPostRedisplay - Aktualisieren des Fensters<br />

glutSpecialFunc - Setzen der Tastatur Callback Funktion für Nicht-ASCII-Zeichen<br />

glutSwapBuffers g p - Übertragen g vom unsichtbaren zum sichtbaren Puffer<br />

glutTimerFunc - Setzen einer Zeit Callback Funktion


24<br />

GLUT:<br />

glutSolid*,glutWire* - Zeichnen von 3D-Objekten als Festkörper oder Drahtgitter<br />

*: Cone,Cube,Sphere,Torus,Teapot,Dodeca-,Icosa-,Octa-,Tetrahedron<br />

glutBitmapCharacter g p - Ausgabe g eines Zeichens an Rasterposition p in Framepuffer p<br />

glutStrokeCharacter - Ausgabe eines Zeichens an Position in Modellbereich<br />

GL:<br />

glMatrixMode - Festlegen der des Matrixmodus<br />

glLoadIdentity - Laden der Einheitsmatrix<br />

glClearColor - Angabe der Hintergrundfarbe<br />

Hintergrundfarbe<br />

glColor - Angabe der Zeichenfarbe<br />

glClear - Löschen des Puffers<br />

glBegin - Beginn grafischer Primitive<br />

glVertex - AAngabe b eines i EEckpunktes k k<br />

glEnd - Ende grafischer Primitive<br />

glFlush - Forcierung der Ausgabe<br />

glViewport - Angabe des Bildschirmbereiches<br />

Bildschirmbereiches<br />

glOrtho - Angabe des Modellbereiches


25<br />

Zeichnen im Raum<br />

Prinzipien: - Aufbau komplexer Objekte aus elementaren Objekten (Punkt, Linie, Polygon, …)<br />

- Arbeit im 3D Modellbereich<br />

- Automatische Transformation in Bildschirmbereich<br />

- RRechte-Hand-Regel h H d R l für fü KKoordinatensystem di undd Rotation R i<br />

Kartesischer Modellbereich (View Volume):<br />

y<br />

glOrtho(left,right,bottom,top,near,far);<br />

3D Eckpunkt (Scheitelpunkt, Vertex):<br />

x<br />

glVertex2(x,y);<br />

glVertex3(x,y,z);<br />

glVertex4(x,y,z,w);<br />

Blickrichtung li k i h<br />

Definition von grafischen Primitiven:<br />

z<br />

glBegin(mode);<br />

glVertex3f(x1,y1,z1);<br />

glVertex3f(x1,y1,z1);<br />

glVertex3f(x2,y2,z2);<br />

glEnd();<br />

Parameter mode steuert Interpretation der Punkte.<br />

nur bestimmte Kommandos zwischen glBegin und glEnd zugelassen


26<br />

Punkte, Linien<br />

Punkte:<br />

glBegin(GL_POINTS);<br />

0 1<br />

2 3<br />

Linien:<br />

glBegin(GL_LINES);<br />

glBegin(GL_LINE_STRIP);<br />

glBegin(GL_LINE_LOOP);<br />

0 1<br />

Beispiele:<br />

2 3<br />

0 1<br />

2 3<br />

glBegin(GL_POINTS);<br />

glVertex3f(0 glVertex3f(0.0,2.0,1.0);<br />

0 2 0 1 0);<br />

glVertex3f(3.0,2.0,1.0);<br />

glVertex3f(1.0,0.0,1.0);<br />

glVertex3f(4.0,0.0,1.0);<br />

glEnd();<br />

0 1<br />

2 3<br />

glBegin(GL_LINES);<br />

for(i=-1.57;i


27<br />

Dreiecke, Rechtecke, Polygone<br />

5<br />

2<br />

1<br />

4 0<br />

3<br />

Dreiecke:<br />

glBegin(GL_TRIANGLES);<br />

glBegin(GL_TRIANGLE_STRIP);<br />

glBegin(GL glBegin(GL_TRIANGLE_FAN);<br />

TRIANGLE FAN);<br />

4<br />

0<br />

5<br />

3<br />

2<br />

Vierecke:<br />

glBegin(GL_QUADS);<br />

glBegin(GL glBegin(GL_QUAD_STRIP);<br />

QUAD STRIP);<br />

1<br />

3<br />

4<br />

2<br />

5<br />

Polygone:<br />

glBegin(GL_POLYGON);<br />

1<br />

0<br />

Zeichenregeln: planar, konvex, nicht schneidend<br />

6<br />

7<br />

3 2<br />

5<br />

0 1 4<br />

6<br />

7<br />

0 2<br />

1 3 4<br />

5<br />

4<br />

3<br />

5<br />

6<br />

2<br />

0<br />

7<br />

1<br />

Beispiele:<br />

glBegin(GL_TRIANGLES);<br />

glVertex2f(0.0,0.0);<br />

glVertex2f(5.0,0.0);<br />

glVertex2f(5.0,0.0);<br />

glVertex2f(2.0,2.0);<br />

glVertex2f(-5.0,0.0);<br />

glVertex2f(-2.0,0.0);<br />

glVertex2f(-7.0,5.0);<br />

glEnd();<br />

Angaben in Modellkoordinaten


28<br />

Darstellungsattribute<br />

Punktgröße: g<br />

glPointSize(size);<br />

Linienbreite:<br />

glLineWidth(width);<br />

g<br />

Linienmuster:<br />

glLineStipple(factor,pattern); (16-Bit-Maske)<br />

PPolygondarstellung: l d t ll<br />

glPolygonMode(face,mode); (GL_FRONT,GL_BACK,<br />

GL_FRONT_AND_BACK;GL_POINT,GL_LINE,GL_FILL)<br />

PPolygonmuster: l t<br />

glPolygonStipple(pBitmap); (32x32-Bit-Maske)<br />

Farbe:<br />

glColor(red glColor(red,green,blue,alpha);<br />

green blue alpha);<br />

glIndex(index);<br />

Setzen von Zustandsvariablen:<br />

glEnable(cap), g p gglDisable(cap) p<br />

cap: GL_LINE_STIPPLE, GL_POLYGON_STIPPLE, GL_POINT_SMOOTH, ...<br />

Erlaubte Kommandos zwischen glBegin und glEnd:<br />

glVertex,glColor,glIndex,glNormal,glTexCoord,glEdgeFlag,<br />

g ,g ,g ,g ,g ,g g g,<br />

glMaterial,glArrayElement,glEvalCoord,glEvalPoint,<br />

glCallList,glCallLists<br />

Angaben in Bildschirmkoordinaten


29<br />

Farbe als Attribut<br />

Wertebereich:<br />

Suffix Minimalwert Abbildung Maximalwert Abbildung<br />

--------------------------------------------------------------------------------------------------------ff,<br />

d 0.0 0.0 1.0 1.0<br />

b -128 -1.0 127 1.0<br />

s -32768 -1.0 32767 1.0<br />

i -2147483648 2147483648 -1.0 1.0 2147483647 1.0<br />

ub 0 0.0 255 1.0<br />

us 0 0.0 65535 1.0<br />

ui 0 0.0 4294967295 1.0<br />

Darstellungsmodus:<br />

Übernahme der aktuellen Zeichenfarbe des Eckpunktes p bei nicht eingeschalteter g Beleuchtung g<br />

- geglättet: interpolierte Färbung eines Primitives glShadeModel(GL_SMOOTH);<br />

- Punkt: konstante Farbe<br />

- Linie: Interpolation der Farben der Eckpunkte<br />

- Fläche: Interpolation der der Farben der der Eckpunkte Eckpunkte<br />

- flach: einheitliche Färbung eines Primitives glShadeModel(GL_FLAT);<br />

- Punkt: konstante Farbe<br />

- Linie: Farbe des jeweils j letzten Eckpunktes p<br />

- Fläche: bei einzelnem Polygon Farbe des ersten Eckpunktes,<br />

sonst Farbe des jeweils letzten Eckpunktes


31<br />

Funktionsreferenz<br />

glBegin - Beginn der Gruppe von Eckpunkten für ein grafisches Primitiv<br />

glEnd - Ende der Gruppe von Eckpunkten für ein grafisches Primitiv<br />

Mode: Mode: GL GL_POINTS, POINTS GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP<br />

GL LINES GL LINE STRIP GL LINE LOOP<br />

GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN<br />

GL_QUADS,GL_QUAD_STRIP, GL_POLYGON<br />

glCullFace - Nichtzeichnen der der Vorder Vorder- oder Rückseite des des Polygons<br />

glColor - Setzen der Zeichenfarbe über RGBA<br />

glDisable - Rücknahme einer Fähigkeit<br />

glEdgeFlag - Darstellung von Grenz- oder inneren Flächen<br />

glEnable - Erlauben einer Fähigkeit<br />

glFrontFace - Festlegen der Polygonvorderseite<br />

glGetPolygonStipple - Liefern des aktuellen Polygonmusters<br />

glIndex - Setzen der der Zeichenfarbe über über Index Index<br />

glLineStipple - Setzen des Musters für das Linienzeichnen<br />

glLineWidth - Setzen der Linienbreite<br />

glPointParameter - Setzen von Texturkoordinaten für Point Sprites<br />

glPointSize - Setzen der Punktgröße<br />

glPolygonMode - Setzen des Darstellungs-Modus für das Polygonzeichnen<br />

glPolygonStipple - Setzen des Musters für das Polygonzeichnen<br />

glShadeModel - Festlegen der der Art der der Färbung Färbung von von Primitiven<br />

glVertex - Angabe der Koordinaten eines Eckpunktes


32<br />

3. OpenGL: p Ansicht und<br />

Transformation<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Strukturen und Operationen für das Arbeiten im Raum<br />

• Geometrie des 3D- und 2D-Raumes<br />

• Grundlegende komplexe komplexe Datenstrukturen und und deren Operationen<br />

Abschnitte:<br />

- Motivation<br />

- Transformationen<br />

- Modelle<br />

- Projektionen<br />

- Viewports<br />

- Matrizen<br />

- Displaylisten<br />

- Vertex Arrays Arbeit mit grafischen Daten im Raum


33<br />

Motivation<br />

Aufgabe: - geometrische Beschreibung der räumlichen Welt<br />

- BBetrachtung t ht der d Welt W lt vom Standpunkt St d kt eines i Betrachters B t ht<br />

- Festlegung eines sichtbaren Ausschnittes der Welt<br />

- Überführung des Ausschnittes in ein Bild<br />

- Formatierung g des Bildes zur Ausgabe g auf ein Medium<br />

� Pipeline durchzuführender Transformationen<br />

PProblem: bl - unterschiedliche t hi dli h Größen G öß der d einzelnen i l Bereiche B i h<br />

- unterschiedliche Dimensionalität der Bereiche<br />

- unterschiedliche Darstellung der Objekte<br />

Start: - Menge von Scheitelpunkten der räumlichen Welt<br />

Zi Ziel: l - MMenge von Pi Pixelwerten l t des d Ausgabemediums<br />

A b di


34<br />

Transformationen<br />

Kameraanalogie:<br />

Modell Ansicht Clip-Bereich Viewport Fenster<br />

Transformationspipeline:<br />

Modellansichts- Projektions- j<br />

Perspektivische p<br />

Viewport- p<br />

matrix<br />

matrix<br />

Teilung<br />

Transformation<br />

Objekt- Augpunkt- Clip- Normalisierte Fenster-<br />

Koordinaten<br />

koordinaten koordinaten Gerätekoordinaten Koordinaten<br />

(x,y,z)<br />

(x,y,z)


35<br />

Verwendung von Vektoren und Matrizen<br />

Prinzip: - Open GL arbeitet extern mit 2D- oder 3D-Datenstrukturen bzw. -Operationen<br />

- intern werden generell homogene Koordinaten verwendet<br />

- dadurch alle Operationen Operationen über Multiplikationen ausführbar ausführbar<br />

� - Operationen können mit 2D- oder 3D-Parametern aufgerufen werden<br />

- Matrizen müssen explizit als 4D-Datenstrukturen angegeben werden<br />

Vektoren: v= (x,y,z,w) T Operationen: v' = M v<br />

Matrizen: M = m<strong>01</strong> m05 m09 m13 m02 m06 m10 m14 m03 m07 m11 m15 m m04 m m08 m m12 m m16 Umwandlung: v= (x,y,z) T � v= (x,y,z,1) T<br />

v= (x,y) T � v= (x,y,0,1) T<br />

( ,y) ( ,y, , )<br />

Operationen: alle geometrischen Operationen (Transformationen und Projektionen)<br />

werden in homogenen Koordinaten über die Multiplikation von<br />

MMatrizen t i undd Vektoren V kt ausgeführt<br />

füh t


36<br />

Modell- und Ansichts-Transformationen<br />

Prinzip: - Modell- und Ansichts-Transformationen in einer Matrix festgelegt: GL_MODELVIEW<br />

- schließt die Bewegung von Objekten und Kamera ein<br />

- Sicht: festes Weltkoordinatensystem (WKS) mit bewegten Objekten oder<br />

- Alt Alternative ti Sicht: Si ht Bewegung B des d Ansichtskoordinatensystems A i ht k di t t (AKS) mit it festen f t Objekten Obj kt<br />

Modelltransformation: Position und Orientierung von Objekten im Weltkoordinatensystem WKS<br />

glTranslate(x,y,z) - Verschiebung von Objekten um einen Vektor<br />

glRotate(angle,x,y,z) - Drehung von Objekten mit einem Winkel um einen Vektor<br />

glScale(x,y,z) - Skalieren von Objekten um Faktoren entlang der Achsen<br />

Ansichtstransformation: Position und Orientierung des Ansichtspunktes im WKS<br />

gluLookAt(eyex gluLookAt(eyex,eyey,eyez, eyey eyez - Festlegen des des Ansichtsstandpunktes,<br />

Ansichtsstandpunktes<br />

centerx,centery,centerz, des Ansichtszielpunktes und<br />

upx,upy,upz) der Ansichtsobenausrichtung<br />

(0.0,0.0,0.0, 0.0,0.0,-1.0, 0.0,1.0,0.0) - Initialwerte<br />

(Ausführung in umgekehrter Reihenfolge)<br />

Beispiel: glMatrixMode(GL_MODELVIEW);<br />

glLoadIdentity();<br />

glTranslatef(10 glTranslatef(10.0,0.0,0.0);<br />

0 0 0 0 0);<br />

glRotatef(-30.0,0.0,0.0,1.0);<br />

glScalef(2.0,0.5,2.0);


37<br />

Projektions-Transformationen<br />

Projektions-Transformation: Festlegung des 2D- oder 3D-Bereiches im Ansichtskoordinatensystem<br />

AKS<br />

Prinzip: Prinzip: - Projektions-Transformationen Projektions Transformationen in einer Matrix Matrix definiert: GL GL_PROJECTION<br />

PROJECTION<br />

- mit Festlegung eines Projektionsverfahrens<br />

- mit Festlegung des betrachteten räumlichen Bereiches<br />

gluOrtho2D(left,right,bottom,top) - orthogonale Projektion 2D 2D<br />

glOrtho(left,right,bottom,top,near,far) - orthogonale Projektion 3D<br />

glFrustum(left,right,bottom,top,near,far) - perspektivische Projektion 3D<br />

gluPerspective(fovy,aspect,near,far) - perspektivische Projektion 3D<br />

right<br />

top<br />

left<br />

bottom<br />

near<br />

top<br />

right<br />

top<br />

right<br />

left<br />

left<br />

bottom<br />

bottom<br />

far<br />

near<br />

far<br />

fovy<br />

w<br />

h<br />

near<br />

aspect=w/h<br />

Beispiel:<br />

glMatrixMode(GL_PROJECTION);<br />

glLoadIdentity();<br />

glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);<br />

far


38<br />

Viewport-Transformationen<br />

Viewport-Transformation: Festlegung des 2D Darstellungsbereiches im Fensterkoordinatensystem<br />

FKS<br />

Prinzip: - Ausgangspunkt sind normierte Projektionskoordinaten<br />

- Viewport-Transformationen erzeugen geräte- und fensterunabhängige Koordinaten<br />

- es entsteht ein 2D Bild mit x- und y-Pixelkoordinaten<br />

- zz-Koordinaten Koordinaten im Bereich zwischen zwischen 0.0 0 0 und und 1.0 1 0 im Tiefenpuffer Tiefenpuffer verfügbar verfügbar<br />

- Position und Größe in Pixelkoordinaten<br />

- Ergebnis wird an Fenstersystem weitergegeben<br />

- Größenverhältnis ist dem Clip-Bereich p anzupassen p<br />

- Größe ist dem Fenster anzupassen<br />

- Defaultwerte: gesamter Fensterbereich<br />

glViewport(x,y,width,height) - Transformation in rechteckigen Bereich eines Fensters<br />

glDepthRange(near,far) - Festlegen des Bereiches für die z-Koordinaten<br />

y<br />

Beispiel:<br />

gluPerspective(30,2.0,20,50);<br />

glViewport(0,0,400,200);<br />

glViewport(400,200,100,100); x


39<br />

Manipulation und Verwaltung von Matrizen<br />

Matrizen-Manipulation: Operationen zur direkten Beeinflussung der Transformationsmatrizen<br />

Prinzip: Prinzip: - Definition Definition, Änderung Änderung und und Verwendung von Matrizen<br />

- 4 x 4 Elemente spaltenweise von links nach rechts und von oben nach unten angeben<br />

Operationen:<br />

glLoadIdentity() lL dId tit () - EErsetzen t der d aktuellen kt ll Matrix M t i durch d h die di Einheitsmatrix<br />

Ei h it t i<br />

glLoadMatrix(m) - Ersetzen der aktuellen Matrix durch eine spezifizierte Matrix<br />

glMultMatrix(m) - Multiplikation der aktuellen Matrix mit einer spezifizierten Matrix<br />

Matrizen-Stapel: Verwaltung von Matrizen in einem Stapel zur Speicherung von Zuständen bei<br />

hierarchischen Programmstrukturen<br />

Prinzip: - Es existieren 3 Stapel:<br />

Modellierungs-, Projektions- und Textur-Matrizenstapel<br />

- Stapelhöhe: Modellierung: Modellierung: >=32, 32, Projektion: >=2, 2, Textur: >=22<br />

Operationen:<br />

glMatrixMode(mode) - Festlegung des aktuellen Matrizen-Stapels<br />

(GL ( _ MODELVIEW, , GL_ PROJECTION, , GL_ TEXTURE) )<br />

glPushMatrix() - Ablegen der aktuellen Matrix auf den Matrizen-Stapel<br />

glPopMatrix() - Entnehmen der obersten Matrix des Matrizen-Stapels<br />

als aktuelle Matrix


40<br />

Anmerkungen:<br />

- Verwendung g unterschiedlicher Koordinatensysteme y und Matrizen für<br />

- Modell- und Ansichtspunkt-Transformation � WKS, Modellmatix<br />

- Projektions-Transformation � AKS, Projektionsmatrix<br />

- Viewport-Transformation � FKS, ---<br />

- Typische Typische Aufrufstellen von von<br />

- Modell- und Ansichtspunkt-Transformation � display()<br />

- Projektions-Transformation � reshape()<br />

- Viewport-Transformation p � reshape() p ()<br />

- Reihenfolge von Operationen ist wesentlich.<br />

- Verkettung mehrerer Transformationen in einer Matrix<br />

- Sequenz von Transformationen bedeutet<br />

inverse Sequenz der Matrizenoperationen<br />

Matrizenoperationen<br />

Fragen bei leerem Bildschirm:<br />

- Farben von Objekten und Hintergrund?<br />

- Position und Größe der Objekte?<br />

- Position und Ausrichtung des Ansichtspunktes?<br />

- Objekte innerhalb des Sichtvolumens?<br />

- Reihenfolge der der Transformationsoperationen?<br />

Transformationsoperationen?<br />

- Position und Größe des Viewports?


41<br />

Funktionsreferenz<br />

glClipPlane - Ebene zur weiteren Beschränkung des Modellbereiches<br />

glGetClipPlane - Liefert Koeffizienten einer Beschränkungsebene<br />

glDepthRange - Kodierungsbereich für z-Koordinaten bei Viewport-Transformation<br />

glFrustum glFrustum - Perspektivischer Projektionsbereich mit mit Clip Clip-Ebenen Ebenen<br />

glLoadIdentity - Initialisierung der aktuellen Matrix<br />

glLoadMatrix - Setzen der aktuellen Matrix<br />

glMatrixMode - Auswahl der aktuellen Matrix (des ( aktuellen Matrizen-Stapels) p )<br />

glMultMatrix - Multiplikationder aktuellen Matrix mit einer Matrix<br />

glOrtho - Orthogonaler Projektionsbereich<br />

glPopMatrix - Entfernen der obersten Matrix vom Matrizen-Stapel<br />

glPushMatrix - Ablegen der aktuellen aktuellen Matrix auf auf den den Matrizen-Stapel<br />

Matrizen Stapel<br />

glRotate - Rotation<br />

glScale - Skalierung<br />

glTranslate - Translation<br />

glViewport - Viewport-Transformation<br />

gluLookAt - Ansichtspunkt und -ziel<br />

gluOrtho2D - Zweidimensionaler orthogonaler orthogonaler Projektionsbereich<br />

gluPerspective - Perspektivischer Projektionsbereich mit Winkel und Verhältnis<br />

gluPickMatrix - Zeichenbeschränkung auf dem Bildschirm<br />

gluProject - Abbildung von Objekt- in Fensterkoordinaten<br />

gluUnProject - Abbildung von Fenster- in Objektkoordinaten


43<br />

Displaylisten<br />

Displayliste: Zusammenfassung mehrerer OpenGL-Operationen zur späteren mehrfachen Ausführung<br />

Prinzip: - Displaylisten werden durch eine Nummer identifiziert<br />

- Aufbau hierarchischer Listen über Listenaufruf in Listendefinition<br />

- automatisches Generieren von freien Listennummern möglich<br />

Operationen: p<br />

glNewList(list,mode) - Definition einer neuen Liste mit einer ganzen Zahl größer 0 und<br />

einem Modus (GL_COMPILE, GL_COMPILE_AND_EXECUTE)<br />

glEndList() - Ende der Listendefinition<br />

glCallList(list) - Aufruf einer definierten Liste<br />

glCallLists(n,type,*lists) - Ausführen mehrerer Listen<br />

glGenLists(range) - Bereitstellung von mehreren Listennummern<br />

glDeleteLists(list glDeleteLists(list,range) range) - Löschen mehrerer Listen Listen<br />

nicht in Displaylisten erlaubte Operationen: glColorPointer, glDeleteLists, glFinish, glDisableClientState,<br />

glEdgeFlagPointer, glEnableClientState, glFeedbackBuffer, glFlush, glGenLists, glGet*, glIndexPointer,<br />

glInterleavedArrays, lI t l dA glIsEnabled, lI E bl d glIsList, lI Li t glNormalPointer, lN lP i t glPixelStore, lPi lSt glReadPixels, lR dPi l glRenderMode,<br />

lR d M d<br />

glSelectBuffer, glTexCoordPointer, glVertexPointer<br />

Beispiel:<br />

glNewList(1,GL_COMPILE);<br />

i<br />

glBegin(GL_POINTS); glVertex2f(0.2,0.2); glEnd();<br />

glEndList(); glCallList(1);


44<br />

Vertex Arrays<br />

Vertex Array: effiziente Verwaltung von Vertex-Daten in mehrdimensionalen Feldern<br />

Prinzip: Prinzip: - 1. Möglichkeit: Organisation von von Parameterdaten unabhängig unabhängig von von OpenGL OpenGL<br />

und Nutzung dieser in OpenGL-Operationen<br />

- 2. Möglichkeit: Nutzung spezieller OpenGL-Operationen<br />

Operationen:<br />

Operationen:<br />

glEnableClientState(array) - Zulassen eines Arraytyps (GL_VERTEX_ARRAY;<br />

für VERTEX auch COLOR, INDEX, NORMAL, TEXTURE_COORD, EDGE_FLAG)<br />

glDisableClientState(array) - Nichtzulassen eines Arraytyps<br />

glVertexPointer(size,type,stride,pointer) l i i i i - DDefinition fi i i eines i Arrays A mit i Punkten P k<br />

glArrayElement(index) - Verwendung eines einzelnen Arrayelements<br />

glDrawArrays(mode,first,count) - Sequenz von Primitiven mit Arrayelementen<br />

glDrawElements(mode,count,type,pointer) g a e e ts( ode,cou t,type,po te ) - Sequenz Seque von vo Primitiven t ve mit t Indexliste de ste<br />

Glfloat Corners[];<br />

Glubyte y Indexes[]; []<br />

glEnableClientState(<br />

GL_VERTEX_ARRAY);<br />

glVertexPointer(3,GL_FLOAT,<br />

00,Corners); C )<br />

glDrawElements(GL_QUADS,24,<br />

GL_UNSIGNED_BYTE,Indexes);<br />

Beispiele:<br />

Glfloat *Data;<br />

glEnableClientState(GL glEnableClientState(GL_VERTEX_ARRAY);<br />

VERTEX ARRAY);<br />

glVertexPointer(3,GL_FLOAT,0,Data);<br />

glBegin(GL_TRIANGLES);<br />

for(i=0;i


45<br />

Programmbeispiele<br />

Gluint Tisch,Tasse,Uhr,Lampe,Licht,Bild;<br />

Tisch=glGenLists(1);<br />

Tasse=glGenLists(1);<br />

glCallList(Tisch);<br />

glPushMatrix();<br />

glScalef(0.6,0.6,0.0);<br />

g<br />

Uhr=glGenLists(1);<br />

Lampe=glGenLists(1);<br />

Bild=glGenLists(1);<br />

g<br />

glTranslatef(200,134,0);<br />

glCallList(Tasse);<br />

glPopMatrix();<br />

glPushMatrix();<br />

glNewList(Bild,GL_COMPILE);<br />

glBegin(GL_POLYGON);<br />

glColor3f(0.0,1.0,0.0);<br />

glLineWidth(2);<br />

glTranslatef(150,150,0);<br />

glCallList(Uhr);<br />

glPopMatrix();<br />

glPushMatrix();<br />

glVertex2f(0,0);<br />

glVertex2f(15,0);<br />

glVertex2f(15,10);<br />

glVertex2f(8,6);<br />

glTranslatef(50,88,0);<br />

glutWireTeapot(10);<br />

glPopMatrix();<br />

glPushMatrix();<br />

glVertex2f(2,8);<br />

glVertex2f(0,12);<br />

glEnd();<br />

glEndList();<br />

glTranslatef(90,160,0);<br />

glScalef(2.6,2.6,0.0);<br />

glCallList(Lampe);<br />

glPopMatrix();<br />

…<br />

glMatrixMode(GL_MODELVIEW);<br />

glLoadIdentity();<br />

glPushMatrix();<br />

glTranslatef(40,120,0);<br />

glRotatef(8,0,0,1);<br />

glScalef(1.6,1.6,0.0);<br />

glCallList(Bild);<br />

glPopMatrix();


46<br />

Funktionsreferenz<br />

glNewList - Beginn der Erzeugung oder Ersetzung einer Displayliste<br />

glEndList - Beenden der Displayliste<br />

glDeleteLists - Löschen einer Folge von Displaylisten<br />

glCallList - Ausführen einer Displayliste<br />

glCallLists - Ausführen mehrerer Displaylisten<br />

glGenLists - Erzeugen einer Folge leerer Displaylisten<br />

glIsList - Test auf Displayliste<br />

glListBase - Festlegen eines Offsets für alle Displaylisten<br />

glArrayElement - Verwendung eines einzelnen Arrayelements<br />

glDrawArrays - Zeichnen einer Sequenz von Primitiven mit Arrayelementen<br />

glDisableClientState - Nichtzulassen eines Arraytyps<br />

glEnableClientState - Zulassen eines Arraytyps<br />

glColorPointer - Definieren eines eines Vektors Vektors von Farbdaten<br />

glDrawElements - Zeichnen einer Sequenz von Primitiven mit Indexliste<br />

glDrawRangeElements - Zeichnen einer Folge von Primitiven eines Arrays<br />

glMultiDrawElements - Zeichnen mehrerer Sequenzen von Primitiven mit Indexliste<br />

glEdgeFlagPointer - Definition eines Arrays von Knotenflags<br />

glIndexPointer - Definition eines Arrays aus Farbindexwerten<br />

glInterleavedArrays - Zulassen von gleichzeitig mehreren Arraytypen<br />

glNormalPointer - Definition eines Arrays Arrays von von Normalen<br />

glTexCoordPointer - Definition eines Arrays von Texturkoordinaten<br />

glVertexPointer - Definition eines Arrays von Scheitelpunkten


47<br />

4. OpenGL: p Kurven und Flächen<br />

Prof Prof. Dr.-Ing. Dr -Ing habil. habil Wolfgang Oertel<br />

Ziele:<br />

• Darstellung komplexer polygonaler Flächen<br />

• Darstellung gekrümmter Kurven und Flächen<br />

Abschnitte:<br />

- Tessellatoren<br />

- Quadriken Q<br />

- Evaluatoren<br />

- NURBS<br />

Komplexe und gekrümmte Kurven und Flächen


48<br />

Tessellatoren<br />

TTessellatoren: ll Verfahren zur Unterteilung allgemeiner Polygone in einfache konvexe Polygone<br />

Problem: OpenGL rendert nur einfache konvexe Polygone<br />

Ei Einfache f h Polygone: P l kkein i SSchneiden h id von Kanten, K t keine k i doppelten d lt Kanten, K t nur 2 Kanten K t pro Knoten K t<br />

Allgemeine Polygone: …<br />

Lösung: Überführung von Polygonen<br />

iin Kombinationen K bi ti von Dreiecken, D i k<br />

Netzen, Fächern und Linien<br />

1. Erzeugen eines Tessellations-Objektes:<br />

Tessellations Objektes:<br />

gluNewTess() liefert Pointer zu einem neuen Tessellations-Objekt<br />

2. Registrierung von Callback-Funktionen:<br />

gluTessCallback(*tessobj,type,(*fn)())<br />

tessobj: erzeugtes Tessellations-Objekt<br />

type: GLU_TESS_# oder GLU_TESS_#_DATA mit<br />

#: BEGIN, EDGE EDGE_FLAG, FLAG, VERTEX, VERTEX, END, END, COMBINE, COMBINE, ERROR, ERROR,<br />

fn: zu definierende Tessellations-Funktion<br />

Mehrfacher Aufruf erforderlich (gegebenenfalls ohne Parameter)<br />

Funktionsprototypen: begin(type), edgeFlag(flag), vertex(*vertex-data),<br />

end(), d() error(errno), ( )<br />

combine(coords[3],*vertex-data[4],weight[4],**outData)<br />

bei DATA-Version zusätzlicher Parameter *user-data


49<br />

3. Spezifikation von Tessellations-Eigenschaften:<br />

gluTessProperty(*tessobj,property,value)<br />

property: t GLU_TESS_BOUNDARY_ONLY AAussetzen t der d TTessellation ll ti<br />

GLU_TESSTOLERANCE Abstand für Verschmelzung<br />

GLU_TESS_WINDING_RULE Festlegung der zu füllenden Außenseite des Polygons<br />

(GLU ( _TESS_WINDING _#<br />

#: ODD, NONZERO, POSITIVE, NEGATIVE, ABS_GEQ_TWO)<br />

gemäß Windungszahl (Anzahl der Umläufe um einen Punkt entgegen Uhrzeigersinn)<br />

gluTessNormal(*tessobj,x,y,z) g ( j, ,y, )<br />

1<br />

Festlegen eines Normalenvektors<br />

1<br />

1<br />

2<br />

1<br />

0<br />

1<br />

1 1<br />

4. . Definition e t o von vo Polygonen: o ygo e :<br />

gluTessBeginPolygon(*tessobj,*user-data) Beginn der Definition<br />

mit Übergabe der Nutzerdaten<br />

gluTessEndPolygon(*tessobj) Ende der Definition<br />

mit it Anwendung A d der d Callback-Funktionen C llb k F kti für fü Erzeugen E undd Rendern R d<br />

gluTessBeginContour(*tessobj) Beginn einer geschlossenen Kontur<br />

gluTessEndContour(*tessobj) Ende einer geschlossenen Kontur<br />

gluTessVertex(*tessobj,coords[3],*vertex-data) g ( j, [ ], ) Eckpunkt p mit Koordinaten<br />

und Daten für Callback-Funktion (z.B. Koordinaten, Normalen, Texturkoordinaten, Farben)<br />

5. Löschen eines Tessellations-Objektes:<br />

gluDeleteTess(*tessobj) l D l t T (*t bj) Lö Löschen h des d Objektes Obj kt und d FFreigabe i b ddes SSpeicherplatzes i h l t<br />

Objekte können für mehrere auch verschiedenartige Polygone verwendet werden


50<br />

Programmbeispiel<br />

GLdouble rect[4][3]={50 rect[4][3]={50.0,50.0,0.0,200.0,50.0,0.0,200.0,200.0,0.0,50.0,200.0,0.0};<br />

0 50 0 0 0 200 0 50 0 0 0 200 0 200 0 0 0 50 0 200 0 0 0};<br />

GLdouble tri[3][3]={75.0,75.0,0.0,125.0,175.0,0.0,175.0,75.0,0.0};<br />

startList=glGenLists(1); tobj=gluNewTess();<br />

gluTessCallback(tobj,GLU_TESS_VERTEX,vertexCallback);<br />

gluTessCallback(tobj gluTessCallback(tobj,GLU_TESS_BEGIN,beginCallback);<br />

GLU TESS BEGIN beginCallback);<br />

gluTessCallback(tobj,GLU_TESS_END,endCallback);<br />

gluTessCallback(tobj,GLU_TESS_COMBINE,combineCallback);<br />

glNewList(startList,GL_COMPILE);<br />

gluTessBeginPolygon(tobj gluTessBeginPolygon(tobj,NULL); NULL);<br />

gluTessBeginContour(tobj);<br />

gluTessVertex(tobj,rect[0],rect[0]);<br />

gluTessVertex(tobj,rect[1],rect[1]);<br />

gluTessVertex(tobj,rect[2],rect[2]);<br />

gluTessVertex(tobj,rect[3],rect[3]);<br />

gluTessEndContour(tobj);<br />

gluTessBeginContour(tobj);<br />

gluTessVertex(tobj,tri[0],tri[0]);<br />

gluTessVertex(tobj,tri[0],tri[0]);<br />

gluTessVertex(tobj,tri[1],tri[1]);<br />

gluTessVertex(tobj,tri[2],tri[2]);<br />

gluTessEndContour(tobj);<br />

gluTessEndPolygon(tobj);<br />

glEndList();<br />

void beginCallback(GLenum which){glBegin(which);}<br />

void endCallback(void){glEnd();}<br />

( ){g ();}<br />

void vertexCallback(GLvoid *vertex){glColor3d(1.0,0.0,1.0);glVertex3dv(vertex);}<br />

void combineCallback(Gldouble coords[3],Gldouble *vertex_data[4],<br />

GLfloat weight[4],GLdouble **dataOut) {. . . *dataOut=newvertex;}


51<br />

Quadriken<br />

QQuadriken: d ik Flächen im 3D Raum, die durch quadratische Gleichungen beschrieben werden können.<br />

Es gibt vordefinierte Objekte und Funktionen zu deren Handhabung.<br />

Vordefinierte Objekte:<br />

Radius<br />

Slices<br />

(Längengrade)<br />

Kugel:<br />

gluSphere(*qobj,radius,slices,stacks)<br />

g p q j, , ,<br />

Erzeugung einer Kugel mit Mittelpunkt bei x=y=z=0<br />

Stacks<br />

(Breitengrade)<br />

baseRadius<br />

topRadius<br />

slices<br />

Zylinder, Kegelstumpf, Kegel:<br />

gl gluCylinder(*qobj,baseRadius,topRadius,<br />

C linder(*qobj baseRadi s topRadi s<br />

height,slices,stacks)<br />

Erzeugung eines offenen Zylinders im positiven Teil der z-Achse<br />

mit Basiskreis in xy-Ebene y und Mittelpunkt p bei x=y=z=0 y<br />

stacks<br />

height<br />

Null Grad<br />

startAngle<br />

outerRadius<br />

sweepAngle<br />

iinnerRadius R di<br />

Scheibe, Scheibensegment:<br />

gluDisk(*qobj,innerRadius,outerRadius,<br />

slices slices,rings) rings)<br />

gluPartialDisk(*qobj,innerRadius,outerRadius,<br />

slices,rings,startAngle,sweepAngle)<br />

Erzeugung g g von Scheibe oder Scheibensegment g in xy-Ebene y mit<br />

Mittelpunkt bei x=y=z=0<br />

slices<br />

rings


52<br />

Vorgehensweise:<br />

1. Erzeugen eines Quardiks:<br />

gluNewQuadric() Bereitstellen eines Pointers auf neue Datenstruktur für Quadrik-Objekt<br />

2. Festlegen Festlegen von Rendering-Attributen:<br />

Rendering Attributen:<br />

gluQuadricDrawStyle(*qobj,drawStyle) Darstellungsart<br />

style: GLU_FILL,GLU_LINE,GLU_POINT,GLU_SILHOUETTE<br />

gluQuadricNormals(*qobj,normals) Art der Flächennormalen (keine, Fläche, Punkt)<br />

normals: l GLU GLU_NONE,GLU_FLAT,GLU_SMOOTH<br />

NONE GLU FLAT GLU SMOOTH<br />

gluQuadricOrientation(*qobj,orientation) Orientierung der Flächennormalen<br />

orientation: GLU_OUTSIDE,GLU_INSIDE<br />

gluQuadricTexture(*qobj,textureCoords) g Q ( q j, ) Bereitstellen von Texturkoordinaten<br />

textureCoords: GL_TRUE,GL_FALSE<br />

3. Einbeziehung vordefinierter Objekte:<br />

gluSphere gluSphere,gluCylinder,gluDisk,gluPartialDisk gluCylinder gluDisk gluPartialDisk als Displayliste<br />

4. Löschen:<br />

gluDeleteQuadric(*qobj) Löschen eines erzeugten Quadrik-Objektes<br />

Beispiel: GLUquadricObj *qobj;<br />

qobj=gluNewQuadric();<br />

gluQuadricDrawStyle(qobj gluQuadricDrawStyle(qobj,GLU_FILL);<br />

GLU FILL);<br />

gluSphere(qobj,0.4,16,16);<br />

gluDeleteQuadric(qobj);


53<br />

Funktionsreferenz<br />

gluNewTess - Erzeugen eines neuen Tessellators<br />

gluTessCallback - Verbinden einer Funktion mit einem Tessellator<br />

gluTessProperty - Setzen eines Eigenschaftswertes eines Tessellators<br />

gluGetTessProperty - Bereitstellen eines eines Eigenschaftswertes Eigenschaftswertes eines eines Tessellators<br />

gluTessNormal - Erzeugen eines Normalenvektors für einen Tessellator<br />

gluTessBeginPolygon - Beginn der Spezifikation eines Polygons zur Tessellation<br />

gluTessEndPolygon - Ende der Spezifikation p eines Polygons yg zur Tessellation<br />

gluTessBeginContour - Beginn der Spezifikation einer Kontur als Polygonteil<br />

gluTessEndContour - Ende der Spezifikation einer Kontur als Polygonteil<br />

gluTessVertex - Spezifikation eines Eckpunktes in der aktuellen Kontur<br />

gluDeleteTess - Löschen eines Tessellators<br />

gluNewQuadric - Erzeugen eines Quadriks<br />

gluDeleteQuadric - Löschen eines Quadriks<br />

gluQuadricCallback - Definieren einer Funktion für Ausnahmefälle<br />

gluQuadricDrawStyle - Steuern des Rendering-Stils für ein Quadrik<br />

gluQuadricOrientation - Steuern der Orientierung der Normalen eines Quadriks<br />

gluQuadricNormals gluQuadricNormals - Definition von von Normalen Normalen eines eines Quadriks<br />

gluQuadricTexture - Generieren von Texturkoordinaten eines Quadriks<br />

gluSphere - Zeichnen einer Kugel<br />

gluCylinder - Zeichnen eines Zylinders<br />

gluDisk - Zeichnen einer Scheibe<br />

gluPartialDisk - Zeichnen einer partiellen Scheibe


54<br />

Evaluatoren<br />

Evaluatoren: Verfahren zur Spezifikation von von Punkten auf auf einer einer in der der Regel Regel gekrümmten gekrümmten Kurve<br />

oder Fläche unter Verwendung von Kontrollpunkten. Die Kontrollpunkte definieren eine<br />

polynomiale oder rationale Bezier-Kurve oder -Fläche.<br />

Evaluatoren können verwendet werden zur Anzeige von Punkten, Linien, Gittern oder Flächen,<br />

zur Berechnung von Normalenvektoren, Farbverläufen oder Texturkoordinaten<br />

11. Definition von Evaluatoren:<br />

Evaluatoren:<br />

glMap1(target,u1,u2,stride,order,*points) 1D Evaluator<br />

glMap2(target,u1,u2,ustride,uorder,v1,v2,vstride,vorder,*points)<br />

2D Evaluator<br />

target: GL_MAP#_VERTEX_3,GL_MAP#_VERTEX_4,GL_MAP#_INDEX,GL_MAP#_COLOR_4,<br />

GL_MAP#_NORMAL,GL_MAP#_TEXTURE_COORD_1,GL_MAP#_TEXTURE_COORD_2,<br />

GL_MAP#_TEXTURE_COORD_3,GL_MAP#_TEXTURE_COORD_4 (#: 1,2)<br />

y y<br />

u=1<br />

u=0<br />

u1 u1, u2 u2, v1 v1, v2: Variablenbereiche<br />

Variablenbereiche<br />

ustride, vstride: Anzahl der Werte für einen<br />

Kontrollpunkt bzw. Abstand zwischen<br />

zwei Kontrollpunkten p<br />

uorder, vorder: Anzahl der Kontrollpunkte<br />

bzw. Ordnung der Kurve (= Grad + 1)<br />

points: Kontrollpunkte<br />

u=0<br />

v=00<br />

x<br />

u=1<br />

z<br />

x<br />

v=1<br />

z


55<br />

2. Zulassen des Evaluators:<br />

glEnable(target) Parameter wie in Punkt 1<br />

3. Berechnung der Zielpunkte:<br />

glEvalCoord1(u) Berechnen eines Punktes der Kurve<br />

u ist beliebiger Wert zwischen u1 und u2<br />

glEvalCoord2(u,v) Berechnen eines Punktes der Fläche<br />

u, v sind beliebige Wert zwischen u1 und u2 bzw. v1 und v2<br />

Verwendung konstanter konstanter Schrittweiten:<br />

Schrittweiten:<br />

glMapGrid1(n,u1,u2) Definition eines Rasters mit n gleichen Schritten von u1 bis u2<br />

glMapGrid2(nu,u1,u2,nv,v1,v2) Definition eines Raster mit nu gleichen Schritten<br />

von u1 bis bis u2 und nv gleichen gleichen Schritten von von v1 v1 bis v2 v2<br />

glEvalMesh1(mode,i1,i2) Berechnen mehrerer Kurvenpunkte<br />

glEvalMesh2(mode,i1,i2,j1,j2) Berechnen mehrerer Flächenpunkte<br />

glEvalPoint1(i1) Berechnen eines eines Kurvenpunktes<br />

glEvalPoint2(i1,j1) Berechnen eines Flächenpunktes<br />

mode: GL_POINT, GL_LINE, GL_FILL<br />

i1, i2, j1, j2: Bereich der darzustellenden Punkte zwischen 0 und nu bzw. 0 und nv<br />

p1<br />

p1<br />

p3<br />

p0 p1<br />

p0<br />

p2<br />

p0 p2


56<br />

Programmbeispiele<br />

GLfloat ctrlPoints[4][3] = {{-4.0,0.0,0.0},{-6.0,4.0,0.0},<br />

{6.0,-4.0,0.0},{4.0,0.0,0.0}};<br />

glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,&ctrlPoints[0][0]);<br />

glEnable(GL_MAP1_VERTEX_3);<br />

glBegin(GL_LINE_STRIP);<br />

for(i=0; i


58<br />

NURBS<br />

NURBS: VVerfahren f h zur BBeschreibung h ib von Kurven K und d Flä Flächen, h die di sich i h durch d h hohe h h Stetigkeit St ti k it undd<br />

lokale Definition bei großer Anzahl von Kontrollpunkten auszeichnen (Non-Uniform Rational B-Splines)<br />

1. Generieren von Flächennormalen:<br />

glEnable(GL_AUTO_NORMAL) Automatisches Generieren<br />

2. Erstellen einer Datenstruktur:<br />

gluNewNurbsRenderer() Bereitstellen eines Pointers auf eine neue Datenstruktur<br />

3. Festlegen von Rendering-Attributen:<br />

gluNurbsProperty(*nobj,property,value) Angabe von Eigenschaften und Werten<br />

GLU_DISPLAY_MODE: _ _ GLU_FILL,GLU_OUTLINE_POLYGON,GLU_OUTLINE_PATCH<br />

_ _ _ _ _<br />

GLU_SAMPLING_METHOD: GLU_PATH_LENGTH,GLU_PARAMETRIC_ERROR<br />

GLU_DOMAIN_DISTANCE<br />

GLU_SAMPLING_TOLERANCE,GLU_PARAMETRIC_TOLERANCE<br />

GLU GLU_U_STEP,GLU_V_STEP<br />

U STEP GLU V STEP<br />

GLU_CULLING,GLU_AUTO_LOAD_MATRIX<br />

4./7. Beginn und Ende der Geometrieerzeugung:<br />

gluBeginCurve(*nobj) Beginn einer Kurve Kurve<br />

gluBeginSurface(*nobj) Beginn einer Fläche<br />

gluEndCurve(*nobj) Ende einer Kurve<br />

gluEndSurface(*nobj) Ende einer Fläche


59<br />

5. Erstellen einer Kurve oder Fläche:<br />

gluNurbsCurve(*nobj,uknotcount,*uknot,ustride,*ctlarray,uorder,type)<br />

gluNurbsSurface(*nobj gluNurbsSurface(*nobj,uknotcount,*uknot,vknotcount,*vknot,ustride,<br />

uknotcount *uknot vknotcount *vknot ustride<br />

vstride,*ctlarray,uorder,vorder,type)<br />

uknotcount Anzahl der Knoten des Knotenvektors<br />

uknot Knotenvektor<br />

ustride Anzahl der Werte für einen Kontrollpunkt<br />

ctlarray Vektor der Kontrollpunkte<br />

uorder Ordnung der Kurve<br />

type Typ der Kontrollpunkte (GL_MAP1_VERTEX_3 (GL MAP1 VERTEX 3 bzw bzw. 4 4, …) )<br />

alle Angaben für v analog, length(ctlarray) = uknot - uorder<br />

6. Herausschneiden von Flächen (optional): ( p )<br />

gluBeginTrim(*nobj) Beginn der Trimmkurve<br />

gluPwlCurve(*nobj,count,*array,stride,type)<br />

Erstellen der Trimmkurve<br />

count Anzahl Anzahl der Punkte der der Kurve<br />

array Punktvektor<br />

stride Anzahl der Werte für einen Punkt<br />

type yp Typ yp der Punkte<br />

(GLU_MAP1_TRIM_2 oder 3)<br />

gluEndTrim(*nobj) Ende der Trimmkurve<br />

Äußere Kurve: Gegenuhrzeigersinn<br />

umfasst gesamte Fläche<br />

Innere Kurve: Uhrzeigersinn<br />

umfasst auszuschneidende Fläche


60<br />

Programmbeispiele<br />

GLfloat ctrlPoints [4][4][3] =<br />

{{{-6,-6,0},{-6,-2,0},{-6,2,0},{-6,6,0}},{{-2,-6,0},{-2,-2,8},...}}<br />

GLfloat knots[8] = {0,0,0,0,1,1,1,1};<br />

GLUnurbsObj *pNurb = NULL;<br />

...<br />

glEnable(GL_AUTO_NORMAL);<br />

pNurb = gluNewNurbsRenderer();<br />

gluNurbsProperty(pNurb,GLU_SAMPLING_TOLERANC,100.0); gluNurbsProperty(pNurb,GLU_DISPLAY_MODE,GLU_FILL);<br />

gluBeginSurface(pNurb);<br />

gluNurbsSurface(pNurb,8,knots,8,knots,4*3,3,&ctrlPoints[0][0][0],4,4,<br />

GL_MAP2_VERTEX3); gluEndSurface(pNurb);<br />

GLfloat outsidePts[5][2] = {{0.0,0.0},{1.0,0.0},{1.0,1.0},{0.0,1.0},{0.0,0.0}};<br />

GLfloat curvePts[4][2] = {{0.25,0.5},{0.25,0.75},{0.75,0.75},{0.75,0.5}};<br />

GLfloat curveKnots[8] = {0,0,0,0,1,1,1,1};<br />

GLfloat pwlPts[3][2] = {{0.75,0.5},{0.5,0.25},{0.25,0.5}};<br />

Innerhalb der NURBS-Fläche:<br />

gluBeginTrim(pNurb);<br />

gluPwlCurve (pNurb,5,&outsidePts[0][0],2,GLU_MAP1_TRIM_2);<br />

gluEndTrim(pNurb);<br />

gluBeginTrim(pNurb);<br />

gluNurbsCurve (pNurb,8,curveKnots,2,&curvePts[0][0],4,GLU_MAP1_TRIM_2);<br />

gluPwlCurve (pNurb,3,&pwlPts[0][0],2,GLU_MAP1_TRIM_2);<br />

gluEndTrim(pNurb);


61<br />

Funktionsreferenz<br />

glMap1/2 / - DDefinition fi i i eines i 1/2D-Evaluators<br />

1/2D E l<br />

glEvalCoord1/2 - Evaluation eines 1/2D-Evaluators<br />

glMapGrid1/2 - Definieren eines 1/2D-Rasters<br />

glEvalMesh1/2 glEvalMesh1/2 - Evaluation eines eines 1/2D 1/2D-Rasters Rasters für für ein Netz<br />

glEvalPoint1/2 - Evaluation eines 1/2D-Rasters für einen Punkt<br />

gluNewNurbsRenderer - Erzeugen eines NURBS<br />

gluDeleteNurbsRenderer - Lö Löschen h eines i NURBS NURBS<br />

gluNurbsProperty - Steuern der Attribute eines NURBS<br />

gluLoadSamplingMatrices - Verwenden spezieller Matrizen für die NURBS-Behandlung<br />

gluGetNurbsProperty gluGetNurbsProperty - Bereitstellen von Attributwerten eines NURBS<br />

gluNurbsCallback - Definition einer NURBS-Funktion zur Ausnahmebehandlung<br />

gluBeginSurface - Beginn der Definition einer Fläche<br />

gluEndSurface - Ende der Definition einer Fläche<br />

gluNurbsSurface l b S f - BBeschreiben h ib dder GGestalt t lt einer i NURBS-Fläche<br />

NURBS Flä h<br />

gluBeginCurve - Beginn der Definition einer Kurve<br />

gluEndCurve - Ende der Definition einer Kurve<br />

gluNurbsCurve g<br />

- Beschreiben der Gestalt einer NURBS-Kurve<br />

gluBeginTrim - Beginn einer Trimm-Kurve<br />

gluEndTrim - Ende einer Trimm-Kurve<br />

gluPwlCurve - Beschreiben der Gestalt einer Trimm-Kurve


62<br />

5. OpenGL: p Material und<br />

Beleuchtung<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Modellierung von Oberflächen<br />

• Modellierung g von Lichtquellen q<br />

• Nachbildung der Wechselwirkung zwischen Beleuchtung und Oberfläche<br />

Ab Abschnitte: h itt<br />

- Farbmodell<br />

- Schattierungsmodell<br />

- Li Lichtquelle h ll<br />

- Material<br />

- Beleuchtungsmodell<br />

- Normalenvektor<br />

- Programmbeispiele<br />

- Funktionsreferenz Material und Licht


63<br />

Farbmodell<br />

Farbmodell: definiert Datenstrukturen und Funktionen für Aufbau und Verwendung von<br />

Farben auf dem Rechner<br />

RGBA RGBA-Modell: Modell: Speicherung von von 3 (optional 4) 4) Werten für für jedes Pixel des des Farbpuffers: Farbpuffers:<br />

Farbwerte Rot, Grün, Blau und Transparenzwert Alpha<br />

Vorteile: Flexibilität, Unterstützung von komplexen Beleuchtungsmodellen, Nebel,<br />

Antialiasing, g Blending g<br />

Farbindex-Modell: Speicherung von 1 Wert für jedes Pixel des Farbpuffers:<br />

Verweis auf Farbeintrag in Farbtabelle<br />

(Farbtabelle vom Fenstersystem verwaltet, Zugriff über GLUT-Befehl)<br />

Vorteil: Animationseffekte, Zeichenebenen, spezielle Anwendungen<br />

Index:<br />

G<br />

Farbwürfel und Farbtabelle:<br />

W<br />

A<br />

R<br />

S<br />

B<br />

Farbpuffer: Speicher, der für jedes Pixel einen Farbwert enthält<br />

- Bildschirmgröße (räumliche (räumliche Auflösung): Auflösung): 640x480 … 1600x1200<br />

- Farbtiefe (radiometrische Auflösung): 4, 8, …, 24 Bit<br />

- Farbkomponentenwerte liegen im Bereich [0.0,1.0] oder [0,255]


64<br />

Befehle zu Arbeit mit Farben im RGBA-Modell:<br />

Initialisieren der Fensterfarbe:<br />

glutInitDisplayMode (GLUT_RGB) oder (GLUT_RGBA) Modus initialisieren<br />

glClear (GL_COLOR_BUFFER_BIT) Puffer löschen<br />

glClearColor (red,green,blue,alpha) Löschfarbe setzen<br />

- Initialisierung: (0,0,0,0)<br />

Setzen Setzen der aktuellen Farbe im im RGBA-Modus:<br />

RGBA Modus:<br />

glColor (red,green,blue,alpha)<br />

- bleibt bis zur Umsetzung erhalten; alpha kann entfallen<br />

- Werte für float (f) in [0.0,1.0], für integer (ub) in [0,255],<br />

auch andere Datentypen möglich: (3,4), (b,d,f,i,s,ub,ui,us)<br />

- 0: minimale Intensität, maximale Transparenz, 1: maximale Intensität, minimale Transparenz<br />

- Initialisierung: (1,1,1,1)<br />

Befehle für Farbindex-Modell:<br />

glutInitDisplayMode (GLUT_INDEX)<br />

glutSetColor (index,red,green,blue)<br />

glClearIndex (index)<br />

glIndex (index)<br />

- Farbindex-Modell sollte nur für Spezialfälle verwendet werden


65<br />

Schattierungsmodell<br />

Schattierungsmodell: legt fest, wie eine ausgewählte Farbe zur Zeichnung der grafischen<br />

Primitive verwendet wird<br />

Zwei Schattierungsarten werden unterstützt:<br />

- flache Schattierung: Verwendung einer Farbe für das gesamte Primitiv<br />

(gemäß eines Punktes im Farbwürfel)<br />

- glatte Schattierung: Schattierung: Interpolation zwischen zwischen den den Farben Farben der der Scheitelpunkte<br />

Scheitelpunkte<br />

(gemäß einer Linie oder Fläche im Farbwürfel)<br />

glShadeModel (mode) Festlegen des Schattierungsmodells<br />

mode: GL GL_FLAT FLAT flache flache Schattierung<br />

GL_SMOOTH glatte Schattierung (initialer Wert)<br />

f1 f2<br />

W<br />

G<br />

G<br />

f2<br />

f1<br />

S R<br />

R<br />

B<br />

B


66<br />

Lichtquelle<br />

Lichtquelle: ist ein Objekt mit bestimmten geometrischen und optischen Charakteristika, das eine<br />

Szene beleuchtet<br />

Lichtquellen Lichtquellen besitzen einen einen Namen Namen und und unterscheiden unterscheiden sich durch: durch:<br />

- Art der Quelle und Ausbreitung des Lichtes (Umgebungs-, Richtungs-, Punkt- und Spotlicht)<br />

- Laterale Abschwächung des Lichtes (Grenzwinkel, exponentiell)<br />

- Longitudinale Abschwächung des Lichtes (konstant, linear, quadratisch)<br />

- AArt dder WWechselwirkung h l i k des d Lichtes Li h (diffus, (diff spiegelnd) i l d)<br />

- Farbe des Lichtes (R,G,B,A)<br />

- Position der Quelle (x,y,z) - Richtung des Lichtes (dx,dy,dz)<br />

Quelle und<br />

Ausbreitung:<br />

Laterale<br />

Abschwächung:<br />

Longitudinale<br />

Abschwächung:<br />

Wechselwirkung:


67<br />

Befehle zur Arbeit mit Lichtquellen:<br />

glEnable (GL_LIGHTING) erlauben von Beleuchtungen<br />

glEnable (GL_LIGHTi) Erzeugen einer Lichtquelle<br />

- mindestens 8 Lichtquellen erlaubt: GL_LIGHTi (0=0, Initial 0<br />

- GL_QUADRATIC_ATTENUATION quadratische Abschwächung des Lichtes, q>=0, Initial 0<br />

1<br />

2<br />

c �<br />

ld � qd


68<br />

Material<br />

Material: legt optische Eigenschaften der Oberfläche eines Polygons fest<br />

Unterstützt Unterstützt werden werden ambiente ambiente, diffuse und spiegelnde Reflexion Reflexion sowie sowie Emission Emission.<br />

glMaterial (face,pname,param) Festlegen von Materialeigenschaften der Oberfläche<br />

- face: GL_FRONT, _ GL_BACK, _ GL_FRONT_AND_BACK<br />

_ _ _<br />

- GL_AMBIENT ambiente Farbe, (r,g,b,a), Initial (0.2,0.2,0.2,1.0)<br />

- GL_DIFFUSE diffuse Farbe, (r,g,b,a), Initial (0.8,0.8,0.8,1.0)<br />

- GL_AMBIENT_AND_DIFFUSE ambiente und diffuse Farbe gleichzeitig, (r,g,b,a)<br />

- GL GL_SPECULAR SPECULAR spiegelnde spiegelnde Farbe Farbe, (r,g,b,a), (r g b a) Initial Initial (0,0,0,1) (0 0 0 1)<br />

- GL_EMISSION Emissionsfarbe, (r,g,b,a), Initial (0,0,0,1)<br />

e<br />

- GL_SHININESS spiegelnder Exponent, e in [0,128], Initial 0<br />

cos ( a)<br />

- GL_COLOR_INDEXES Farbindexe für ambientes, diffuses und spiegelndes Licht, (i,j,k), Initial (0,1,1)<br />

glColorMaterial (face,mode) Übernahme der aktuellen Farbe als Materialfarbe<br />

- face: GL_FRONT, GLBACK, GL_FRONT_AND_BACK<br />

- mode: GL_AMBIENT, GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE, GL_SPECULAR,<br />

GL_EMISSION<br />

- Voraussetzung: glEnable (GL_COLOR_MATERIAL)<br />

glDisable (GL_COLOR_MATERIAL)<br />

glSecondaryColor Explizites Setzen der Sekundärfarbe<br />

glEnable(COLOR_SUM) Addieren der expliziten Sekundärfarbe nach der Texturierung


70<br />

Beleuchtungsmodell<br />

Beleuchtungsmodell: legt allgemeine Beleuchtungsparameter fest<br />

Drei Beleuchtungsarten Beleuchtungsarten werden unterstützt.<br />

Es ist kein globales Beleuchtungsmodell realisiert.<br />

glLightModel (pname,param) Festlegen allgemeiner Beleuchtungsmodellparameter<br />

- GL_LIGHT_MODEL_AMBIENT Umgebungslicht g g der gesamten g Szene, , (r,g,b,a), ( ,g, , ),<br />

Initial (0.2,0.2,0.2,1.0)<br />

- GL_LIGHT_MODEL_LOCAL_VIEWER Berechnungsmodus für spiegelnde Reflexionen, Initial 0,<br />

0: bezüglich Betrachtung in negativer z-Richtung aus unendlicher Entfernung<br />

11: bezüglich b ü li h Betrachtung B h vom Augpunkt A k<br />

- GL_LIGHT_MODEL_TWO_SIDE ein- oder zweiseitige Beleuchtung von Polygonen, Initial 0,<br />

0: nur Vorderseite<br />

1: Vorder- Vorder und Rückseite Rückseite<br />

- GL_LIGHT_MODEL_COLOR_CONTROL Steuerung von Primär- und Sekundärfarben<br />

GL_SINGLE_COLOR: Primäre Farbe enthält alle Bestandteile<br />

GL_SEPARATE_SPECULAR_COLOR: Spiegelnder Farbanteil wird in sekundäre Farbe abgelegt<br />

L B L B


71<br />

Beleuchtungsberechnung:<br />

Farbe eines Punktes ergibt sich aus folgenden Lichtintensitäten getrennt nach R, G, B:<br />

Summe aus:<br />

- Materialemission<br />

- Produkt aus: aus: - Materialumgebungsreflexion<br />

- Szenenumgebungslicht<br />

- Beitrag des Lichtes jeder Lichtquelle<br />

Summe aus:<br />

- Produkt aus: - Materialumgebungsreflexion<br />

- Quellenumgebungslicht<br />

- Produkt aus: - Materialdiffusreflexion<br />

- Quellendiffuslicht<br />

- Produkt aus Flächennormale und Quellenrichtung<br />

- Produkt aus: - Materialspiegelreflexion<br />

- Quellenspiegellicht<br />

- potenziertes Produkt aus Betrachterrichtung und Reflexionsrichtung<br />

Negative Werte werden auf 0 gesetzt<br />

Alle Lichtintensitäten werden multipliziert mit<br />

- richtungsabhängigen Faktoren<br />

- entfernungsabhängigen Faktoren<br />

Resultierende Farbe wird mit Alpha-Wert A der Materialdiffusreflexion multipliziert


72<br />

Normalenvektor<br />

Normalenvektor: Vektor, der in eine Richtung zeigt, die senkrecht zu einer Oberfläche ist<br />

- Normalenvektoren werden für die Eckpunkte p von Primitiven definiert.<br />

- Indirekt können sie einer Fläche zugeordnet werden.<br />

- Sie werden benötigt, um die Berechnung der Beleuchtung durchführen zu können.<br />

- Die Vektoren müssen für die Berechnung normiert vorliegen.<br />

- NNormalisierung li ie manuell ell oder de automatisch t ti h möglich. ö li h<br />

glNormal (nx,ny,nz) Setzen des aktuellen Normalenvektors, Initial: (0,0,1)<br />

glEnable (GL_NORMALIZE) führt eine Normalisierung der Vektoren durch<br />

Berechnung von Normalenvektoren:<br />

Normalenvektor eines Polygons: yg<br />

- Ausgangspunkt: 3 Punkte der Ebene: v1, v2, v3<br />

- Berechnung des Kreuzproduktes [v3-v1] x [v2-v1]<br />

Durchschnittsvektoren mehrerer Polygone:<br />

- AAusgangspunkt: kt VVektoren kt n1, 1 n2, 2 …<br />

- Addieren der Vektoren (ggf. mit Wichtung): n1+n2+…<br />

Normalisierung eines Vektors:<br />

- Ausgangspunkt: g g p Vektor n=(x,y,z) ( ,y, )<br />

- Division jeder Komponente x, y, z durch Länge des<br />

Vektors sqrt(x*x)+(y*y)+(z*z))


73<br />

Programmbeispiele<br />

void main(void){<br />

glutInitDisplayMode(<br />

GLUT_SINGLE|GLUT_RGB);<br />

. . .} }<br />

void reshape(void){<br />

. . .}<br />

void init(void){<br />

glClearColor(0.0,0.0,0.0,0.0);<br />

glShadeModel(GL_SMOOTH);}<br />

void display(void){<br />

p y( ){<br />

glClear(GL_COLOR_BUFFER_BIT);<br />

glBegin(GL_TRIANGLES);<br />

glColor3f(1.0,0.0,0.0); glVertex2f(5.0,5.0);<br />

glColor3f(0.0,1.0,0.0); g ( , , ) g glVertex2f(25.0,5.0);<br />

( , )<br />

glColor3f(0.0,0.0,1.0); glVertex2f(5.0,25.0);<br />

glEnd(); glFlush();}<br />

glBegin(GL_POLYGON);<br />

glNormal3fv(n0);<br />

glVertex3fv(v0);<br />

glNormal3fv(n1);<br />

glVertex3fv(v1);<br />

glNormal3fv(n2);<br />

glVertex3fv(v2);<br />

glNormal3fv(n3);<br />

glVertex3fv(v3);<br />

glEnd();<br />

void init(void){<br />

GLfloat mat_specular[]={1.0,1.0,1.0,1.0};<br />

GLfloat mat_shininess[]={50.0};<br />

GLfloat light_position[]={1.0,1.0,1.0,0.0};<br />

glClearColor(0.0,0.0,0.0,0.0);<br />

g<br />

glShadeModel(GL_SMOOTH);<br />

glMatrixMode(GL_MODELVIEW);<br />

glLoadIdentity();<br />

glMaterialfv(GL g _FRONT,GL_SPECULAR,mat_specular); p<br />

glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);<br />

glLightfv(GL_LIGHT0,GL_POSITION,light_position);<br />

glEnable(GL_LIGHTING);<br />

glEnable(GL_LIGHT0);} void display(void){<br />

glClear(GL_COLOR_BUFFER_BIT);<br />

glutSolidSphere(1.0,20,16); glFlush();}


74<br />

Funktionsreferenz<br />

glClear - Zurücksetzen des Farbpuffers u.a.<br />

glClearColor - Setzen der Fensterlöschfarbe im RGBA-Modus<br />

glClearIndex - Setzen der Fensterlöschfarbe im Farbindex-Modus<br />

glColor - Setzen der aktuellen Farbe im RGBA-Modus<br />

glSecondaryColor - Explizites Setzen der Sekundärfarbe<br />

glColorMask - Erlauben von Veränderungen der Farbkomponenten im Farbpuffer<br />

glColorMaterial - Gestattet als als Materialfarben Materialfarben die aktuelle Farbe zu verwenden verwenden<br />

glCullFace - Angabe der nicht zu berücksichtigenden Seite eines Polygons<br />

glEnable - Erlauben von Farb- und Lichteigenschaften u.a.<br />

glFrontFace - Festlegen der Vorderseite eines Polygons<br />

glGetMaterial - Liefern der aktuellen Materialeigenschaften<br />

glGetLight - Liefern von Informationen über die aktuellen Lichtquellen<br />

glIndex - Setzen der aktuellen Farbe im Farbindex-Modus<br />

glLight - Setzen von Parametern einer Lichtquelle<br />

glLightModel - Festlegen des Beleuchtungsmodells<br />

glMaterial - Festlegen von Materialparametern<br />

glNormal - Festlegen der Flächennormalen<br />

glShadeModel - Festlegen des Schattierungsmodells<br />

glutInitDisplayMode - Festlegen des Farbmodells u.a.<br />

glutSetColor - Laden eines Farbindexes in die Farbtabelle


75<br />

6. OpenGL: p Bitmaps, p , Bilder<br />

und Texturen<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Behandlung von Bitmaps und Bildern<br />

• Abbildung von Texturen auf Objekte<br />

Abschnitte:<br />

- Zeichnen von Bitmaps<br />

- Lesen und Schreiben von Bildern<br />

- Operationsmodi für für Bilder<br />

- Verwenden von Texturobjekten<br />

- Erzeugen von Texturobjekten<br />

- Binden von Farben und Koordinaten<br />

- Programmbeispiele<br />

- Funktionsreferenz Pixel und deren Operationen


76<br />

Zeichnen von Bitmaps<br />

Bitmap: rechteckiges Feld mit binären Werten 1 und 0, das als Zeichenmaske für einen rechteckigen<br />

Fensterbereich dient<br />

Anwendung: Anwendung: Erzeugung von Bildschirmmustern<br />

Darstellung von Zeichen in Fonts<br />

Bildung von Zeichenketten über Displaylisten<br />

Setzen der Rasterposition:<br />

glRasterPos(x,y,z) Festlegung der aktuellen Koordinaten x, y, z<br />

müssen innerhalb des Clipping-Bereiches liegen<br />

Koordinaten wie Scheitelpunkte behandelt (Transformation, Projektion)<br />

Speicherung in GL_CURRENT_RASTER_POSITION (Zugriff mit glGetFloatv())<br />

Zeichnen eines Bitmaps:<br />

glBitmap(width,height,xbo,ybo,xbi,ybi,*bitmap)<br />

Zeichnen eines Bitmap an aktuelle Rasterposition mit Angaben zu<br />

Breite und Höhe des Bitmaps in Pixel<br />

Ursprung im Bitmap in Pixel (von links unten)<br />

Inkrement des Rasters in Pixel bezüglich Rasterposition<br />

Speicherung des Bitmaps in Vielfachen von 8 Bit<br />

Bitmap parallel zur xy-Ebene des Framebuffers gezeichnet<br />

Wert 1: Pixel wird auf aktuelle Rasterfarbe gesetzt<br />

Wert 0: Pixel bleibt unverändert


77<br />

Farbe eines Bitmaps:<br />

glColor() Setzen der der Farbe Farbe für das das Bitmap;<br />

Aufruf vor glRasterPos()<br />

Speicherung in GL_CURRENT_RASTER_COLOR (Zugriff mit glGetFloatv())<br />

Zeichen und Fonts:<br />

Font als Menge von Zeichen mit Zahl und Bitmap<br />

Zeichenketten als Folge von Zeichen<br />

glListBase(base) Festlegen eines Offsets für den Font<br />

glGenLists(range) Erzeugen von Listennummern für Zeichen<br />

glNewList(list mode) Einbinden eines Zeichens eines externen Fonts<br />

glEndList() Beenden der Zeichendefinition<br />

glCallList(list) Zeichnen eines Zeichens<br />

glCallLists(n,type,*lists) Zeichnen einer Zeichenkette<br />

glDeleteLists(list,range) Löschen eines Fonts


78<br />

Lesen und Schreiben von Bildern<br />

Bild: rechteckiges Feld von Pixel, wobei jedes Pixel komplette RGBA-Information enthalten kann<br />

Herkunft von Bildern: - über Scanner oder Kamera digital bereitgestellt<br />

- von anderem Grafikprogramm auf Bildschirm erzeugt<br />

- von Programm im Speicher generiert<br />

Lesen eines Bildes:<br />

glReadPixels(x,y,width,height,format,type,*pixels)<br />

Lesen eines rechteckigen Feldes von Pixel vom Framebuffer zum Speicher<br />

Schreiben eines Bildes:<br />

glDrawPixels(width,height,format,type,*pixels)<br />

Schreiben eines rechteckigen Feldes von Pixel vom Speicher zum Framebuffer an Rasterposition<br />

Kopieren p eines Bildes:<br />

glCopyPixels(x,y,width,height,buffer)<br />

Kopieren eines rechteckigen Feldes von Pixel vom Framebuffer zum Framebuffer an Rasterposition<br />

Format: GL_COLOR_INDEX, GL_RGB, GL_GRBA, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA<br />

GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT<br />

Type: GL_UNSIGNED_BYTE, GL_BYTE<br />

GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT<br />

GL GL_UNSIGNED_INT, UNSIGNED INT GL GL_INT, INT GL GL_FLOAT FLOAT<br />

Buffer: GL_COLOR, GL_DEPTH, GL_STENCIL


79<br />

Operationsmodi für Bilder<br />

Pixel-Speichermodus:<br />

glPixelStore(pname,param)<br />

GL_PACK_SWAP_BYTES, GL_PACK_LSB_FIRST, GL_PACK_ROW_LENGTH,<br />

GL_PACK_SKIP_ROWS, GL_PACK_SKIP_PIXELS, GL_PACK_ALIGNMENT,<br />

analog UNPACK<br />

Pixel-Transferoperationen:<br />

glPixelTransfer(pname,param)<br />

GL_MAP_COLOR, GL_MAP_STENCIL, GL_INDEX_SHIFT, GL_INDEX_OFFSET,<br />

GL GL_RED_SCALE, RED SCALE GL GL_GREEN_SCALE, GREEN SCALE GL GL_BLUE_SCALE, BLUE SCALE GL_ALPHA_SCALE,<br />

GL ALPHA SCALE<br />

GL_DEPTH_SCALE, GL_RED_BIAS, GL_GREEN_BIAS, GL_BLUE_BIAS,<br />

GL_ALPHA_BIAS, GL_DEPTH_BIAS<br />

Pixel Pixel-Mapping: Mapping:<br />

glPixelMap(map,mapsize,*values)<br />

GL_PIXEL_MAP_I_TO_I, … S_TO_S, I_TO_R, I_TO_G, I_TO_B, I_TO_A,<br />

R_TO_R, G_TO_G, B_TO_B, A_TO_A Skalierung:<br />

glPixelZoom(zoomx,zoomy)<br />

Vergrößerung g g und Verkleinerung g (auch ( Spiegelung) p g g)<br />

des Bildes


80<br />

Verarbeitungs-Pipeline:


81<br />

Programmbeispiele<br />

GLubyte rasters[24]={0xc0 rasters[24] {0xc0,0x00,0xc0,0x00,0xc0,0x00,0xc0,0x00,0xc0,0x00,<br />

0x00 0xc0 0x00 0xc0 0x00 0xc0 0x00 0xc0 0x00<br />

0xff,0x00,0xff,0x00,0xc0,0x00,0xc0,0x00,0xc0,0x00,0xff,0xc0,0xff,0xc0};<br />

void init(void){<br />

glPixelStorei(GL_UNPACK_ALIGNMENT,1); glClearColor(0.0,0.0,0.0,0.0);}<br />

void display(void){<br />

glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0);<br />

glRasterPos2i(20,20);<br />

glBitmap(10 glBitmap(10,12,0.0,0.0,11.0,0.0,rasters);<br />

12 0 0 0 0 11 0 0 0 rasters);<br />

glBitmap(10,12,0.0,0.0,0.0,13.0,rasters);<br />

glFlush();}<br />

GLubyte chImage[64][64][3];<br />

void makeChImage(void{<br />

int i,j,c;<br />

for(i=0;i


82<br />

Funktionsreferenz<br />

glBitmap - Zeichnen eines Bitmaps<br />

glCopyPixels - Kopieren von Pixel im Framebuffer<br />

glDrawBuffer glDrawBuffer - Festlegen eines eines Farbpuffers Farbpuffers für für das das Schreiben von Pixel<br />

glDrawPixels - Schreiben eines Blocks von Pixel in den Framebuffer<br />

glGetPixelMap - Bereitstellen eines spezifizierten Pixelmaps<br />

glPixelMap - Definieren von Maps für den Transfer von Pixel<br />

glPixelStore - Festlegen von Modi für das Speichern von Pixel<br />

glPixelTransfer - Festlegen von Modi für den Transfer von Pixel<br />

glPixelZoom - Setzen der Skalierungsfaktoren für Pixel<br />

glRasterPos - Setzen der Koordinaten der aktuellen aktuellen Rasterposition<br />

glReadBuffer - Festlegen eines Farbpuffers für das Lesen von Pixel<br />

glReadPixels - Lesen eines Blocks von Pixel aus dem Frame Buffer


84<br />

Verwenden von Texturobjekten<br />

Textur: ein- oder zweidimensionales Muster, das einem geometrischen Objekt zugeordnet und<br />

mit diesem verändert und angezeigt wird<br />

SSchritte h itt ddes TTexture t MMappings: i<br />

- Erzeugen eines Texturobjektes und Spezifizierung der Textur für das Objekt<br />

- Festlegen, wie die Textur für jedes Pixel anzuwenden ist<br />

- EErlauben l b des d Texture T Mappings M i undd<br />

Zeichnen der Szene mit Textur und geometrischen Koordinaten<br />

Aktivieren des Texture Texture Mappings:<br />

glEnable(GL_TEXTURE_2D)<br />

Aktivierung und Darstellung des Objektes in der Szene<br />

(auch GL GL_TEXTURE_1D)<br />

TEXTURE 1D)


85<br />

Erzeugen von Texturobjekten<br />

Definition eines Texturobjekts:<br />

glTexImage2D(target,level,components,width,height,border,format,<br />

type type,*pixels) *pixels)<br />

target GL_TEXTURE_2D<br />

level Detaillierungsniveau (Mipmap): z.B. 0,1,2,3,4<br />

components Anzahl der Farbkomponenten: z.B. 1,2,3,4<br />

width, height Breite und Höhe des Texture-Image<br />

border Größe des Randbereiches der Texturen (wichtig für weiche Übergänge), z.B. 0<br />

format Format der Pixeldaten, z.B. GL_RGBA<br />

type Datentyp Datentyp des Pixelwertes Pixelwertes, z.B. z B GL GL_UNSIGNED_BYTE<br />

UNSIGNED BYTE<br />

pixels Zeiger auf die Textur-Daten<br />

Festlegen g von Texturparametern:<br />

p<br />

glTexParameter(target,pname,param)<br />

target GL_TEXTURE_2D<br />

GL_TEXTURE_MIN_FILTER Minification-Filter: GL_NEAREST, GL_LINEAR oder<br />

GL_X_MIPMAP_Y mit x, y: LINEAR,NEAREST<br />

(ein Pixel für mehrere Texturelemente)<br />

GL_TEXTURE_MAG_FILTER Magnification-Filter: GL_NEAREST oder GL_LINEAR<br />

(ein Texturelement Texturelement für für mehrere mehrere Pixel)<br />

GL_TEXTURE_WRAP_{S T} Behandlung der S- oder T-Texturkoordinaten außerhalb<br />

des Bereiches 0...1: GL_REPEAT oder GL_CLAMP


86<br />

Bindung von Farben und Koordinaten<br />

Festlegen der Texturumgebung (Farbdarstellung):<br />

glTexEnv(target,pname,param)<br />

target g GL_TEXTURE_ENV GL_TEXTURE_ENV_MODE<br />

GL_MODULATE Texturwerte werden mit Objektwerten multipliziert<br />

GL_DECAL Texturwerte überschreiben Objektwerte (3, 4)<br />

GL GL_BLEND BLEND TTexturwerte t t werden d mit it Farbe F b gemischt i ht (1, (1 2) 2)<br />

GL_TEXTURE_ENV_COLOR Zeiger auf einen RGBA-Wert (1, 2)<br />

abhängig von Anzahl der Textur-Komponenten (1, 2, 3, 4)<br />

target g GL_POINT_SPRITE GL_COORD_REPLACE GL_TRUE Zulassung von Point Sprites<br />

Binden der Texturkoordinaten (manuell):<br />

glTexCoord(coords) (Texturobjektkoordinaten)<br />

1: s-Koordinate (Horizontale)<br />

2: s- Koordinate und t-Koordinate (Vertikale)<br />

3: s- Koordinate, t-Koordinate und r-Koordinate (Tiefe)<br />

4: s- Koordinate, t-Koordinate, r-Koordinate und q-Koordinate (Homogene, Zeit)<br />

glVertex(coords) (Szenenobjektkoordinaten)<br />

x-Koordinate di und d y-Koordinate di<br />

x-Koordinate, y-Koordinate, z-Koordinate


87<br />

Binden der Texturkoordinaten (automatisch):<br />

glTexGen(coord,pname,param) (allgemein für Objekte)<br />

coord: GL_S, GL_T, GL_R oder GL_Q<br />

pname, param:<br />

GGL_TEXTURE_GEN_MODE G O<br />

GL_OBJECT_LINEAR objektabhängige Texturgenerierung aus Vertexkoordinaten<br />

GL_EYE_LINEAR betrachterabhängige Texturgenerierung aus Augpunktkoordinaten<br />

GL_SPHERE_MAP Texturgenierung g g über kugelförmiges g g Umgebungsmapping<br />

g g pp g<br />

GL_OBJECT_PLANE<br />

p1,p2,p3,p4 Ebenendefinition für objektabhängige Texturgenerierung<br />

GL_EYE_PLANE<br />

p1,p2,p3,p4 1 2 3 4 Eb Ebenendefinition d fi iti für fü betrachterabhängige b t ht bhä i Texturgenerierung<br />

T t i<br />

Einschaltung der Generierung für jede Dimension über glEnable(GL_TEXTURE_GEN_S)<br />

gluQuadricTexture(*qobj,textureCoords) g Q ( q j, ) (speziell ( p für Quadrics) Q )<br />

textureCoords: GL_FALSE,GL_TRUE<br />

Arbeit mit Texturobjekten: j<br />

glGenTextures(n,*texNames) Bereitstellen freier Objektnamen<br />

glBindTexture(target,texName) Erzeugen, Aktivieren, Deaktivieren eines Objektes<br />

glDeleteTextures(n,*texNames) Löschen von Texturobjekten j


88<br />

Programmbeispiele<br />

static Glubyte Glubyte chImage[64][64][4];<br />

chImage[64][64][4];<br />

static Gluint texName;<br />

void init(void){<br />

glClearColor(0.0,0.0,0.0,0.0);<br />

glShadeModel(GL_FLAT);<br />

glEnable(GL_DEPTH_TEST);<br />

glPixelStorei(GL_UNPACK_ALIGNMENT,1);<br />

glGenTextures(1,&texName);<br />

glBindTexture(GL_TEXTURE_2D,texName);<br />

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);<br />

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);<br />

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);<br />

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);<br />

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,GL_UNSIGNED_BYTE,<br />

chImage);}<br />

void display(void){<br />

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);<br />

glEnable(GL_TEXTURE_2D);<br />

glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);<br />

glBindTexture(GL glBindTexture(GL_TEXTURE_2D,texName);<br />

TEXTURE 2D texName);<br />

glBegin(GL_QUADS);<br />

glTexCoord2f(0.0,0.0); glVertex3f(-2.0,-1.0,0.0);<br />

glTexCoord2f(0.0,1.0); glVertex3f(-2.0,1.0,0.0);<br />

glTexCoord2f(1 glTexCoord2f(1.0,1.0); 0 1 0); glVertex3f(0 glVertex3f(0.0,1.0,0.0);<br />

0 1 0 0 0);<br />

glTexCoord2f(1.0,0.0); glVertex3f(0.0,-1.0,0.0);<br />

glEnd(); glFlush();<br />

glDisable(GL_TEXTURE_2D);}


89<br />

Funktionsreferenz<br />

glAreTexturesResident - Abragen des Residenzstatus für Texturobjekte<br />

glBindTexture - Binden von Texturnamen an Targets<br />

glCopyTexImage2D - Kopieren eines Bildes aus Framebuffer in 2D Texturobjekt (auch 1D)<br />

glCopyTexSubImage2D - Kopieren eines Teilbildes aus aus Framebuffer Framebuffer in Texturobjekt (auch (auch 1D) 1D)<br />

glDeleteTextures - Löschen von benannten Texturobjekten<br />

glGenTextures - Erzeugen von neuen Namen für Texturobjekte<br />

glGetTexEnv - Bereitstellen von Parametern der Texturumgebung g g<br />

glGetTexGen - Bereitstellen von Parametern der Texturkoordinatengenerierung<br />

glGetTexImage - Bereitstellen eines Texturbildes<br />

glGetTexLevelParameter - Bereitstellen von Texturparametern eines Detaillierungsniveaus<br />

glGetTexParameter - Bereitstellen von von Texturparameterwerten<br />

Texturparameterwerten<br />

glIsTexture - Test, ob Name eine Textur ist<br />

glPrioritizeTextures - Zuweisen von Residenzprioritäten an Texturobjekte<br />

glTexCoord - Setzen der aktuellen Texturkoordinaten<br />

glTexCoordPointer - Definition eines Feldes von Texturkoordinaten<br />

glTexEnv - Setzen von Parametern der Texturumgebung<br />

glTexGen - Steuern der Erzeugung von Texturkoordinaten<br />

glTexImage2D - Spezifikation eines eines 2D 2D Texturbildes Texturbildes (auch (auch 1D)<br />

glTexParameter - Setzen der von Texturparametern<br />

glTexSubImage2D - Spezifikation eines 2D Texturteilbildes (auch 1D)<br />

gluScaleImage - Skalieren eines eines Bildes<br />

gluBuild2DMipmaps - Erzeugen eines 2DMipmaps (auch 1D)<br />

gluQuadricTexture - Spezifikation der Texturierung von Quadrics


90<br />

7. OpenGL: p Effekte, , Puffer und<br />

Interaktion<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Nachbehandlung von erzeugten Grafiken<br />

• Arbeit mit Speicherbereichen<br />

• Steuerung der Interaktion Interaktion mit dem dem Nutzer Nutzer<br />

Abschnitte:<br />

Externe Schnittstelle<br />

- Blending<br />

- Antialiasing<br />

- Fogg<br />

- Pufferstrukturen<br />

- Pufferoperationen<br />

- Accumulation<br />

- SSelection l ti<br />

- Feedback<br />

- OpenGL Zustandsvariablen


91<br />

Blending<br />

Blending: Erzeugen von Transparenz durch Vermischen von unterschiedlichen Farbwerten<br />

Vorgehensweise:<br />

- Verwendung Verwendung von von Alpha Alpha-Werten Werten im RGBA RGBA-Modus Modus<br />

- Zulassen der Vermischung: glEnable(GL_BLEND)<br />

- Definieren der Blendfaktoren für Quelle und Ziel: glBlendFunc(sfactor,dfactor)<br />

Quelle: Farbwert für aktuelles aktuelles Objekt Objekt, Ziel: Ziel: Farbwert Farbwert im Framebuffer<br />

- Setzen von Farben und Zeichnen von Objekten: glColor, glVertex, …<br />

Berechnungsausdruck: (RsSr+RdDr, GsSg+GdDg, BsSb+BdDb, AsSa+AdDa)<br />

BBegrenzung dder Ergebnisse E b i auf f [0,1] [0 1] bzw. b auff Farbwertebereich<br />

F b b i h<br />

Parameterwerte: (sfactor, dfactor) (mit Division durch maximalen Farbwert)<br />

GL_ZERO (0,0,0,0) GL_ONE (1,1,1,1)<br />

GL_DST_COLOR (Rd,Gd,Bd,Ad) GL_SRC_COLOR (Rs,Gs,Bs,As)<br />

GL_ONE_MINUS_DST_COLOR (1,1,1,1)-(Rd,Gd,Bd,Ad) GL_ONE_MINUS_SCR_COLOR (1,1,1,1)-(Rs,Gs,Bs,As)<br />

GL_SRC_ALPHA (As,As,As,As) GL_DST_ALPHA (Ad,Ad,Ad,Ad)<br />

GL_ONE_MINUS_SRC_ALPHA (1,1,1,1)-(As,As,As,As) GL_ONE_MINUS_DST_ALPHA (1,1,1,1)-(Ad,Ad,Ad,Ad)<br />

GL_SRC_ALPHA_SATURATE (min(As,1-Ad),min(As,1-Ad),min(As,1-Ad),1)<br />

R, G, B, A<br />

Quelle (S):<br />

R, G, B, A<br />

Ziel (D):<br />

Beispiele:<br />

- Default: (GL_ONE, GL_ZERO)<br />

- Transparenz: (GL (GL_SRC_ALPHA, SRC ALPHA GL GL_ONE_MINUS_SRC_ALPHA)<br />

ONE MINUS SRC ALPHA)<br />

- Überlagerung zweier oder mehrerer Bilder<br />

- Verwendung von Farbfiltern


92<br />

Antialiasing<br />

Antialiasing: Veränderung der Farbwerte zur Glättung von Punkten, Linien und Polygonen<br />

Vorgehensweise:<br />

- Problem: Problem: Schräge Schräge Linien werden werden wegen wegen der der Rasterung mit Sprüngen Sprüngen angezeigt angezeigt<br />

- Aufgabe: Nutzung der Blending-Technik, um Sprünge sichtbar zu glätten<br />

- Zulassung der Glättung: glEnable(GL_POINT_SMOOTH), glEnable(GL_LINE_SMOOTH),<br />

glEnable(GL_POLYGON_SMOOTH)<br />

- OpenGL speichert den Überdeckungsgrad eines Pixels im zugehörigen Alpha-Wert<br />

- Alpha-Wert kann im Rahmen der Blending-Funktion verwendet werden:<br />

glEnable (GL_BLEND), glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)<br />

- Einfache Alternative: Funktion glHint<br />

- Steuerung des Systemverhaltens: glHint(target,hint)<br />

Verhalten implementationsabhängig<br />

hint: GL GL_FASTES, FASTES GL GL_NICEST, NICEST GL GL_DONT_CARE<br />

DONT CARE<br />

target: GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT, GL_FOG_HINT,<br />

GL_POLYGON_SMOOTH_HINT, GL_PERSPECTIVE_CORRECTION_HINT


93<br />

Fog<br />

Fog: Atmosphärische Effekte durch Abschwächung von Objekten entsprechend ihrer Entfernung<br />

Vorgehensweise:<br />

- Objekte Objekte werden werden mehr mehr und mehr mit Farbe Farbe des Nebels überblendet bis bis zur Unsichtbarkeit<br />

(depth-cuing)<br />

- Vorteile: realistischere und effizientere Darstellung<br />

- Zulassung von Nebel: glEnable(GL_FOG)<br />

- Steuerung des Systemverhaltens: glFog(pname,param)<br />

pname: GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END,<br />

GL_FOG_INDEX, GL_FOG_COLOR<br />

param: Modus oder zugehörige Werte: GL_EXP, GL_EXP2, GL_LINEAR<br />

� z<br />

start<br />

end<br />

end �<br />

�<br />

f<br />

2<br />

)<br />

( density�z<br />

�<br />

e<br />

�<br />

f<br />

)<br />

( density�z<br />

f<br />

�<br />

f � e<br />

c � fc ��<br />

( 1 1�<br />

f ) c<br />

Farb Farb- oder Indexwerte: Indexwerte:<br />

i<br />

Default: GL_EXP, 1, 0, 1, 0, (0,0,0,0)<br />

100<br />

0 1


94<br />

Pufferstrukturen<br />

Puffer: Speicher, der für alle Pixel eines Fensters eine einheitliche Datenstruktur bereitstellt<br />

Fenster<br />

Pixel<br />

x<br />

1.0 2.0 3.0<br />

0.0<br />

Vorgehensweise:<br />

- Abbildung g von Fragmenten g mit ggeometrischen<br />

Parametern y<br />

auf Pixel mit Position und Farbe<br />

3.0<br />

- Pixeldaten werden in unterschiedlichen Puffern abgelegt<br />

- Jeder Puffer hat seine eigene Struktur und Funktion<br />

2.0<br />

- ttypische i h Puffergröße: P ff öß 1280 1280 x 1024 x 24bit<br />

1.0<br />

- alle Puffer zusammen bilden den Framebuffer<br />

- Farbpuffer ist der einzige direkt sichtbare Puffer<br />

0.0<br />

- Pufferparameter p implementationsabhängig, p g g, Abfrage g möglich g<br />

Pufferarten:<br />

- Farbpuffer p ( (color): ) dient dem Zeichnen; ; enthält RGBA- G oder Farbindexwerte; ; front-left für<br />

Mono-Einzel-Pufferung, front-right für Stereo-Pufferung, back-left und back-right für<br />

Doppel-Pufferung, auxiliary(i) für Hilfspufferung<br />

- Tiefenpuffer p ( (depth, p , z): ) speichert p Tiefenwerte, , senkrecht zu xy-Ebene, y , Werte von Objekten j mit<br />

geringstem Abstand zum Auge, tiefer liegende Objekte entfallen<br />

- Schablonenpuffer (stencil): beschränkter Bildschirmbereich; unabhängige Verwaltung von<br />

Schablonenbereich und Umgebung; g g; Sicherheit und Effizienz<br />

- Akkumulatorpuffer (accumulator): enthält RGBA-Werte; dient der Sammlung von Teilbildern<br />

und deren Zusammensetzung zu einem kompositen Bild vor Übertragung zum Farbpuffer


95<br />

Pufferoperationen<br />

Lö Löschen: h<br />

- festlegen der Initialwerte, die beim Löschen der einzelnen Puffer angewendet werden<br />

glClearColor(red,green,blue,alpha) glClearIndex(index)<br />

glClearDepth(depth) glClearStencil(s)<br />

glClearAccum(red,green,blue,alpha)<br />

- Löschen eines oder mehrerer Puffer<br />

glClear(mask)<br />

mask: bitweise Oder-Verknüpfung aus GL_*_BUFFER_BIT, mit<br />

*: COLOR, DEPTH, STENCIL, ACCUM<br />

Auswahl:<br />

- festlegen eines Farbpuffers für Schreiben und Lesen<br />

glDrawBuffer(mode) nachfolgend alle Zeichenoperationen wie glDrawPixels, glRasterPos<br />

glReadBuffer(mode) nachfolgend Operationen wie glReadPixels, glCopyPixels<br />

mode: GL GL_FRONT FRONT (Default) (Default), GL GL_LEFT, LEFT …<br />

Maskieren:<br />

- festlegen einer Maske für einen Puffer, die beim Schreiben mit dem aktuellen Wert<br />

über bitweises Und Und verknüpft verknüpft wird wird<br />

glIndexMask(mask) glColorMask(red,green,blue,alpha)<br />

glDepthMask(flag) glStencilMask(mask)<br />

Argumente: GL_TRUE, GL_FALSE


96<br />

Testoperationen:<br />

alle Tests müssen mit glEnable zunächst zugelassen werden<br />

sie verhindern oder ermöglichen das Schreiben einzelner Fragmente<br />

- Scissor-Test: Test auf ein Schnittrechteck<br />

glScissor(x,y,width,height)<br />

- Alpha Alpha-Test: Test: Test Test auf auf Alpha-Wert Alpha Wert<br />

glAlphaFunc(func,ref)<br />

func: GL_NEVER, GL_ALWAYS, GL_LESS, GL_EQUAL, GL_GREATER, GL_LEQUAL,<br />

GL_GEQUAL, GL_NOTEQUAL; ref: Referenzwert<br />

- Stencil-Test: Test auf eine Schablone und zugehörige Operation im Stencil-Puffer<br />

glStencilFunc(func,ref,mask)<br />

func: ...; Ref: ...; mask: bit-Werte<br />

glStencilOp(fail glStencilOp(fail,zfail,zpass)<br />

zfail zpass)<br />

Parameter: GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT<br />

- Depth-Test: Tiefentest<br />

glDepthFunc(func) func: …, Default: GL_LESS<br />

glEnable(GL_DEPTH_TEST) Verwendung des Tiefentests<br />

Verknüpfungsoperationen: aktuelles Fragment (Quelle) mit Farbpuffer (Ziel):<br />

- Bl Blending: di ffarbspezifische b ifi h logische l i h Operation O ti<br />

glEnable(GL_BLEND) glBlendFunc(sfactor,dfactor)<br />

- Dithering: Verbesserung der Farbauflösung auf Kosten der räumlichen Auflösung<br />

glEnable(GL g _DITHER)<br />

- Logic: beliebige bitweise logische Operation<br />

glEnable(GL_#_LOGIC_OP) #: INDEX,COLOR glLogicOp(opcode)<br />

opcode: GL_CLEAR, GL_COPY, GL_SET, GL_AND, GL_OR, GL_INVERT, …


97<br />

Akkumulatoroperationen:<br />

- Akkumulatorpuffer wird nicht automatisch beschrieben.<br />

beschrieben.<br />

- Er kann als Zwischenspeicher verwendet werden.<br />

glAccum(op,value)<br />

op: GL_ACCUM: Liest den Pixelwert vom Farbpuffer, multipliziert diesen mit der Zahl und<br />

addiert ddi ddas EErgebnis b i zum Akkumulatorwert<br />

Akk l<br />

GL_LOAD: Liest den Pixelwert vom Farbpuffer und schreibt den mit der Zahl multiplizierten<br />

Pixelwert in den Akkumulator<br />

GL GL_RETURN: RETURN: Schreibt Schreibt den den mit der der Zahl Zahl multiplizierten multiplizierten Akkumulatorwert Akkumulatorwert in den den Farbpuffer Farbpuffer<br />

GL_ADD: Addition des Akkumulatorwertes mit der Zahl<br />

GL_MULT: Multiplikation des Akkumulatorwertes mit der Zahl<br />

value: Gleitkommazahl<br />

- NNur Pi Pixel l in i der d aktuellen kt ll Scissor-Box S i B werden d verändert. ä d t<br />

- Anwendungen:<br />

- Szenen Antialiasing<br />

- Bewegungsunschärfe<br />

- Tiefenunschärfe<br />

- Weiche Schatten<br />

- Jitt Jittering i (Antialiasing (A ti li i durch d h Mehrpassrendering<br />

M h d i<br />

mit veränderter Kameraposition)


98<br />

Funktionsreferenz<br />

glBlendFunc - Kombination von Farbwerten mit den Farbwerten im Framebuffer<br />

glHint - Steuerung implementationsspezifischen Verhaltens<br />

glFog - Spezifikation von Nebelparametern<br />

glPolygonOffset - Setzen eines eines Verschiebungsparameters für die Tiefenberechnung<br />

Tiefenberechnung<br />

glClear - Initialisieren von Puffern<br />

glClearColor - Setzen der Werte für das Löschen des Farbpuffers p im RGBA-Modus<br />

glColorMask - Steuern des Schreibens von Bits in den Farbpuffer<br />

glDrawBuffer - Spezifikation des für das Zeichnen zu verwendenden Farbpuffers<br />

glReadBuffer - Spezifikation des für das Lesen zu verwendenden Farbpuffers<br />

glAlphaFunc - Setzen Setzen von von Referenzwert und und Vergleichsfunktion für für Alphatest<br />

glClearIndex - Setzen der Werte für das Löschen des Farbpuffers im Farbindex-Modus<br />

glIndexMask - Steuern des Schreibens von Bits in den Farbindexpuffer<br />

glClearDepth - Setzen der Werte für das Löschen des Tiefenpuffers<br />

glDepthFunc - Setzen der Vergleichsfunktion für der Tiefentest<br />

glDepthMask - Steuern des Schreibens in den Tiefenpuffer<br />

glClearStencil - Setzen der Werte für das Löschen des Schablonenpuffers<br />

glStencilMask - Steuern Steuern des des Schreibens in den den Schablonenpuffer<br />

Schablonenpuffer<br />

glStencilFunc - Setzen von Referenzwert, Vergleichsfunktion und Maske für Schablonentest<br />

glStencilOp - Setzen der Aktionen für den Schablonentest<br />

glClearAccum - Setzen der Werte für das Löschen des Akkumulatorpuffers<br />

glAccum - Angabe von Operation und Wert zur Steuerung des Akkumulatorpuffers<br />

glScissor - Festlegen von Position und Größe des Schnittrechtecks


100<br />

Selection<br />

Selection: Mechanismus Mechanismus, der der dem Nutzer erlaubt, erlaubt auf Regionen des Bildschirms oder oder auf auf im<br />

Bildschirm dargestellte Objekte zuzugreifen<br />

Zielstellung: g<br />

- Nutzer will Objekte auf dem Bildschirm identifizieren und dann bewegen, verändern oder löschen<br />

- Problem: Zwischen Modell- und Bildschirmobjekten liegen zahlreiche Transformationen<br />

- Anwendung: Nutzerinteraktion, z.B. Pickfunktion<br />

Vorgehensweise:<br />

- Spezifikation eines Arrays zur Aufnahme ausgewählter Sätze<br />

glSelectBuffer(size,*buffer)<br />

- Üb Übergang iin dden Selektionsmodus<br />

S l k i d<br />

glRenderMode(GL_SELECT)<br />

- Initialisierung des Namensstacks:<br />

glInitNames() g t a es() und glPushName(0)<br />

g us a e( )<br />

- Definition eines Sichtvolumens (Modellbereich, Projektionsmatrix, Clipping-Ebenen) für die<br />

Objektauswahl, eingeschlossen durch<br />

glPushMatrix()und glPopMatrix()<br />

- Al Alternierend i d Manipulation M i l i des d Namensstacks N k undd Zeichnung Z i h von Objekten Obj k<br />

glPushName(name), glPopName(), glLoadName(name), draw…<br />

- Beenden des Selektionsmodus<br />

glRenderMode(GL g ( _ RENDER) )<br />

Funktionswert: Anzahl der Treffer (jeweils ein Treffer bis Manipulation des Namensstacks)<br />

- Verarbeiten der im Selektionspuffer bereitgestellten Daten *buffer


1<strong>01</strong><br />

Picken:<br />

- Sichtvolumen wird alternativ durch einen Viewport-Bereich festgelegt<br />

gluPickMatrix(x,y,width,height,viewport[4])<br />

- x-, y-Werte typischerweise an Mausposition gebunden<br />

Inhalt des Namensstapels:<br />

- ein Name auf Stack, ein Objekt zeichnen: eine Auswahl bei einem getroffenen Objekt<br />

- ein Name auf Stack, mehrere Objekte zeichnen: eine Auswahl bei mehreren getroffenen Objekten<br />

- mehrere Namen auf Stack, ein Objekt zeichnen: mehrfache Auswahl bei einem getroffenen Objekt<br />

Inhalt des Selektionspuffers:<br />

für jeden Treffer: - Anzahl der Namen auf dem Namensstack (0)<br />

(sequentiell) - Minimum (1) und Maximum (2) der z-Werte aller getroffenen Objekte<br />

- Namen (3, ...) der ausgewählten Objekte<br />

GLuint selectBuffer[BUFFER_LENGHT];<br />

GLint hits, viewport[4];<br />

glSelectBuffer(BUFFER_LENGTH,selectBuffer);<br />

glGetIntegerv(GL_VIEWPORT,viewport);<br />

glMatrixMode(GL_PROJECTION);<br />

glPushMatrix(); glLoadIdentity();<br />

glRenderMode(GL_SELECT);<br />

gluPickMatrix(xPos,viewport[3]-yPos,2,2,viewport);<br />

gluPerspective(...); gluLookAt(...); glMatrixMode(GL_MODELVIEW);<br />

glInitNames(); glPushName(0);<br />

glLoadName(1); drawObject(…); glPushName(2); drawObject(…);<br />

glPushName(3); drawObject(…); glPopName(); ...<br />

hits = glRenderMode(GL_RENDER);<br />

if (hits) processHits(hits,selectBuffer);<br />

glMatrixMode(GL_PROJECTION); glPopMatrix();<br />

Programmbeispiel:<br />

glMatrixMode(GL_MODELVIEW);


102<br />

Programmbeispiel<br />

void display(void){<br />

...; drawScene(); selectObjects();}<br />

void drawScene(void){<br />

glMatrixMode(GL_PROJECTION); lM t i M d (GL PROJECTION) glLoadIdentity(); lL dId tit () gluPerspective(...);<br />

l P ti ( )<br />

glMatrixMode(GL_MODELVIEW); glLoadIdentity();<br />

gluLookAt(...); drawTriangle(...); ...}<br />

void selectObjects(void){<br />

j ( ){<br />

GLuint selectBuf[BUFSIZE];<br />

GLint hits;<br />

glSelectBuffer(BUFSIZE,selectBuf);<br />

glRenderMode(GL g ( _ SELECT); );<br />

glInitNames(); glPushName(0);<br />

glPushMatrix();<br />

glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,5,0,5,0,10);<br />

glMatrixMode(GL g ( _ MODELVIEW); ); glLoadIdentity();<br />

g y();<br />

glLoadName(1); drawTriangle(...);<br />

glLoadName(2); drawTriangle(...); drawTriangle(...);<br />

glPopMatrix(); glFlush();<br />

hits=glRenderMode(GL g ( _ RENDER); );<br />

processHits(hits,selectBuf);}<br />

void processHits(GLint hits, GLunit buffer[]){<br />

GLuint names,*ptr;<br />

ptr=(Gluint t (Gl i t *)buffer;<br />

*)b ff<br />

names=*ptr; ptr+=3;<br />

printf("%d, %d, %d",hits,names,*ptr);<br />

...}


103<br />

Feedback<br />

Feedback: Mechanismus Mechanismus, der der es erlaubt erlaubt, im Programm Ergebnisse des des Rendering-Prozesses<br />

Rendering Prozesses<br />

verfügbar zu machen<br />

Zielstellung: g<br />

- Normal: Anzeige des Rendering-Ergebnisses auf dem Bildschirm<br />

- Ziel: Zugriff auf das erzeugte Bild bzw. die generierten Zeichendaten<br />

- Anwendung: z.B. Druckerausgabe<br />

Vorgehensweise:<br />

- Spezifikation eines Feldes zur Aufnahme der Feedback-Daten<br />

glFeedbackBuffer(size,type,*buffer)<br />

type: GL GL_2D, 2D GL GL_3D, 3D GL GL_3D_COLOR, 3D COLOR GL3D GL3D_COLOR_TEXTURE,<br />

COLOR TEXTURE<br />

GL_4D_COLOR_TEXTURE (x,y,z,w,c,t)<br />

- Übergang in den Feedback-Modus<br />

glRenderMode(GL_FEEDBACK)<br />

- Ausführung von Zeichenbefehlen einschließlich des Setzens von Markern<br />

glPassThrough(token), draw…<br />

- Beenden des Feedback-Modus<br />

glRenderMode(GL glRenderMode(GL_RENDER) RENDER)<br />

- Verarbeiten der im Feedback-Puffer bereitgestellten Daten *buffer<br />

Inhalt des Feedback-Puffers:<br />

fü für jjedes d Primitiv, P i i i Bitmap Bi undd Pixelrechteck Pi l h k wird i d ein i Block Bl k generiert i mit i dem d Objekttyp Obj k<br />

GL_*_TOKEN, *: POINT, LINE, POLYGON, BITMAP, DRAW_PIXEL, PASS_THROUGH, …<br />

gefolgt von Werten, die Eckpunkte und andere Daten beschreiben


104<br />

Funktionsreferenz<br />

glSelectBuffer - Liefert einen Puffer für die Rückgabe von Auswahldaten<br />

glRenderMode - Spezifikation des Rendermodus<br />

glInitNames g - Initialisierung g des Namensstapels p<br />

glPushName - Ablegen eines Namens auf dem Namensstapel<br />

glPopName - Entfernen eines Namens vom Namensstapel<br />

glLoadName - Ersetzen des obersten Elementes des Namensstapels<br />

gluPickMatrix l Pi kM t i - BBeschränkung h ä k des d Zeichenbereiches Z i h b i h auf f einen i Teil T il des d Viewports Vi t<br />

glFeedbackBuffer - Einrichten eines Feedback-Puffers<br />

glPassThrough - Einfügen eines Markers in den Feedback-Puffer<br />

gluErrorString - Bereitstellen eines Fehlercodes<br />

glGetString - Bereitstellen eines Implementationsaspektes von gl<br />

gluGetString - Bereitstellen eines Implementationsaspektes von glu<br />

glFlush - Forcierung der Ausgabe ohne Warten des Programmes<br />

glFinish - Forcierung der Ausgabe mit Warten des Programmes


105<br />

OpenGL Zustandsvariablen<br />

Spezielle Anfragekommandos:<br />

glGet{AttachedShaders,BufferSubData,BufferParameteriv,<br />

BufferPointerv,ClipPlane,ColorTable,ColorTableParameter,<br />

CompressedTexImage CompressedTexImage,ConvolutionFilter,ConvolutionParameter,<br />

ConvolutionFilter ConvolutionParameter<br />

Error,Histogram,HistogramParameter,Light,Map,Material,<br />

MinmaxMinmaxParameter,PixelMap,PolygonStipple,ProgramLogInfo,<br />

Programiv,Queryiv,QueryObjectiv,QueryObjectuiv,SeparableFilter,<br />

ShaderInfoLog,Shaderiv,ShaderSource,String,TexEnv,TexGen,<br />

TexImage,TexLevelParameter,TexParameter,Uniform,VertexAttrib,<br />

VertexAttribPointerv}<br />

glIs{Buffer glIs{Buffer,List,Program,Query,Shader,Texture}<br />

List Program Query Shader Texture}<br />

gluGet{NurbsProperty,String,TessProperty}<br />

gl{PushAttrib,PopAttrib,PushClientAttrib,PopClientAttrib}<br />

GGenerelle ll Abfragekommandos Abf k d für fü ZZustandsvariablen: t d i bl<br />

glGet{Booleanv,Integerv,Floatv,Doublev,Pointerv}<br />

glIsEnabled<br />

KKategorien t i von ca. 380 ZZustandsvariablen: t d i bl<br />

Current Values, Vertex Array, Vertex Buffer Object, Transformation, Coloring, Lighting,<br />

Rasterization, Multisampling, Texturing, Pixel Operations, Framebuffer Control,<br />

Pixel State, , Evaluator State, , Hint State, , Implementation p Dependence, p , Miscellaneous<br />

Zustands-Stacks:<br />

Speicherung aller Zustandsattribute auf Server- und Client-Seite, Tiefe jeweils >= 16


106<br />

8. OpenGL p Shading g Language g g<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Kennenlernen des Prinzips programmierbarer Shader<br />

• Sprachkonstrukte der OpenGL Shading Language<br />

• Integration programmierbarer Shader in OpenGL Programme<br />

Abschnitte:<br />

Shader-Programmierung<br />

- Vorgehensweise<br />

- Graphik-Pipelines<br />

- Verwendung von Shaders<br />

- Erzeugung von Shaders (GLSL)<br />

- Zugriff auf Texture Maps<br />

- Shaderspezifische Mechanismen<br />

- Funktionsreferenz<br />

- Geometrie- und Tesselations-Shader


107<br />

Vorgehensweise<br />

OpenGL Shading Language (GLSL): Programmiersprache, um mit OpenGL auf dem<br />

Grafikprozessor (Grafikkarte) eigene Programme (Shader) auszuführen<br />

Merkmale:<br />

- teilweises Ersetzen der sonst stark limitierten und festen Verarbeitungsvorschriften g<br />

der<br />

Grafikkarte (Grafik-Pipeline)<br />

- als Extension ab Version 1.4, als Standard ab Version 2.0 (2004), derzeit Version 4<br />

- C-ähnliche Programmiersprache<br />

- Spezifika: Vektorendatentypen Vektorendatentypen und und -operationen, operationen Anpassung Anpassung an an OpenGL-Umgebung<br />

OpenGL Umgebung<br />

Shader-Arten:<br />

- Vertex-Shader<br />

- Fragment-Shader<br />

VVerwendung: d<br />

- Effizienzsteigerung<br />

- bessere Hardwareauslastung<br />

- PParallelverarbeitung ll l b it<br />

- Alternative Verarbeitungsstrategien


108<br />

Voraussetzung, Test und Initialisierung:<br />

- Version OpenGL: GL_RENDERER, GL_VERSION<br />

- Version GLSL: GL_SHADING_LANGUAGE_VERSION<br />

- Include GLSL: #include "glew.h" // glew ersetzt gl header file<br />

- Lib Library GLSL GLSL: glew32.lib, l 32 lib glew32.dll<br />

l 32 dll<br />

- Init GLSL: glewInit ()<br />

- Test Extension GLSL: GLEW_ARB_vertex_shader, GLEW_ARB_fragment_shader<br />

- Test Version 2.0 GLSL: glewIsSupported("GL g pp ( _VERSION_2_ 0") )<br />

Programmkontext:<br />

g<br />

#include <br />

#include <br />

void main(int argc, g char **argv) g {<br />

glutInit(&argc, argv); ...<br />

glewInit();<br />

if (glewIsSupported("GL_VERSION_2_0"))<br />

printf("Ready printf("Ready for for OpenGL 2.0\n"); 2 0\n"); else {<br />

printf("OpenGL 2.0 not supported\n");<br />

exit(1); }<br />

setShaders();<br />

glutMainLoop(); }


109<br />

Grafik-Pipelines<br />

Fixed-Function Pipeline: Feste interne Maschinen für Vertex- und Fragment-Shading<br />

mit extern einstellbaren Parametern<br />

Merkmale:<br />

- keine Veränderung der Verarbeitungsreihenfolge<br />

- Beschränkung auf eingebaute Funktionalität<br />

Programmable Shading Pipeline: Steuerung des Vertex- und Fragment-Shading<br />

durch kleine Verarbeitungsprogramme<br />

Merkmale:<br />

- Shader-Programme werden in spezieller Sprache geschrieben<br />

- Einbindung beliebiger Funktionalität<br />

In einem Anwendungsprogramm können beide Verfahren verwendet,<br />

jedoch nicht gleichzeitig aktiviert werden.<br />

Framebuffer<br />

Fragment Processing<br />

Machine<br />

Vertex Processing<br />

Machine<br />

Vertex Data<br />

Pixel Data


110<br />

Vertex-Verarbeitung:<br />

Shader-Struktur:<br />

Projection<br />

Matrix<br />

Modelview<br />

Matrix<br />

Vertex<br />

Coordinates<br />

Normal<br />

Matrix<br />

Normal<br />

Vector<br />

Cli Clipping i<br />

Primitive<br />

Setup<br />

Color Color<br />

Values<br />

TexGen/Texture<br />

Matrix<br />

Texture<br />

Coordinates<br />

Shader<br />

Fog<br />

Coordinates<br />

Feste Operationen nach dem Shader:<br />

- Perspective division<br />

- Viewport mapping<br />

- Primitive assembly assembly<br />

- Frustum and user clipping<br />

- Backface culling<br />

- Two-sided lighting selection<br />

- Polygon-mode processing<br />

- Polygon offset<br />

- Depth range<br />

Variable Operationen in dem Shader:<br />

- Eye-space coordinates<br />

- Primary and secondary colors<br />

- Texture coordinates<br />

- Fog coordinates<br />

- Point size


111<br />

Fragment-Verarbeitung:<br />

Shader-Struktur:<br />

P./S. Colour<br />

Summation<br />

Texture<br />

Mapping<br />

Geometric<br />

Primitive Setup<br />

Per-Pixel Fog<br />

Application<br />

Bitmaps/Pixel<br />

Rectangles<br />

Frame Buffer<br />

Fragment<br />

Tests<br />

Shader<br />

Feste Operationen nach dem Shader:<br />

- Flat or smooth shading (interpolation)<br />

- Pixel coverage computation<br />

- Pixel ownership tests<br />

- Scissor operation<br />

- Stipple-pattern application<br />

- Alpha test<br />

- Depth test<br />

- Stencil test<br />

- Alpha blending<br />

- Logical operations on pixels<br />

- Dithering of color values<br />

- Color masking<br />

Variable Operationen in dem Shader:<br />

- Texel retrieval<br />

- Texture application<br />

- Fog<br />

- Primary and secondary color summation


112<br />

Verwendung von Shaders<br />

Erzeugen, Übersetzen, Verbinden und Ausführen von GLSL Programmen, wobei Compiler und<br />

Linker Bestandteil des OpenGL Drivers sind<br />

Character Character<br />

Strings Strings<br />

glShaderSource<br />

Für jedes Shader Objekt:<br />

- Erzeugung des Shader Objektes<br />

- Übersetzung Übersetzung der Shader Quelle<br />

- Verifikation der Übersetzung<br />

Shader<br />

Shader<br />

Source<br />

Source<br />

glCompileShader<br />

Shader<br />

Shader<br />

Object<br />

Object<br />

j<br />

glAttachShader<br />

glCreateShader<br />

Für das Shader Programm:<br />

- EErzeugung des d Shader Sh d Programms P<br />

- Hinzufügen der Shader Objekte<br />

- Verbindung des Shader Programms<br />

- Verifikation Ve at o des des Verbindens Ve b de s<br />

- Nutzung des Shaders<br />

Shader<br />

Program<br />

glLinkProgram<br />

glCreateProgram<br />

Executable<br />

Shader Program<br />

Vorteil:<br />

Verbindung mehrerer kleinerer Shader Shader<br />

zu einem großen Programm<br />

glUseProgram


113<br />

Beispiel:<br />

GLuint shader, shader program;<br />

GLint compiled, linked;<br />

Const GLchar* shaderSrc[] = {<br />

"void main ()"<br />

"{gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;}" };<br />

shader = glCreateShader (GL_VERTEX_SHADER);<br />

glShaderSource (shader,1,shaderSrc,NULL);<br />

glCompileShader (shader);<br />

glGetShaderiv (shader,GL_COMPILE_STATUS,&compiled);<br />

if (!compiled) {<br />

GLint length;<br />

GLchar log;<br />

glGetShaderiv (shader,GL_INFO_LOG_LENGTH,&length);<br />

log = (GLchar*) malloc(length);<br />

glGetShaderInfoLog (shader (shader,length,&length,log);<br />

length &length log);<br />

fprintf (stderr,"%s",log); }<br />

program = glCreateProgram ();<br />

glAttachShader (program,shader);<br />

glLinkProgram (program);<br />

glGetProgramiv (program, GL_LINK_STATUS,&linked);<br />

if (linked)<br />

glUseProgram (program)<br />

else<br />

fprintf (stderr, "Linker Error");


114


115<br />

Erzeugung von Shaders (GLSL)<br />

Verwendung der OpenGL Shading Language (GLSL) mit allgemeinen und shader-spezifischen<br />

Anforderungen, Datentypen und Sprachkonstrukten<br />

Startpunkt:<br />

- Parameterloses Hauptprogramm mit für C üblicher Syntax und Semantik<br />

Variablendeklaration:<br />

Variablendeklaration:<br />

- Datentypen: float,int,bool<br />

- Definition: an jeder Programmstelle möglich<br />

- Bereich: Gültigkeit g auf Definitionsniveau und allen untergeordneten g Niveaus<br />

- Initialisierung: bei Deklaration möglich<br />

- Konstruktoren: explizite Typkonvertierung erforderlich, z.B. float(1),int(2.0),bool(0)<br />

Aggregat-Typen:<br />

Aggregat Typen:<br />

- Datentypen für 1-, 2-, 3-, 4-dimensionalen Vektoren und Matrizen<br />

float: vec2,vec3,vec4, mat2,mat3,mat4<br />

int: ivec2,ivec3,ivec4<br />

bool: bvec2,bvec3,bvec4<br />

mit entsprechenden expliziten Typkonvertierungsfunktionen, z.B. vec3(0.0,1.0,2.0)<br />

- spezielle Vektoren: Position (x,y,z,w), Farbe (r,g,b,a), Textur (s,t,p,q)<br />

- Komponentenzugriff: über über Index position[0] position[0], über Name color.r color.r<br />

- Strukturen: Zusammenfassungen verschiedenen Typs, z.B. struct Part{float a;vec3 b;};<br />

- Arrays: Felder beliebigen Typs, z.B. bool[8], Part[9]


116<br />

Typmodifikatoren:<br />

- Beeinflussung des Verhaltens von Datentypen<br />

const konstanter Wert<br />

z.B. const float pi=3.14;<br />

attribute attribute Variable in Vertex-Shader verbunden mit mit Vertex-Attributen der der<br />

OpenGL-Anwendung<br />

nur für auf float aufbauenden Datentypen<br />

vor- und nutzerdefinierte globale Variablen<br />

z.B. in Shader: attribute vec3 disp;<br />

in Anwendung: GLfloat dispValue[3];<br />

int index=glGetAttribLocation(program,"disp");<br />

glVertexAttrib3fv(index glVertexAttrib3fv(index,dispValue);<br />

dispValue);<br />

uniform Variable in Vertex- und Fragment-Shader, die von Anwendung übergeben und<br />

für Primitiv im Shader konstant ist<br />

zz.B. B in Shader: uniform float time;<br />

in Anwendung: GLint timeLoc; GLfloat timeValue;<br />

timeLoc=glGetUniformLocation(program,"time");<br />

glUniform1f(timeLoc,timeValue);<br />

varying Variable zur Übergabe von Daten vom Vertex- zum Fragment-Shader<br />

nur für auf float aufbauenden Datentypen<br />

Ausgabe-Variablen im Vertex-Shader als Eingabe-Variablen im Fragment-Shader<br />

Vor- und nutzerdefinierte globale Variablen<br />

z.B. in Vertex-Shader varying float temp;<br />

in Fragment-Shader varying float temp;


117<br />

Anweisungen:<br />

- C- bzw. C++-konforme Operatoren<br />

- Arithmetik: + - * / = == != < > ++ -- () [] . && ^^ || ,<br />

+= *= -= /= ? :<br />

- Alternative: if else<br />

- Iteration: Iteration: for for, while, while do do while<br />

- Steuerung: break, continue, return, discard<br />

- Operatoren sind überladen<br />

Funktionen:<br />

- C- bzw. C++-konforme Definition und Verwendung<br />

- vordefinierte und nutzerdefinierte Funktionen<br />

- returnType functionName([accessModifier] type variable, …)<br />

{functionBody; return returnValue;}<br />

- keine Verwendung von Pointern<br />

- Modifikatoren für für Parameter: Parameter: in, const in, out, inout<br />

Beispiel:<br />

uniform float t;<br />

attribute ib vec4 4 vel; l<br />

const vec4 g = vec4(0.0,-9.8,0.0);<br />

void main () {<br />

vec4 ec pos position t o = vec4(gl ec (g _Vertex); e te );<br />

position += t*vel+t*t*g;<br />

gl_position = gl_ModelViewProjectionMatrix*position;}


118<br />

Vordefinierte Konstanten:<br />

Grenzen: gl g _ Max{Lights,ClipPlanes,TextureUnits,TextureCoords,<br />

{ g , p , , ,<br />

VertexAttribs,DrawBuffers,VertexUniformComponents,<br />

VaryingFloats,VertexTextureImageUnits,<br />

CombinedTestureImageUnits,TextureImageUnits,<br />

FFragmentUniformComponents} tU if C t }<br />

Vordefinierte Uniform Zustandsvariablen:<br />

Transformationsmatrizen: gl_{ModelViewMatrix,ProjectionMatrix,<br />

ModelViewProjectionMatrix,TextureMatrix[n],NormalMatrix<br />

{Inverse,Transpose,InverseTranspose}}<br />

Normalen: gl gl_NormalScale,gl_Normal<br />

NormalScale,gl Normal<br />

Tiefenbereich: gl_DepthRange<br />

Klippebene: gl_ClipPlane<br />

Punktparameter: gl_Point<br />

Material: gl_FrontMaterial,gl_BackMaterial<br />

Li Licht: h gl_LightSource,gl_LightModel,gl_FrontLightModelProduct,<br />

gl_BackLightModelProduct<br />

Textur: gl_TextureEnvColor,gl_EyePlane{S,T,R,Q},gl_ObjectPlane{S,T,R,Q}<br />

Nebel: gl_Fog<br />

>>> generell Datentypen: float, vec4, structure …


119<br />

Vordefinierte Funktionen:<br />

Wi Winkelkonvertierung, k lk i Trigonometrie: T i i radians,degrees,sin,cos,tan,asin,acos,<br />

atan,atan<br />

Transzendenz: pow,exp,log,exp2,log2,sqrt,inversesqrt<br />

Numerik: abs,sign,floor,ceil,fract,mod,min,max,clamp,mix,smoothstep<br />

Vektoren: length,distance,dot,cross,normalize,ftransform,faceforward,<br />

reflect,refract<br />

e ect, e act<br />

Matrizen: matrixCompMult<br />

Vektor-Relationen: lessThan,lessThanEqual,greaterThan,greaterThanEqual,<br />

equal,notEqual,any,all,not<br />

l l ll<br />

Texturen: texture{1D,2D,3D,2DProj,2DProj,3DProj,1DLod,1DProjLod,2DLod,<br />

2DProjLod,3DLod,3DProjLod,Cube,CubeLod},<br />

shadow{1D,2D,1DProj,2DProj,1DLod,2DLod,1DProjLod,2DProjLod}<br />

h d {1D 2D 1DP j 2DP j 1DL d 2DL d 1DP jL d 2DP jL d}<br />

Fragmente: dFdx,dFdy,fwidth<br />

Rauschen: noise{1,2,3,4}<br />

{ , , , }


120<br />

Zugriff auf Texture Maps<br />

Verwendung von Texturen in Vertex- und Fragment-Shadern durch Herstellung einer Verbindung<br />

zwischen der aktiven Textur in der Anwendung und einem deklarierten Sampler im Shader<br />

Charakteristika:<br />

- Übereinstimmung der Dimensionen von Textur und Typ des Samplers<br />

- Unterstützte Sampler-Typen: p yp sampler1D,sampler2D,sampler3D,<br />

p , p , p ,<br />

samplerCube,sampler1DShadow,sampler2DShadow<br />

- Definition und Zugriff:<br />

z.B.: Anwendung: GLint texSampler;<br />

ttexSampler=glGetUniformLocation(program,"tex"); S l lG tU if L ti ( "t ")<br />

glUniform1i(texSampler,2);<br />

Shader: uniform sampler2D tex;<br />

gl g _FragColor=gl g g _ Color*texture2D(tex,gl ( ,g _ TexCoord[0].st); [ ] )<br />

uniform sampler1D coords;<br />

uniform sampler3D volume;<br />

vec3 texCoords=texture1D(coords,gl_TexCoord[0].s);<br />

vec3 3 volumeColor=texture3D(volume,texCoords);<br />

l C l t t 3D( l t C d )<br />

- Aufgabe im Shader: Verwendung von Texturkoordinaten, um Positionen in der Textur zu spezifizieren<br />

und Texturwerte bereitzustellen<br />

- Ermittelte Texturkoordinaten können auf anderen Sampler p übertragen g werden<br />

- vordefinierte Textur-Zugriffsfunktionen


121<br />

Shaderspezifische Mechanismen<br />

Ein- und Ausgabeverhalten von Vertex- und Fragment-Shader<br />

Verwendete Datentypen: bool,float,vec4<br />

Vertex Vertex-Shader: Shader:<br />

- Eingabe: pre-defined attribute variables<br />

gl_Vertex,gl_Normal,gl_Color,gl_SecondaryColor,<br />

gl_TexCoordn,gl_MultiTexCoordn,gl_FogCoord<br />

user-defined vertex attributes<br />

user-defined uniform variables<br />

- Ausgabe: pre-defined special variables<br />

gl gl_Position,gl_PointSize,gl_ClipVertex<br />

Position gl PointSize gl ClipVertex<br />

pre-defined varying variables<br />

gl_FrontColor,gl_BackColor,gl_FrontSecondaryColor,<br />

gl_BackSecondaryColor,gl_TexCoord[n],gl_FogFragCoord,<br />

Fragment-Shader:<br />

- Eingabe: pre-defined varying variables<br />

gl gl_FragCoord,gl_Color,gl_SecondaryColor,<br />

FragCoord,gl Color,gl SecondaryColor,<br />

gl_TexCoord[n],gl_FogFragCoord,gl_FrontFacing<br />

user-defined vertex attributes<br />

user-defined uniform variables<br />

- Ausgabe: pre-defined special variables<br />

gl_FragColor,gl_FragDepth,gl_FragData[n]<br />

discard fragment, multiple output buffer rendering


122<br />

Shader-Beispiele:<br />

Vertex-Shader:<br />

void main(void) {<br />

gl_FrontColor = gl_Color; gl_Position = ftransform(); }<br />

uniform i float time; i<br />

void main(void) {<br />

vec4 v = vec4(gl_Vertex);<br />

v.z v.z = sin(5.0 sin(5.0*v.x v.x + time time*0.<strong>01</strong>)*0.25;<br />

0.<strong>01</strong>) 0.25;<br />

gl_Position = gl_ModelViewProjectionMatrix * v; }<br />

Fragment-Shader:<br />

void main(void) {<br />

gl_FragColor = gl_Color; }<br />

varying i vec3 3 li lightDir,normal; h i l uniform if sampler2D l 2 tex;<br />

void main() {<br />

vec3 ct,cf; vec4 texel; float intensity,at,af;<br />

intensity y = max(dot(lightDir,normalize(normal)),0.0);<br />

( ( g , ( )), );<br />

cf = intensity * (gl_FrontMaterial.diffuse).rgb +<br />

gl_FrontMaterial.ambient.rgb;<br />

af = gl_FrontMaterial.diffuse.a;<br />

ttexel l = ttexture2D(tex,gl_TexCoord[0].st); t 2D(t l T C d[0] t)<br />

ct = texel.rgb; at = texel.a;<br />

gl_FragColor = vec4(ct * cf, at * af); }


123<br />

Funktionsreferenz<br />

glCreateShader (type) Erzeugung eines Shader Objektes<br />

glShaderSource (shader,count,string,length) Zuweisung von Quelltext zu Shader Objekt<br />

glCompileShader g C p S ( (shader) ) Übersetzung Ü g von QQuelltext zu SShader OObjekte j<br />

glGetShaderInfoLog (shader,bufSize,length,infoLog) Übersetzungsinformation zu Shader Objekt<br />

glCreateProgram () Erzeugung eines Shader Programms<br />

glAttachShader lAtt hSh d ( (program,shader) h d ) ZZuweisung i Shader Sh d Objekt Obj kt zu Sh Shader d Programm P<br />

glDetachShader (program,shader) Entfernung Shader Objekt zu Shader Programm<br />

glLinkProgram (program) Verbindung eines Shader Programms<br />

glGetProgramInfoLog g g g (p (program,bufSize,length, g , , g , Verbindungsinformation g zu Shader Programm g<br />

infoLog)<br />

glUseProgram (program) Verwendung des Programms als Shader<br />

glDeleteShader lD l t Sh d (shader) ( h d ) Lö Löschen h eines i Shader Sh d Objekts Obj kt<br />

glDeleteProgram (program) Löschen eines Shader Programms<br />

glIsProgram (program) Test auf Shader Programm<br />

glIsShader g (shader) ( ) Test auf Shader Objekt j<br />

glValidateProgram (program) Test Shader Programm in OpenGL Umgebung<br />

glGetShaderiv (shader,pname,params) Shader Objekt Informationen<br />

glGetProgramiv lG tP i (program,pname,params) ( ) Sh Shader d Programm P Informationen<br />

I f ti<br />

glGetAttachedShaders (program,maxCount,count,shaders) Informationen zu zugewiesenen Shaders


124<br />

glGetUniformLocation Index einer Uniform Variable eines Shaders<br />

glUniform Setzen des Wertes einer Uniform Variable<br />

glUniformMatrix Matrixversion der Setzfunktion<br />

glGetAttribLocation Index einer Attribut Variable eines Shaders<br />

glBindAttribLocation Explizite Bindung von Variablen-Indexwerten<br />

glVertexAttrib g<br />

Setzen des Wertes einer Attribut Variable<br />

glVertexAttrib4N Setzen des Wertes mit vorheriger Normaliserung<br />

glVertexAttribPointer Setzen des Wertes in Vertex-Arrays über Pointer<br />

glEnableVertexAttribArray Erlaubnis von Vertex-Arrays<br />

glDisableVertexAttribArray glDisableVertexAttribArray Verbot von Vertex Vertex-Arrays<br />

Arrays


125<br />

Geometrie- und Tesselations-Shader<br />

Geometrie-Shader: - Erzeugung, Löschung und Änderung von primitiven Geometrien<br />

- Punkte, Linien, Dreiecke<br />

- Aufruf nach nach Vertex-Shader<br />

Vertex Shader<br />

- Geometry Shader<br />

Tesselations-Shader: - Bearbeitung und Test von komplexen Geometrien<br />

- Polygone<br />

- Tessellation Control Shaders, Tessellation Evaluation Shaders<br />

� Keine Funktionen der eigentlichen Render-Pipeline<br />

www.lighthouse3d.com/tutorials/glsl-core-tutorial


126<br />

9. Helligkeits- g und<br />

Farbdarstellung<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Kennenlernen der Grundlagen für Helligkeits- und Farbdarstellungen<br />

• Realisierung und Anwendung der Darstellungen in der Computergrafik<br />

Abschnitte:<br />

- Physikalische Grundlagen<br />

- Radiometrie und Fotometrie<br />

- Helligkeitsmetrik<br />

g<br />

- Helligkeitsreduktion<br />

- Farbmetrik<br />

- Farbmodelle<br />

Helligkeit und Farbe als<br />

Basis der Computergrafik


127<br />

Physikalische Grundlagen<br />

Definition: Licht ist der für den Menschen sichtbare Ausschnitt des elektromagnetischen Spektrums<br />

Grundlagen: geben Auskunft darüber, wie das Licht als physikalische Größe<br />

und die vom Menschen empfundenen Farbeindrücke zusammenhängen<br />

Bestandteile: Bestandteile: - Modelle der der Lichtausbreitung in Medien Medien<br />

- Wechselwirkung des Lichtes mit Objektoberflächen<br />

- quantitative Beurteilung charakteristischer Größen<br />

- Wirkung des Lichtes auf optische Sensoren des Menschen<br />

- Wahrnehmung der Reize im neuronalen System des Menschen<br />

Eigenschaften:<br />

* Frequenz: Anzahl der Schwingungen pro Sekunde<br />

* Wellenlänge: räumliche Ausdehnung einer Welle<br />

* Phasenlage: räumliche/zeitliche Verschiebung einer Welle<br />

* Polarisation: räumliche räumliche Ebene einer Welle<br />

* Reflexion: Verhalten an Objektoberflächen<br />

* Refraktion: Verhalten an Objektübergängen<br />

* Beugung: Verhalten Verhalten an an Objektkanten<br />

Objektkanten<br />

* Interferenz: gegenseitige Beeinflussung von Wellen<br />

Natürliches Licht kombiniert verschiedene Eigenschaften g<br />

Superposition: Eigenschaften können einzeln berechnet und überlagert werden<br />

Teilgebiete: Strahlenoptik (makroskopisch), Wellen- und Quantenoptik (mikroskopisch)


128<br />

Radiometrie und Fotometrie<br />

Licht ist eine physikalische Erscheinung, die auf Objekte einer Szene wirkt.<br />

Licht besitzt als Strahlung messbare Energie. Es ist zeitlich und räumlich beschränkt.<br />

(W )<br />

(<br />

(Ws)<br />

( W m<br />

W sr<br />

W m<br />

� �<br />

Q e<br />

)<br />

e<br />

� � )<br />

� �<br />

2<br />

E e<br />

2 � sr�<br />

L e<br />

Radiometrische Größen: Größen:<br />

- Strahlungsenergie (energy): Energie<br />

- Strahlungsleistung (power, flux): Energie pro Zeit, Fluss<br />

�<br />

- Strahlungsstärke (irradiance): Leistung pro Flächeneinheit<br />

- Strahlungsintensität (intensity): Leistung pro Raumwinkel Ie - Strahlungsdichte (radiance): Leistung pro Richtung und Fläche<br />

- Wellenlängen (wavelengths): Spektrum verschiedener Wellenlängen<br />

Licht ist eine psychologische Erscheinung, die auf Sinnes- und Nervenzellen eines Betrachters wirkt.<br />

Licht bewirkt messbare neuronale Effekte. Es ist in der Wirkung auf den Betrachter beschränkt.<br />

Beispiele für Größen:<br />

- MMondlicht: dli ht 0.2 0 2 lx l<br />

- Kerze (1 m Abstand): 1 lx<br />

- Leselicht: 100 lx<br />

- Sonnenlicht: 70000 lx<br />

)<br />

lx<br />

� cd �<br />

,<br />

2<br />

2 � sr�<br />

Photometrische Größen:<br />

- Lichtmenge (quantity) Qv (lms)<br />

- Lichtstrom (flux) (flux) ��<br />

v (lm )<br />

- Lichtstärke (luminosity) Ev ( lm m<br />

- Lichtintensität (intensity) Iv lm sr,<br />

- Leuchtdichte (luminance) Lv lm m<br />

- Kombination von Grundfarben 830<br />

- Diskretisierung: ( R, G,<br />

B)<br />

� �<br />

360


129<br />

Abbildung von radiometrischen zu fotometrischen Größen:<br />

- radiometrisch: X e fotometrisch: X v<br />

Energieverteilung im<br />

- Hellempfindlichkeitsfunktion: V (�)<br />

absorbierten Lichtspektrum:<br />

- Proportionalitätsfaktor:<br />

- Abbildung:<br />

830<br />

�<br />

X<br />

Km<br />

Energie<br />

X v � Km<br />

� X e�<br />

( �)<br />

V ( �)<br />

d�<br />

dichte<br />

Wellen<br />

länge<br />

(nm)<br />

360<br />

Optische p Rezeptoren: p<br />

400 700<br />

- Helligkeitssehen: 120 Mio Stäbchen: Schwarz/Weiß<br />

- Farbsehen: 6 Mio Zapfen: Rot, Grün, Blau<br />

Absorbierter Lichtanteil<br />

0.2<br />

Empfindlichkeitskurven für<br />

Farbdifferenzen, Helligkeit und Farbe:<br />

Wellenlängendifferenz<br />

Absorbierter Lichtanteil<br />

0.4<br />

16<br />

Wellen<br />

länge<br />

(nm) (nm)<br />

WWellen ll<br />

länge<br />

(nm)<br />

Wellen<br />

länge<br />

(nm)<br />

400 500 600 700<br />

400 700<br />

400 700


130<br />

Helligkeitsmetrik<br />

Helligkeitsmetrik: Lehre von den Maßwerten der Lichtintensität.<br />

Lichtintensität ist einziges Attribut für einfarbiges Licht.<br />

Skalare Größe: I ��0,<br />

1�<br />

mit 0: schwarz, 1: weiß, sonst: grau<br />

Helligkeit: Helligkeit: Integral Integral aus aus Produkt Produkt von von Energieverteilung Energieverteilung und und Helligkeitsempfindlichkeitsfunktion<br />

Dynamikbereich<br />

Dynamikbereich,<br />

Intensitätswerte:<br />

- CRT: 200, 400<br />

- Foto: 1000, 1000 700 700<br />

- Zeitung: 10, 200<br />

Auswahl von Intensitätswerten:<br />

- Lichtintensität wird von speziellen p Sinneszellen wahrgenommen g<br />

- entsprechende Darstellung auf Bildschirm erforderlich<br />

- Merkmale: Anzahl der Intensitätswerte n (z.B. 256) 0 � j � 255<br />

. maximale Intensität I n (z.B. 1.0), minimale Intensität I0<br />

(z.B. 0.02)<br />

. Verhältnis benachbarter benachbarter Intensitäts Intensitätswerte erte r �� I In<br />

I n�1<br />

(z.B. ( B 1.<strong>01</strong>545…) 1 <strong>01</strong>545 )<br />

- Verteilung der Intensitätswerte logarithmisch (nicht linear)<br />

- Dynamikbereich: In I0<br />

(z.B. 50)<br />

n<br />

- Berechnung g des Wertes für r:<br />

r � I n I 0<br />

- Ermittlung des nächsten Intensitätsindexes: j � round (logr ( I j I0<br />

))<br />

- Ermittlung der zugehörigen Intensität:<br />

j<br />

I j r I0<br />

�<br />

I<br />

- ggf ggf. Ausgleich der Nichtlinearität<br />

Nichtlinearität<br />

über Gamma-Korrektur<br />

(mit Gerätekonstante K<br />

und Korrekturwert � ): )<br />

j<br />

V �<br />

j I j K �


131<br />

Helligkeitsreduktion<br />

Helligkeitsreduktion: Verfahren zur Darstellung einer einer großen großen Anzahl von Helligkeitswerten durch durch<br />

räumliche Integration einer reduzierten Anzahl von Helligkeitswerten (Halftoning, Dithering)<br />

Problem: Reduktion der Helligkeitswerte führt zu Realitätsverlust<br />

Kompromiss: zwischen radiometrischer und räumlicher Auflösung<br />

Zuordnungsverfahren: statisch, dynamisch, deterministisch, stochastisch<br />

Einfache Reduktion: Abbildung von einem Bereich mit m Helligkeitswerten<br />

auf einen kleineren Bereich mit m' Werten bei gleicher räumlicher Auflösung<br />

- Abbildung: I '� round�m'<br />

I m�<br />

Binäres Dithermuster: n x n -Matrix zweiwertiger Pixel<br />

2<br />

- darstellbare Helligkeitswerte: n �1<br />

- Musterformen: Quadrat, Sechseck, Kreis<br />

- Dithermatrix (Schwellwertmatrix):<br />

� �<br />

� �6 8 4<br />

� ��<br />

� �<br />

��<br />

1 0 3<br />

�5<br />

2 7<br />

�<br />

( 3 )<br />

D<br />

2��<br />

1<br />

�<br />

�<br />

��<br />

0<br />

�<br />

�3<br />

�<br />

)<br />

2<br />

(<br />

D<br />

Mehrwertiges g Dithermuster: n x n -Matrix k-wertiger g Pixel<br />

2<br />

- darstellbare Helligkeitswerte: n ( k �1)<br />

�1<br />

0 0 1 0 2 1 2 1 2 2 3 3 3 3<br />

. . .<br />

. . .<br />

0 0 0 0 1 1 1 2 1 2 2 3 3 3<br />

Musterentwurf: - Ordnung nach Helligkeitsstufen<br />

- Vermeidung von Artefakten


132<br />

Schwellwertverfahren mit größerer räumlicher Auflösung:<br />

- Verwendung g von Schwellwerten und Anordnung g in einer binären<br />

Dithermatrix D (n)<br />

- Setzen aller Elemente D (n) i,j der Dithermatrix, die kleiner als die Intensität<br />

S(x,y) des Pixels P(x,y) sind (S(x,y) > D (n) i,j), auf 1<br />

- Setzen Setzen aller anderen anderen Elemente der der Dithermatrix auf auf 0<br />

- Zeichnen der veränderten Dithermatrix anstelle des Pixels P(x,y)<br />

Schwellwertverfahren mit gleicher räumlicher Auflösung:<br />

- Verwenden von Schwellwerten und Anordnung in einer binären<br />

Dithermatrix: D (n)<br />

- Ermittlung der zu einem Pixel P(x,y) gehörenden Position eines<br />

Schwellwertes in der der Dithermatrix: Dithermatrix: i = x mod n , j = y mod n<br />

- Vergleichen von Pixelwert und Schwellwert: S(x,y) > D (n) i,j<br />

- Zeichnen einer 1 bei Pixel P(x,y), wenn Pixelwert größer Schwellwert<br />

- Zeichnen einer 0 sonst<br />

Beispiel für Dithermatrix:<br />

�� 0 2 2��<br />

� �<br />

�3<br />

1�<br />

�<br />

)<br />

2<br />

(<br />

D<br />

Bei homogenen Belegungen liefern beide Verfahren<br />

das gleiche Ergebnis.


133<br />

Streuverfahren:<br />

- Schwellwertmatrix als sich sukzessive auffüllendes, verdichtetes Feld<br />

� dadurch homogenes Aussehen<br />

Clusterverfahren:<br />

- Schwellwertmatrix als von innen nach außen wachsendes periodisches p Feld<br />

� dadurch weniger Rauschen, unterschiedlich große gefärbte Bereiche<br />

Zufallsverfahren:<br />

- Addieren eines Zufallswertes zum Schwellwert<br />

� dadurch Einbringung von Rauschen, Vermeidung von Artefakten<br />

Interpolationsverfahren:<br />

- Interpolation der Übergänge zu benachbarten Matrizen<br />

� dadurch glatte, fließende Übergänge<br />

Fehlerdiffusionsverfahren:<br />

- Ermittlung der Differenz zwischen exaktem und dargestelltem Pixelwert<br />

- Zerlegung der Differenz in 4 Werte und<br />

Addition zu exakten Nachbarwerten<br />

� dadurch Erreichen der exakten Helligkeit eines Bereiches<br />

Sonstige / zusätzliche Verfahren:<br />

Stippling: Start mit initialer Verteilung<br />

Relaxation: Ausgleich der Verteilung


134<br />

Farbmetrik<br />

Farbmetrik: Lehre von von den den Maßbeziehungen der Farben untereinander.<br />

untereinander<br />

Lichtintensitäten können Lichtanteilen verschiedener Wellenlängen zugeordnet werden.<br />

Vektorielle Größe: ( R,<br />

G,<br />

B)<br />

, R,<br />

G,<br />

B ��0,<br />

1�<br />

mit 0: kein Anteil, 1: voller Anteil, sonst: anteilig<br />

Farbe: Integral aus Produkt von Energieverteilung und Farbempfindlichkeitsfunktion<br />

Problem: - keine Emmitoren und Rezeptoren für spektrale Leuchtdichteverteilungen<br />

- mehrere spektrale Leuchtdichteverteilungen erzeugen gleichen Farbeindruck<br />

Fragen: - Strahlungsspektrum an Objektoberfläche<br />

- Farbdarstellung in Bildpunkt des Monitors / Druckers<br />

- Farbwahrnehmung durch Auge und Gehirn<br />

Psychophysische Begriffe:<br />

Perzeption: Colorimetrie:<br />

- Farbton (Hue) - Dominante Wellenlänge<br />

- Sättigung (Saturation) (Saturation) - Wellenlängenreinheit<br />

- Helligkeit (Lightness / Brightness) - Leuchtdichte<br />

Farbmischung:<br />

Additiv:<br />

Green<br />

Subtraktiv:<br />

Y<br />

C<br />

M<br />

Blue<br />

Red


135<br />

Grundlagen der additiven Farbmischung:<br />

Farberkennung im Auge: Tristimulus-Theorie: Tristimulus Theorie: 3 Arten von von Rezeptoren Rezeptoren für für R, G, B<br />

Farbdarstellung auf Monitor: je 256 Intensitätsstufen für R, G, B<br />

1. Graßmannsches Gesetz: 4 Farbvalenzen sind stets linear abhängig<br />

2. Graßmannsches Gesetz: 2 gleiche Farben ergeben mit einer 3. Farbe jeweils wieder gleiche Farben<br />

Folgerung: 3D-Farbraum mit Farbvalenzen als Vektoren C=rR+gG+bB<br />

baryzentrischer Farbraum: r'=r/(r+g+b), g'=g/(r+g+b), b'=b/(r+g+b), r'+g'+b'=1<br />

allein durch positive Werte für r, g, b nicht alle Farbvalenzen erreichbar<br />

PProblem: bl negative i Farbwerte F b (Hinzumischung (Hi i h zu Zielfarbe) Zi lf b )<br />

Spektralwertkurven für R, G, B:<br />

C<br />

Farbraum:<br />

B<br />

R<br />

G<br />

Chromazitätsdiagramm für R, G, B:<br />

G<br />

500<br />

600<br />

C<br />

700<br />

B R<br />

400


136<br />

CIE-Farbsystem:<br />

CIE-Farbsystem: CIE Farbsystem: Farbsystem, das das es es gestattet auf auf der der Basis von von drei drei Grundfarben X, Y, Y, Z alle<br />

Farben des sichtbaren Spektrums darzustellen mit ausschließlich positiven Werten x, y, z<br />

CIE-Farbsystem: Farberkennung im Auge<br />

Folgerung: 3D-Farbraum: C=xX+yY+zZ<br />

baryzentrischer Farbraum: x'=x/(x+y+z), y'=y/(x+y+z), z'=z/(x+y+z), x'+y'+z'=1<br />

Farbraum: CIE CIE-Chromazitätsdiagramm: Chromazitätsdiagramm: CIE CIE-Spektralwertkurven<br />

Spektralwertkurven<br />

z<br />

�x'�<br />

� �<br />

��y<br />

y'��<br />

� ���<br />

��<br />

� ���<br />

x<br />

y<br />

�� z<br />

x<br />

y<br />

Foley u.a.: Computer Graphics, Addison-Wesley, 1996


137<br />

Farbmodelle<br />

Farbmodell: Spezifikation eines eines 3D-Farbkoordinatensystems 3D Farbkoordinatensystems mit mit einem sichtbaren Teilraum, Teilraum<br />

in dem alle Farben in einer speziellen Farbskala liegen<br />

Anwendung: Auswahl, Eingabe, Repräsentation, Speicherung, Austausch, Übertragung<br />

Klassen: hardwareorientiert (Mischung von drei Primärfarben)<br />

wahrnehmungsorientiert (Angabe von Farbton, Sättigung und Helligkeit)<br />

Konvertierung: zwischen Modellen eineindeutig möglich<br />

RGB-Modell<br />

� �<br />

� �<br />

�<br />

�<br />

� �r<br />

� ��<br />

�b g<br />

Struktur: additive Verknüpfung dreier Primärfarben rot, grün, blau<br />

Darstellung: Farbwürfel<br />

Anwendung: Monitor, …<br />

Transformation: nach CIE<br />

� � � ��<br />

�<br />

Bl (0<strong>01</strong>)<br />

� ��<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

��<br />

�x<br />

xr<br />

xg<br />

xb<br />

r<br />

Blue (0<strong>01</strong>)<br />

y yr<br />

yg<br />

yb<br />

g<br />

Magenta (1<strong>01</strong>)<br />

Cyan (<strong>01</strong>1)<br />

�z<br />

zr<br />

zg<br />

zb<br />

b<br />

Whit White (111)<br />

Black (000)<br />

Green (<strong>01</strong>0)<br />

Red (100)<br />

Yellow (110)


138<br />

CMY-Modell<br />

Struktur: subtraktive Verknüpfung dreier Primärfarben cyan, cyan magenta, magenta gelb<br />

� c �<br />

Komplementärfarben zu rot, grün, blau<br />

beginnend mit weißem Licht<br />

�<br />

Darstellung: Farbwürfel wie RGB, jedoch schwarz und weiß vertauscht<br />

��<br />

�<br />

� �<br />

��<br />

� c<br />

m<br />

� y<br />

Anwendung: Drucker, …<br />

Transformation: nach RGB<br />

� �<br />

� �<br />

� �<br />

� �<br />

� �<br />

� �r 1 c<br />

G Y<br />

� ��<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

��<br />

g 1 m<br />

�b<br />

1 y<br />

C R<br />

B M<br />

CMYK-Modell<br />

� ��<br />

� ��<br />

�<br />

� ��<br />

c<br />

m<br />

� ��<br />

m<br />

y<br />

� k<br />

Struktur: subtraktive Verknüpfung der drei Primärfarben cyan, magenta, gelb<br />

und schwarz<br />

schwarz ersetzt gleiche Mengen von cyan, magenta und gelb<br />

Darstellung: wie CMY mit zusätzlicher Schwarzangabe<br />

Anwendung: Drucker mit gesondertem Schwarz-Druck<br />

Transformation: von CMY<br />

k:=min(c,m,y)<br />

c:=c-k , m:=m-k , y:=y-k


139<br />

YIQ-Modell<br />

Struktur: bestehend aus Luminanz (Helligkeit y) und<br />

�y �<br />

Chrominanz (Farbart und Farbsättigung i, q)<br />

Darstellung: NTSC-Format<br />

�<br />

Anwendung: Fernsehen in Farbe mit Kompatibilität zu Schwarz/Weiß<br />

��<br />

�<br />

� �<br />

��<br />

�y<br />

i<br />

�q<br />

Transformation: von RGB<br />

� ��<br />

� �<br />

�<br />

r<br />

g<br />

b<br />

587<br />

.<br />

0<br />

299<br />

.<br />

0<br />

� ��<br />

�<br />

0 . 275<br />

�<br />

�<br />

� �<br />

�<br />

� ��<br />

0.<br />

114<br />

0.<br />

321<br />

� �<br />

0.<br />

321<br />

0.<br />

311 �<br />

523<br />

.<br />

0<br />

�<br />

� ��<br />

�<br />

0 . 596<br />

��<br />

0.<br />

212<br />

� ��<br />

� �<br />

�<br />

y<br />

i<br />

q<br />

� ��<br />

� �<br />

�<br />

YUV-Modell<br />

Struktur: bestehend aus Luminanz (Helligkeit y) und<br />

Ch i ( i F bdiff ) � �<br />

� �y<br />

Chrominanz (zwei Farbdifferenzen u, v)<br />

Darstellung: PAL- und SECAM-Format<br />

�<br />

Anwendung: Fernsehen in Farbe mit Kompatibilität zu Schwarz/Weiß<br />

Transformation: nach YIQ (durch Rotation im Farbraum)<br />

��<br />

� �<br />

�<br />

�<br />

�v u<br />

Q ( )<br />

y = y<br />

i = - u sin 33° + v cos 33°<br />

q = u cos 33° + v sin 33°


140<br />

HSV-Modell<br />

� ��<br />

� �<br />

�<br />

� ��<br />

h<br />

�<br />

s<br />

�� v<br />

s<br />

Struktur: Kombination aus Farbton (hue), ( ), Sättigung g g ( (saturation) ) und Helligkeit g ( (value) )<br />

Darstellung: Farbpyramide, -kegel oder -zylinder<br />

HLS-Modell<br />

�<br />

� ��<br />

��<br />

� ��<br />

�h<br />

l<br />

��<br />

s<br />

Struktur: Kombination aus Farbton (hue), Helligkeit (lightness) und Sättigung (saturation)<br />

Darstellung: Farbdoppelpyramide , -kegel oder -zylinder (senkrechte Projektion<br />

des Farbwürfels entlang der Hauptdiagonale von schwarz nach weiß)<br />

Anwendung: Farbeingabe Farbeingabe, Farbauswahl<br />

Transformation: von RGB<br />

sum � (max( r,<br />

g,<br />

b)<br />

� min( r,<br />

g,<br />

b))<br />

h � ( g � b)<br />

/ dif für r � max( r,<br />

g,<br />

b)<br />

diff � (max( ( ( r,<br />

g g,<br />

b ) � min( ( r,<br />

g g,<br />

b ))<br />

h � 2 � ( b � r ) / diff<br />

für f g � max( ( r,<br />

g g,<br />

b )<br />

h � 4 � ( r � g)<br />

/ dif für b � max( r,<br />

g,<br />

b)<br />

l � sum / 2 s � dif / sum für l � 0.<br />

5<br />

s � dif /( 2 � sum)<br />

für l � 0.<br />

5 h : � h � 6 für h � 0;<br />

h : � h*<br />

60<br />

W<br />

B<br />

W<br />

R<br />

G<br />

B<br />

B<br />

Foley u.a.: Computer Graphics, Addison-Wesley, 1996


141<br />

10. Rasterkonvertierung g von<br />

Linien und Flächen<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Kennenlernen grundlegender g g Konzepte p der 2D-Rastergrafik g<br />

• Vorstellung von Verfahren zum Rasterkonvertieren und Füllen von Objekten<br />

Abschnitte:<br />

- Problematik<br />

- Rasterkonvertierung von Linien<br />

- Füllen von Flächen<br />

- Muster, Stil, Dicke<br />

- ZZeichenerzeugung i h<br />

2D-Basisalgorithmen<br />

der Rastergrafik


142<br />

Problematik<br />

Rasterverfahren: Verfahren Verfahren, die die auf unterster unterster Ebene eines Rastergrafiksystems grafische Primitive, Primitive<br />

aus denen eine Szene besteht, in Rasterpunkte (Pixel) zerlegen<br />

VVoraussetzung: t<br />

- Grafikhardware, insbesondere Rechner und Rasterdisplay<br />

- Grafiksoftwaresystem mit Programmierschnittstelle für Pixelgrafikfunktionen<br />

- GGrafisches fi h MModell d ll einer i Szene S zerlegt l t in i grafische fi h Primitive P i iti<br />

- Zugriffsfunktionen für Framebuffer zur Aufnahme der Pixelgrafik<br />

Aufgabe:<br />

- Algorithmen zum Rasterkonvertieren und Füllen<br />

- Generierung der Pixel im Framebuffer<br />

- Einbindung in die Ausgabe-Pipeline<br />

Ausgabe Pipeline<br />

Grafik<br />

Probleme:<br />

- Effizienz<br />

- Lückenbildung<br />

- Treppenbildung<br />

- Stärkedifferenz<br />

- Musterbildung


143<br />

Rasterkonvertierung von Linien<br />

Rasterkonvertierung von Linien: Entwicklung von von Algorithmen zum zum Zeichnen Zeichnen der der Pixel des des Randes Randes<br />

von zweidimensionalen primitiven geometrischen Objekten (Scan Converting)<br />

Zeichnen von Linien:<br />

Inkrementeller Linien-Scan-Algorithmus:<br />

Prinzip: - Berechnung des Anstiegs<br />

- Berechnung des Startpixels<br />

- Erhöhung des Argumentwertes<br />

- Berechnung des Funktionswertes<br />

- Ermittlung g des zum Funktionswert nächsten Pixels<br />

Vorschrift: y � mx � n yi�1<br />

� yi<br />

� m�x<br />

Voraussetzung: m � 1 , sonst Ausnutzung von Symmetrie<br />

Eigenschaft: ineffiziente Gleitkommaarithmetik<br />

Algorithmus:<br />

void Line(int x0,int y0,int x1,int y1,int v){<br />

int x; double dy=y1-y0; double dx=x1-x0;<br />

double m=dy/dx; m dy/dx; double double yy=y0; y0;<br />

for (x=x0; x


144<br />

Mittelpunkt-Linien-Algorithmus: (Bresenham)<br />

Prinzip: - Ermittlung des Startpixels, Initialisierung der Entscheidungsvariable<br />

- IInkrementelle k ll Berechnung B h der d Entscheidungsvariable<br />

E h id i bl<br />

- Entscheidungsvariable gibt an, ob Funktionswert über Mittelpunkt zweier Pixel liegt<br />

- Zeichnung des unteren oder oberen Pixels<br />

Vorschrift: Vorschrift:<br />

y � dy dx x � n<br />

explizite Geradenform<br />

f ( x,<br />

y)<br />

� dy � x � dx � y � n � dx � 0 implizite Geradenform<br />

d<br />

Entscheidungsvariable alt<br />

alt � f ( x p �1,<br />

y p �1/<br />

2)<br />

d<br />

EEntscheidungsvariable h id i bl neu für fü Fall F ll E<br />

neuE � f ( x p � 2,<br />

y p �1/<br />

2)<br />

d<br />

Entscheidungsvariable neu für Fall NE<br />

neuNE � f ( x p � 2,<br />

y p � 3/<br />

2)<br />

d dy dx / 2<br />

Startwert der Entscheidungsvariable (bei (0,0))<br />

Start � �<br />

��<br />

� dy<br />

Inkrement bei bei Wahl Wahl des Pixels E<br />

E � dy<br />

� Inkrement bei Wahl des Pixels NE<br />

NE�<br />

dy � dx<br />

...� 2<br />

Verdopplung aller Werte<br />

Voraussetzung: m �1<br />

, sonst Ausnutzung von Symmetrie<br />

Ei Eigenschaft: h ft effiziente ffi i t Festkommaarithmetik<br />

F tk ith tik<br />

Algorithmus:<br />

NE<br />

E<br />

void MidpointLine(int x0,int y0,int x1,int y1,int v){<br />

int dx=x1 dx=x1-x0; x0; int int dy=y1 dy=y1-y0; y0; int int d=2 d=2*dy-dx; dy dx;<br />

int incrE=2*dy; int incrNE=2*(dy-dx);<br />

int x=x0; int y=y0;<br />

WritePixel(x,y,v);<br />

while (x


145<br />

Rasterkonvertierung von Kreisen:<br />

Einfacher Kreis-Scan-Algorithmus: g<br />

2<br />

Prinzip: - Unterteilung in 8 Oktanten nach Symmetrie, Berechnung des 2. Oktanten<br />

(Effizienz- und Darstellungsprobleme bei weniger Segmenten)<br />

- Initialisierung g des Argumentwertes<br />

g<br />

- Erhöhung des Argumentwertes<br />

- Berechnung des Funktionswertes<br />

- Ermittlung der Koordinaten für 8 Pixel<br />

Vorschrift:<br />

2 2<br />

y � r � x<br />

Alternative: x � r cos� , y � r sin�<br />

Eigenschaft: ineffiziente Gleitkommaarithmetik<br />

Algorithmus: g<br />

r<br />

void Circle(int r,int v){<br />

int x; int y; int x1=r/sqrt(2);<br />

for (x=0;x


146<br />

Mittelpunkt-Kreis-Algorithmus: (Bresenham)<br />

Prinzip: - Berechnung des 2. Oktanten (Rest über Symmetrie)<br />

- EErmittlung ittl des d Startpixels, St t i l Initialisierung I iti li i der d Entscheidungsvariable<br />

E t h id i bl<br />

- Inkrementelle Berechnung der Entscheidungsvariable<br />

- Entscheidungsvariable gibt an, ob Funktionswert über Mittelpunkt zweier Pixel liegt<br />

- Zeichnung g des oberen oder unteren Pixels<br />

Vorschrift:<br />

2 2 2<br />

f ( x,<br />

y)<br />

� x � y � r � 0 implizite Kreisform<br />

d<br />

Entscheidungsvariable alt<br />

alt � f ( x p �1,<br />

y p �1/<br />

2)<br />

d f ( 2 1/<br />

2)<br />

EEntscheidungsvariable t h id i bl neu für fü Fall F ll EE<br />

neuE � f ( x p � 2,<br />

y p �1/<br />

2)<br />

dneuSE<br />

� f ( x p � 2,<br />

y p � 3/<br />

2)<br />

Entscheidungsvariable neu für Fall SE<br />

d r<br />

Startwert der Entscheidungsvariable (bei (0,r))<br />

Start � 5 / 4 �<br />

� � 2 � 3<br />

Inkrement bei Wahl von Pixels E<br />

E x p<br />

� SE�<br />

2( x p � y p ) � 5<br />

Inkrement bei Wahl von Pixel SE<br />

…-1/4 Subtraktion vom Startwert<br />

Ei Eigenschaft: h ft effiziente ffi i t Festkommaarithmetik<br />

F tk ith tik<br />

Algorithmus:<br />

void MidpointCircle(int r,int v){<br />

int x=0; x 0; int yy=r; r; int int dd=1-r; 1 r;<br />

CirclePoints(x,y,v);<br />

while (y>x){<br />

if (d


147<br />

Mittelpunkt-Kreis-Algorithmus mit Differenzen 2. Ordnung:<br />

Prinzip: - direkt berechnete Deltafunktionen für Entscheidungsvariable sind lineare Gleichungen<br />

- ddamit it inkrementelle i k t ll Berechnung B h auchh der d Deltafunktionen D lt f kti möglich ö li h<br />

Vorschrift:<br />

( x<br />

alter Punkt<br />

p, y p )<br />

( x p �1<br />

, y p )<br />

neuer Punkt bei E<br />

( x p �1, y p �1)<br />

neuer Punkt bei SE<br />

� Enew � � Eold � 2<br />

Differenz im Fall E (dx=1, dy=0)<br />

� SEnew � � SEold � 2<br />

Differenz im Fall E (dx=1, dy=0)<br />

��<br />

� 2<br />

Diff Differenz iim FFall ll SE (dx=1, (d 1 ddy=-1) 1)<br />

Enew � � Eold � 2<br />

� SEnew � � SEold � 4<br />

Differenz im Fall SE (dx=1, dy=-1)<br />

Eigenschaft: hoch effiziente Festkommaarithmetik<br />

Al Algorithmus: ith<br />

void MidpointCircleSecondOrder(int r,int v){<br />

int x=0; int y=r; int d=1-r; int dE=3; int dSE=-2*r+5;<br />

CirclePoints(x,y,v); ( ,y, );<br />

while (y>x){<br />

if (d


148<br />

Füllen von Flächen<br />

Füllen von Flächen: Entwicklung elementarer elementarer Algorithmen zum zum Belegen der der inneren inneren Pixel von von<br />

primitiven zweidimensionalen Objekten (Filling)<br />

Anwendung: Füllung beliebiger Objekte, Schraffur, dicke Linien, Zeichen, Schattierung, Rendering<br />

Aufgaben: Ermittlung der Pixel, Bestimmung der Farbe<br />

Klassen: pixelorientiert, kantenorientiert<br />

Pixelorientiertes Füllen: Füllen:<br />

Flutungs-Algorithmus:<br />

Prinzip: - Start mit Pixel im Innern des Objektes<br />

- Färben des Pixels<br />

- Ermittlung von benachbarten Pixeln<br />

- Ausschluss der Pixel, die bereits gefärbt sind oder zum Rand gehören<br />

- Rekursiver Aufruf Aufruf mit mit neuen Pixeln Pixeln<br />

Voraussetzung: Objekt mit geschlossenem Rand bekannter Farbe<br />

Eigenschaft: allgemeingültiges Verfahren, ineffiziente Rekursion, Auslaufen<br />

Algorithmus:<br />

void FloodFill(int x,int y,int vr,int vf){<br />

if (ReadPixel(x,y)!=vr && ReadPixel(x,y)!=vf){<br />

WritePixel(x,y,vf);<br />

FloodFill(x FloodFill(x,y-1,vr,vf); y 1 vr vf); FloodFill(x FloodFill(x,y+1,vr,vf);<br />

y+1 vr vf);<br />

FloodFill(x-1,y,vr,vf); FloodFill(x+1,y,vr,vf);}}


149<br />

Scanlinienorientiertes Füllen:<br />

Rechteck-Füll-Algorithmus: g<br />

Prinzip: - Verwendung vertikal angeordneter horizontaler Scanlinien<br />

- Bestimmung der Parameter der Scanlinien durch Extremwerte des Rechtecks<br />

- Durchlaufen der Scanlinien und Färben der Pixel<br />

Voraussetzung: achsenparallele Lage<br />

Algorithmus:<br />

void RectangleFill(int x0,int x1,int y0,int y1,int v){<br />

int x; int y;<br />

for (y=y0;y


150<br />

Polygon-Füll-Algorithmus:<br />

Prinzip: p - Verwendung g vertikal angeordneter g horizontaler Scanlinien<br />

- Berechnung der Schnittpunkte der Scanlinien mit Polygonkanten<br />

- aufsteigende Ordnung der Schnittpunkte<br />

- Bestimmung der inneren Bereiche über Ungeradzahligkeitsregel<br />

- Füllen der der inneren inneren Bereiche Bereiche auf auf der der Scanlinie<br />

Vorschrift: ( xn, yn<br />

) n � 0 Schnittpunkte zwischen Polygonkanten und Scanlinie<br />

x2n�1 � x � x2n<br />

Ungeradzahligkeitsregel<br />

ET ( y , , , 1 ) Kantentabelle geordnet nach ymin<br />

min min, y max max,<br />

x min min,<br />

m)<br />

aktuelle Kantentabelle geordnet nach x (Schnittpunkte mit Scanlinie)<br />

y y<br />

AET y , x,<br />

1 m)<br />

( max<br />

ymin<br />

ET / AET:<br />

Algorithmus:<br />

xmin<br />

Setze y auf kleinsten in ET vorkommenden Wert;<br />

Lösche AET;<br />

Wiederhole bis AET und ET leer {<br />

Hole aus ET alle Kanten in AET, für die ymin=y;<br />

Entferne aus AET alle Kanten für die y=ymax;<br />

Sortiere AET nach x;<br />

Fülle Pixel der Scanlinie nach Paaren in AET<br />

(gemäß Ungeradzahligkeitsregel)<br />

Erhöhe y um 1;<br />

Aktualisiere x-Werte in AET gemäß 1/m; }


151<br />

Nachteile:<br />

- Horizontale Kanten (müssen gesondert behandelt werden)<br />

- Schmale Polygone (auftretende Lücken müssen geschlossen werden)<br />

- nichtganzzahlige Endpunkte (Ausgleich von Rundungsfehlern)<br />

- doppelte End- End und Schnittpunkte (dürfen nur nur einmal einmal gezeichnet gezeichnet werden) werden)<br />

- Berührung und Überlappung von Polygonen (Behandlung der Randbereiche)<br />

Vorteile:<br />

- Bereichskohärenz (Bereich ändert sich nur geringfügig zur nächsten Scanlinie)<br />

- Kantenkohärenz (Kanten treten meist auch bei nächster Scanlinie wieder auf<br />

� Kombination mit Algorithmus zur Rasterkonvertierung von Linien


152<br />

Muster, Stil, Dicke<br />

Muster Muster, Stil, Stil Dicke: Dicke: spezielle Füllaufgaben, Füllaufgaben die gesonderte gesonderte Lösungen Lösungen erfordern, erfordern jedoch im im<br />

Zusammenhang mit Zeichen- und Füllalgorithmen behandelt werden können<br />

Muster: Muster:<br />

- Darstellung als Bitmap mit Werten 1, 0<br />

- Verankerung: Musterpunkt an Polygonpunkt oder Fensterpunkt<br />

- Indexierung: WritePixel(x,y,(b[x%m][y%n]));<br />

- VVerfahren: f h SScanlinien li i (fensterorientiert), (f i i ) Rechtecke R h k (polygonorientiert)<br />

( l i i )<br />

Stil:<br />

- Darstellung als Bitvektor Bitvektor mit Werten 0, 0, 1<br />

- Verankerung: Stilpunkt an Linienpunkt<br />

- Indexierung: WritePixel(x,y,(b[i(x,y)%m]));<br />

- Verfahren: Scanlinien, Liniensegmente<br />

Dicke:<br />

- Verwendung eines dicken Pinsels<br />

- Fragen: g Pinselform, , Pinselorientierung, g, Linienenden, , Polygonecken yg<br />

- Verfahren: - spalten- oder zeilenweise Wiederholung<br />

- Wiederholung in Normalenrichtung<br />

- quadratischer oder kreisförmiger Bereich<br />

- Flä Flächenfüllung h füll zwischen i h zwei i Linien<br />

Li i


153<br />

Zeichenerzeugung<br />

Zeichenerzeugung: Darstellung von von Zeichen Zeichen (Buchstaben, (Buchstaben Ziffern, Ziffern Sonderzeichen) als Bitmap oder oder<br />

polygonal begrenzten gefüllten Bereich<br />

Allgemeines:<br />

Allgemeines:<br />

- Erzeugung eines Fonts mit je einer Repräsentation für alle Zeichen<br />

- Bereitstellen von Operationen zur Veränderung aller Zeichen eines Fonts<br />

Bi Bitmap-Darstellung:<br />

D ll<br />

- explizite Darstellung<br />

- Aufbau durch Einscannen oder Zeichnen vergrößerter Darstellungen einzelner Zeichen<br />

- Manipulation, z. B. bold, bold, italic<br />

- Bereitstellung von Zusatzinformationen, z.B. Höhe, Breite, Abstände<br />

- Verwendung durch zeilenweises Scannen oder Übertragung des rechteckigen Bereiches<br />

PPolygon-Darstellung: l D t ll<br />

- implizite Darstellung<br />

- Polygonale oder polynomiale Darstellung einer Folge von Kurvensegmenten (Splines)<br />

- Manipulation, p , z.B. bold, , italic, , scale, , rotate<br />

- Bereitstellung von Zusatzinformationen<br />

- Verwendung durch Konturzeichnen und Füllen


154<br />

11. Klippen pp und Glätten<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Rastergrafikverfahren zur Ergänzung der Basisverfahren<br />

• Effiziente Algorithmen zur Vermeidung negativer Effekte<br />

Abschnitte:<br />

- Problematik<br />

- Klippen von Objekten<br />

- Glätten von Kanten<br />

- Fortgeschrittene Rastergrafikalgorithmen<br />

Rastergrafikalgorithmen<br />

2D-Aufbaualgorithmen<br />

der Rastergrafik


155<br />

Problematik<br />

Klippen und Glätten: Verfahren der Rastergrafik, die in Kombination mit Basisalgorithmen<br />

geometrische Primitive in Abhängigkeit von Größe und Auflösung des Anzeigebereiches bearbeiten<br />

Voraussetzung:<br />

- Algorithmen g zum Rasterkonvertieren und Füllen grafischer g Primitive<br />

- Informationen über Größe und Auflösung des Anzeigebereiches<br />

Aufgabe: g<br />

- Algorithmen zum Klippen und Glätten<br />

- Einbindung in die Basisrasteralgorithmen<br />

Probleme:<br />

- Effizienz<br />

- Speicherbereichsüberlauf<br />

- Bereichsbeeinflussung<br />

- Bildumlauf<br />

- Visuelle Effekte


156<br />

Klippen von Objekten<br />

Klippen: Verfahren zum Entfernen aller Teile geometrischer Primitive, die außerhalb eines<br />

achsenparallelen rechteckigen Bereiches liegen (Clipping)<br />

Klippen Klippen von von Linien:<br />

Voraussetzung:<br />

- Menge von darzustellenden geraden Linien<br />

- rechteckiger achsenparalleler achsenparalleler Bereich (Klipp-Region)<br />

(Klipp-Region)<br />

- gegebenenfalls Drehung von Primitiven und Bereich<br />

Analysieren:<br />

- Bestimmung von Schnittpunkten und damit Intervallen<br />

- y � mx � n , x � x � x � x � y � y � y � y<br />

max<br />

min<br />

max<br />

min<br />

Beschneiden:<br />

- Durchführen zusätzlicher Tests bei Rasterkonvertierung (Scissoring)<br />

- xmin � x � x , y � y � y<br />

max<br />

min<br />

max<br />

Kopieren:<br />

- Zeichnen in ein großes virtuelles Fenster<br />

- Verwendung eines Fensterausschnittes zur Anzeige<br />

Parametergleichungen:<br />

- Verwendung von Parametergleichungen mit Parameterintervall<br />

- x<br />

� xmin<br />

� t(<br />

xmax<br />

� xmin<br />

) , y � ymin<br />

� t(<br />

ymax<br />

� ymin<br />

) , 0 � t �1


157<br />

Cohen-Sutherland Algorithmus:<br />

Bereiche um Klipp-Region durch Bit-Codes C verschlüsselt<br />

li links: k x � xmin<br />

00<strong>01</strong><br />

rechts: x � xmax<br />

0<strong>01</strong>0<br />

unten: y � y <strong>01</strong>00<br />

min<br />

oben: y � y max 1000<br />

10<strong>01</strong> 1000 1<strong>01</strong>0<br />

Algorithmus:<br />

00<strong>01</strong> 0000 0<strong>01</strong>0<br />

<strong>01</strong><strong>01</strong> <strong>01</strong>00 <strong>01</strong>10<br />

for (jede Strecke){<br />

Zuordnung von von Bit-Codes Bit Codes zu zu Endpunkten pp, q ;<br />

Test1: if ((C(p)vC(q))==0) Strecke ganz sichtbar;<br />

Test2: if ((C(p)^C(q))!=0) Strecke ganz unsichtbar;<br />

Ermittle Menge M der Strecken für die Test1 und Test2<br />

nicht erfüllt;}<br />

while (Menge M dieser Strecken nicht leer){<br />

Wähle eine dieser Strecken aus;<br />

Wähle Endpunkt dieser Strecke mit C(p)!=0;<br />

Wähle Bit dieses Endpunktes Endpunktes mit mit Wert 1; 1;<br />

Berechne Schnittpunkt der Strecke mit zu diesem<br />

Bit gehöriger Gerade;<br />

Ermittle neuen Bit-Code dieses Schnittpunktes;<br />

Verwende diesen Schnittpunkt Schnittpunkt als neuen Endpunkt<br />

der Strecke;<br />

Führe Test1 und Test2 mit neuer Strecke aus;<br />

Füge die Strecke zu M hinzu, falls Test1 und<br />

Test2 nicht nicht erfüllt;}<br />

erfüllt;}


158<br />

Cyrus-Beck Algorithmus:<br />

- Berechnung von Schnittpunkten ti zwischen Strecken und Kanten<br />

- Parameterdarstellung der Strecke: P ( t)<br />

� P0<br />

� ( P1<br />

� P0<br />

) t<br />

- Skalarprodukt für Schnittpunktbestimmung: N<br />

: Rand,<br />

i �( P(<br />

t)<br />

� PEi<br />

) � 0<br />

0: außen<br />

Ni<br />

�(<br />

P0<br />

� PEi<br />

)<br />

- Bestimmung Bestimmung von von t:<br />

t �<br />

D � P � P<br />

Ni<br />

D<br />

- Zuordnung einer Halbebene zu jeder Kante<br />

- Berechnung: Ni*D=0: Winkel = 0°, Strecke – Kante parallel<br />

N D>0 Wi k l 0: Winkel


159<br />

Klippen von Kreisen und Ellipsen:<br />

- Klipp-Test mit Bounding Boxes für Kreis/Ellipse, ihre Quadranten und Oktanten<br />

- gegebenenfalls b f ll gleichzeitige l i h i i analytische l i h Berechnung h der d Schnittpunkte h i k für f Oktanten k<br />

- Rasterkonvertierung mit ermittelten Start- und Endpunkten<br />

Klippen pp von Polygonen: yg<br />

Sutherland-Hodgman Algorithmus:<br />

Aufgabe: Klippen eines beliebigen Polygons an einem konvexen Klipp-Polygon<br />

Anwendbarkeit: 2D 2D Rechtecke, Rechtecke …, 3D Polyeder als als Klipp Klipp-Polygone Polygone<br />

Voraussetzung: ungeklipptes Polygon als Punktfolge<br />

Resultat: geklipptes Polygon als Punktfolge<br />

Algorithmus:<br />

- Verwaltung einer aktuellen Menge von Eckpunkten des Polygons<br />

- schrittweises Klippen des Polygons an allen Kanten des Klipp-Polygons<br />

- in jedem j Schritt Durchlaufen aller Punkte des Polygons yg<br />

- für jeden Punkt Untersuchung der folgenden<br />

Polygonkante in Beziehung zu Klippkante<br />

- gegebenenfalls Klippen der Polygonkante<br />

- gegebenenfalls g g Hinzufügen g einer Polygonkante<br />

yg<br />

Fallunterscheidung:<br />

1 Polygonkante sp liegt innerhalb: p hinzufügen<br />

2 Polygonkante sp schneidet von innen nach außen<br />

bei Schnittpunkt p i: i hinzufügen g<br />

3 Polygonkante sp liegt außerhalb: kein Aktion<br />

4 Polygonkante sp schneidet von außen nach innen<br />

bei Schnittpunkt i: i und p hinzufügen


160<br />

Klippen am 3D Sichtvolumen:<br />

* Generelles Vorgehen:<br />

- Algorithmen lassen sich vom 2D Raum analog auf den 3D Raum übertragen<br />

- Klipp-Volumen ist ein Quader<br />

- praktisch praktisch ist meist ein Klippen am am kanonischen kanonischen Volumen Volumen ausreichend ausreichend<br />

- Anwendung für parallele und perspektivische Projektion<br />

* Cohen-Sutherland Algorithmus:<br />

- Verwendung eines 6-stelligen Bit-Codes (parallel / perspektivisch):<br />

oben: 100000 y>1 y>-z<br />

unten: <strong>01</strong>0000 y-z x> z<br />

links: 00<strong>01</strong>00 x


161<br />

Glätten von Kanten<br />

Glätten: Ausgleich von von Sprüngen Sprüngen in in der Darstellung von von Kanten, Kanten die sich durch durch die Verwendung von von<br />

Rasterungen ergeben (Antialiasing)<br />

Ansätze Ansätze aus grafischer Sicht:<br />

Signaltheorie:<br />

- Sampling: Auswahl einer endlichen Menge von Werten eines Signals<br />

- Reconstruction: Regenerierung Regenerierung des Originalsignals aus aus seinen Samples<br />

- Re-/Supersampling: Erstellung eines Samples aus mehreren Samples<br />

- Aliasing: Auftreten niederfrequenter Signale bei der Darstellung hochfrequenter Signale<br />

- Rasterung: Scharfe Übergänge zwischen den Pixeln wegen in Samples nicht enthaltenen<br />

hochfrequenten Komponenten des Originalsignals<br />

Signal Signal<br />

Sampling Reconstruction<br />

Sample Sample<br />

Re-/Super-<br />

sampling<br />

Vorfilterung:<br />

- darzustellendes Objekt ist vollständig bekannt<br />

- Pixelwert wird durch Integration über zugehöriger Fläche berechnet<br />

- Filterung vor dem Sampling<br />

- analytisches Verfahren<br />

Nachfilterung:<br />

- darzustellendes Objekt ist nur an bestimmten Punkten bekannt<br />

- Pixelwert wird aus mehreren korrespondierenden<br />

Samples berechnet berechnet<br />

- Filterung nach dem Sampling (Re-/Supersampling)<br />

- synthetisches Verfahren


162<br />

Vorfilterungsverfahren:<br />

Flächensampling: p g<br />

Aufgabe: Glätten von Linien während der Rasterkonvertierung<br />

Prinzip: Ausgleich fehlender räumlicher Auflösung durch radiometrische Auflösung<br />

Voraussetzung: g Rasterpunkte p werden als quadratische q Flächen betrachtet<br />

Annahme: Linien haben bei der Darstellung stets eine Dicke, Darstellung als Rechteck<br />

Folgerung: Linie liefert Intensitätsbeitrag zu allen Flächen, die sie schneidet<br />

Intensitätswert berechnet sich aus Anteil der überdeckten Pixelfläche<br />

Ergebnis: gradueller, gradueller weicher weicher Übergang Übergang zwischen zwischen Linie und und Umgebung Umgebung<br />

Nachteil: schlechtere Unterscheidung zu originalen Grauwertlinien<br />

Algorithmus:<br />

- Integration der Signalwerte über ein Quadrat<br />

zentriert im Rasterpunkt<br />

- Division des Integralwertes durch die<br />

Quadratfläche<br />

- Verwendung des Quotienten als Intensitätswert<br />

des Pixels<br />

Integration:<br />

- Zerlegung jedes jedes Pixels Pixels (Quadrates) in Subpixel<br />

(Teilquadrate)<br />

- Zählen der überlappten Subpixel (Teilquadrate)


163<br />

Ungewichtetes Flächensampling:<br />

Merkmale:<br />

- IIntensität t ität sinkt i kt nicht i ht mit it Ab Abstand t d ddes Pi Pixelzentrums l t von der d Linie Li i<br />

- Nicht schneidende Linien beeinflussen Pixelintensität nicht<br />

- Gleiche Schnittflächen bewirken gleiche Pixelintensitäten<br />

Realisierung<br />

- Quadrat als Pixelfläche<br />

- konstante Gewichtsfunktion, Quader-Filter I=cImax<br />

Vorteile:<br />

- llokale k l Definition D fi iti<br />

- hohe Effizienz<br />

Gewichtetes Flächensampling:<br />

Merkmale:<br />

- Intensität sinkt mit Abstand des Pixelzentrums von der Linie<br />

- Nicht schneidende Linien beeinflussen Pixelintensität nicht<br />

- Gleiche Schnittflächen näher des Pixelzentrums bewirken<br />

größere Pixelintensitäten<br />

Realisierung:<br />

- Kreis größer als als Pixelfläche Pixelfläche<br />

- variable Gewichtsfunktion, Kegel-Filter I=W(x,y)Imax<br />

Vorteile:<br />

- Überlappung der Kreise vermeidet Lücken<br />

- Rotationssymmetrie<br />

- lineare radiale Funktion<br />

- Unabhängigkeit gegenüber geometrischen Transformationen


164<br />

Gupta-Sproull-Algorithmus:<br />

Aufgabe: Integration des Kegel-Filters in Rasterkonvertierungsalgorithmus<br />

Filt Filter: vorberechnete b h t Werte W t in i Tabelle: T b ll Filt Filter(D,t) (D t)<br />

Liniendicke: Konstante t<br />

vdx<br />

Abstand: zwischen Pixel- und Linienmittelpunkt D � v cos�<br />

�<br />

2 2<br />

Nenner: Konstante<br />

dx � dy<br />

Zähler: inkrementelle Berechnung d � F(<br />

M ) � F(<br />

x p �1,<br />

y p �1<br />

2)<br />

für E: d � dx � 2vdx � F(<br />

x p �1,<br />

y p )<br />

für NE: d � dx � 2vdx � F(<br />

x p �1,<br />

y p �1)<br />

Algorithmus:<br />

void AntialiasedLineMidpoint(int x0,int y0,int x1,int y1){<br />

int dx=x1-x0; int dy=y1-y0; int d=2*dy-dx;<br />

int incrE=2*dy; int incrNE=2*(dy-dx); int two_v_dx=0;<br />

double invDenom=1.0/(2.0*sqrt(dx*dx+dy*dy));<br />

double two_dx_invDenom=2.0*dx*invDenom;<br />

int x=x0; int y=y0;<br />

IntensifyPixel(x,y,0);<br />

IntensifyPixel(x,y+1,two_dx_invDenom);<br />

IntensifyPixel(x,y-1,two_dx_invDenom);<br />

while(x


165<br />

Nachfilterungsverfahren:<br />

Reines Punktsampling: p g<br />

- Pixelintensität ergibt sich nur aus Wert des Samples an der Stelle P(x,y)<br />

- Keine Glättung möglich, Lücken entstehen<br />

- Verwendung eines festen regulären Gitters<br />

Statisches Supersampling:<br />

- Kombination mehrerer Samples und Kombination deren Werte<br />

- Festes reguläres g Gitter<br />

- Verwendung von 5, 9 oder mehr Werten der räumlichen Umgebung<br />

- Hoher Samplingrate sind Grenzen durch Effizienz gesetzt<br />

Adaptives Supersampling:<br />

Supersampling:<br />

- Variation der Samplingrate über das Bild<br />

- Anpassung der Rate an den konkreten Bildinhalt<br />

- Unterteilung, wenn Differenz der Samplewerte Schranke überschreitet<br />

- Erhöhung der Rate an Objektkanten, Erniedrigung im Objektinnern<br />

Stochastisches Supersampling:<br />

- Positionierung der der Samples Samples an stochastisch bestimmten bestimmten Positionen<br />

- Verwendung von Verteilungsfunktionen (Normal, Poisson)<br />

- Erzeugung von Rauschen und künstlichen Mustern<br />

� Kombination der Verfahren möglich und sinnvoll


166<br />

Fortgeschrittene Rastergrafikalgorithmen<br />

Rasterkonvertierung:<br />

- Allgemeine Kegelschnitte (Kreis, Ellipse, Parabel, Hyperbel mit Transformationen)<br />

- Dicke Primitive (Linien, Polygone mit End- und Eckpunktbehandlung)<br />

- Berücksichtigung von Linienattributen<br />

Füllen:<br />

- Rekursives Füllen mit erweiterter Entscheidungslogik (Definition von Innerem und Rand)<br />

- Soft-Fill (Objekte mit unscharfen Kanten)<br />

Klippen:<br />

- Nicholl-Lee-Nicholl (Linie an Rechteck mit erweiterter Fallauswahl)<br />

- Liang-Barsky (Polygon an Rechteck mit Bestimmung von Kanten in Eckregionen)<br />

- Weiler (Polygon an Polygon mit Bestimmung gemeinsamer Regionen)<br />

Glätten:<br />

- Kreisglättung (Verwendung konzentrischer Kreise statt Halbebenen)<br />

- Glättung von quadratischen und kubischen Kurven (Berechnung von horizontalen, vertikalen oder<br />

diagonalen Kurvenabständen)<br />

- Glättung allgemeiner Kurven Kurven (Darstellung (Darstellung als Polylinie oder oder Pinsel mit geglättetem geglättetem Muster)<br />

- Glättung von Linienenden (Berücksichtigung des Abstandes von mehreren Kanten)<br />

Text:<br />

- Kombination aus Masterobjekt Masterobjekt und Samplegitter Samplegitter und Filterfunktion<br />

Filterfunktion<br />

- Vorberechnung und Speicherung aller möglicher Erscheinungsformen eines Zeichens


167<br />

12. Sichtbarkeitsbestimmungg<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Kennenlernen von Verfahren zur Bestimmung sichtbarer Flächen<br />

• Effiziente Algorithmen und deren Anwendung<br />

Abschnitte:<br />

- Sichtbarkeitsproblematik<br />

- Optimierungstechniken<br />

- Sichtbarkeitsbestimmungsalgorithmen<br />

Verfahren zur Bestimmung<br />

sichtbarer Flächen


168<br />

Sichtbarkeitsproblematik<br />

Bestimmung Bestimmung, welche Linien und und Flächen von von Objekten einer einer Szene Szene von von einem Betrachterstandpunkt aus aus<br />

nicht durch andere Objekte verdeckt werden, so dass eine ausschließliche Darstellung dieser möglich ist<br />

(visible-line/surface determination, hidden-line/surface elimination)<br />

Problemdefinition:<br />

- gegeben: Menge M von n Objekten o mit Form und Lage, Augpunkt a mit Position<br />

- gesucht: gesucht: Punkt k der Oberfläche f des Objektes Objektes o aus der Menge M, der der vom<br />

Augpunkt a sichtbar ist<br />

- Objekte: Menge von Flächen, Strecken oder Punkten<br />

Kl Klassen von Al Algorithmen: ith<br />

* Bildraum-Algorithmen:<br />

- Bestimme für jedes Pixel p das Objekt, das auf einem Strahl dem Betrachter am nächsten liegt<br />

- AAufwand: f d np, einfache i f h Schritte, S h itt Rastergenauigkeit, R t i k it leicht l i ht parallelisierbar ll li i b<br />

- Anwendung: gerätespezifische Darstellung, Rasterdisplay, Drucker<br />

* Objektraum-Algorithmen:<br />

- Bestimme für jedes j Objekt j die Teile, , deren Sicht nicht durch andere Teile von Objekten j verdeckt wird<br />

- Aufwand: n2 , komplexe Schritte, analytische Genauigkeit, schwer parallelisierbar<br />

- Anwendung: geräteunabhängige Darstellung, Vektordisplay, Plotter<br />

* Linien-Algorithmen:<br />

- Bestimmung einer einer Liste von von Liniensegmenten<br />

Liniensegmenten<br />

* Flächen-Algorithmen:<br />

- Bestimmung einer Matrix von Pixelwerten


169<br />

Optimierungstechniken<br />

Techniken der Sichtbarkeitsbestimmung Sichtbarkeitsbestimmung, die zur zur Vereinfachung Vereinfachung der der Berechnungen Berechnungen oder oder<br />

Reduzierung der Objekte führen und damit eine effiziente Algorithmierung ermöglichen<br />

Kostenintensive Operationen: - Bestimmung Schnittpunkt Projektionsstrahl - Objektfläche<br />

- Bestimmung Schnittpunkt Objekt - Objekt<br />

Kohärenz:<br />

- Grad der Ähnlichkeit zwischen Teilen einer Umgebung oder deren Projektion<br />

- Typischerweise Typischerweise existieren Zusammenhänge Zusammenhänge zwischen Nachbarschaft Nachbarschaft in einer Dimension,<br />

Nachbarschaft in anderer Dimension oder Erscheinungsbild<br />

- Arten: Objekt-, Flächen-, Kanten-, Rasterlinien-, Bereichs-, Tiefen-, Framekohärenz<br />

Perspektivtransformation:<br />

e spe t vt a s o at o :<br />

- Sichtbarkeitsbestimmung im 3D-Raum nach Normalisierung und vor Projektion in 2D-Ebene<br />

- Test auf Verdeckung der Punkte P1=(x1,y1,z1) , P2=(x2,y2,z2) bezüglich Projektionszentrum P=(x,y,0)<br />

Liegen die Punkte auf gleichem Projektionsstrahl und welcher Punkt liegt näher zum Betrachter?<br />

PParallelprojektion: ll l j kti x1=x2 , y1=y2 , z1


170<br />

Hüllenbereiche:<br />

- 2D- oder 3D-Bereiche ermöglichen einfachere Berechnungen und Vorentscheidungen<br />

- Bounding g Box, , Bounding g Volume, , Extent (Rechteck, ( , Q Quader, , Kreis, , Kugel, g , andere Geometrie) )<br />

- einfachste Form: Minimum und Maximum jeder Dimension<br />

- Kostenfunktion: T=bB+oO (Anzahl und Kosten für Bereich und Objekt)<br />

- Ziel: Optimum durch Form der Bereiche<br />

Rückseitenentfernung:<br />

- Entfernung von Flächen, die prinzipiell nicht sichtbar sein können (Backface Culling)<br />

- Beispiele: Innenseiten von Körperoberflächen, dem Betrachter abgewandte Seiten<br />

- EErmittlung: ittl - VVorder- d undd Rü Rückseite k it per Definition D fi iti<br />

- positives Skalarprodukt zwischen Normale und Blickrichtung<br />

Raumunterteilung:<br />

- UUnterteilung t t il des d Raumes R in i Teilräume T il ä unterschiedlicher t hi dli h Größe G öß (Spatial (S ti l Partitioning)<br />

P titi i )<br />

- feste oder adaptive Raumgrößen (z.B. Quadtree, Octree, BSP-tree)<br />

- Zuordnung der Objekte zu Teilräumen<br />

- Suche und Berechnungen g in Teilräumen<br />

Hierarchisierung:<br />

- Unterteilung von Objekten in Bestandteile gemäß räumlicher Beziehungen


171<br />

Sichtbarkeitsbestimmungsalgorithmen<br />

Algorithmen Algorithmen, die in effizienter effizienter Weise Objekte Objekte einer einer Szene Szene bestimmen, bestimmen die von von einem einem Betrachterstandpunkt<br />

aus sichtbar sind; Unterscheidung nach Art der Objekte und angewendetem Verfahren<br />

Algorithmen g zur Bestimmung g sichtbarer Linien:<br />

Objektraum-Linien-Algorithmen<br />

Roberts-Algorithmus:<br />

- Voraussetzung: Strecken als Kanten Kanten konvexer konvexer Polyeder Polyeder<br />

Bestimme Rückseiten der Polyeder;<br />

Entferne Kanten, die Schnittlinien zweier Rückseiten sind;<br />

Schließe Verdeckungen g durch Polyeder y durch Hüllenvergleich g aus;<br />

Vergleiche Kanten auf Verdeckung durch Polyeder;<br />

Entferne komplett verdeckte Kanten, Stutze teilweise verdeckte Kanten;<br />

Setze Algorithmus mit restlicher bzw. neuer Kantenmenge fort;<br />

AAppel-Algorithmus: l Al i h<br />

- Voraussetzung: Strecken als Kanten durchdringungsfreier Polygone<br />

- quantitative Unsichtbarkeit eines Punktes: Anzahl der verdeckenden Polygonvorderseiten<br />

- Konturkante: gemeinsame gemeinsame Kante zwischen Vorder Vorder- und Rückseite einzelner oder oder verbundener verbundener Polygone<br />

Bestimme die Unsichtbarkeit für Eckpunkt einer Kante;<br />

Bestimme Unsichtbarkeit für Segmente entlang der Kante:<br />

Erhöhung bei Passieren einer Konturkante vor Verdeckung;<br />

Erniedrigung bei Passieren einer Konturkante nach Verdeckung;<br />

Solang unverarbeitete Kanten: Beginne Algorithmus von vorn;<br />

Segmente mit Unsichtbarkeit 0 werden gezeichnet;


172<br />

Algorithmen zur Bestimmung des Tiefenpuffers<br />

Bildraum-Flächen-Algorithmen g<br />

z-Puffer-Algorithmus (Catmull):<br />

- Voraussetzung: Polygone oder andere Objekte<br />

- Verfahren: Zeichne Pixel, , wenn dessen Tiefe ggeringer g als bisherige g Tiefe<br />

- Datenstrukturen: Bildspeicher und Tiefenspeicher als 2D-Pixel-Matrizen (frame buffer, z-buffer)<br />

void zBuffer(void) {int x,y;<br />

for(y=0;y


173<br />

Algorithmen mit Prioritätenlisten<br />

kombinierte Objekt-/Bildraum-Flächen-Algorithmen<br />

Datenstruktur: Liste von von Objekten Objekten geordnet geordnet nach nach Tiefeninformationen<br />

Maler-Algorithmus:<br />

- Voraussetzung: in Tiefe separierbare Polygone<br />

- Verfahren: Verfahren: Zeichnen Zeichnen von Objekten gemäß gemäß Betrachterabstand<br />

Sortiere alle Polygone nach ihren kleinsten z-Koordinaten;<br />

Rasterkonvertierung aller Polygone in aufsteigender Reihenfolge;<br />

Tiefensortier-Algorithmus:<br />

- Voraussetzung: Polygone auch mit zyklischer Überlappung<br />

- Verfahren: Zeichnen gemäß Betrachterabstand, Ausschlusskriterien steigender Komplexität,<br />

Austausch bei falscher Reihenfolge, Reihenfolge, Zerlegen bei bei wechselseitigen Abhängigkeiten<br />

Abhängigkeiten<br />

1 Sortiere alle Polygone nach ihren kleinsten z-Koordinaten;<br />

2 Wähle entferntestes Polygon P{<br />

3 P überlappt in x, y oder z kein Polygon:<br />

Rasterkonvertierung von P; �2<br />

4 Wähle ein Polygon Q{<br />

5 Hüllenvolumen von P und Q überlappen sich nicht in x?<br />

6 Hüllenvolumen von P und Q überlappen sich nicht in y?<br />

7 P liegt komplett hinter Ebene von Q?<br />

8 Q liegt komplett vor Ebene von P?<br />

9 P und Q überlappen sich nicht in xy?<br />

10 if(5||6||7||8||9) �4<br />

11 else if(P ist nicht markiert){<br />

markiere Q; vertausche P und Q; �2}<br />

12 else{teile P an Grenzen zu Q; �2}}<br />

13 Rasterkonvertierung von P; �2}


174<br />

Algorithmen mit Rasterlinien<br />

Bildraum-Linien/Flächen-Algorithmen g<br />

Scan-Line-Algorithmus:<br />

- Voraussetzung: sich nicht durchdringende Polygone<br />

- Verfahren: Polygonrasterkonvertierung yg g bei ggleichzeitiger g Behandlung g mehrerer Polygone yg<br />

- Datenstrukturen: Kantentabelle ET, Polygontabelle PT, Aktive Kantentabelle AET<br />

Sortierung der Kanten nach y- und x-Werten,<br />

Verweis auf Polygone, x-Differenz zu nächster Scan-Linie, Flags für Bereiche und Übergänge<br />

- Effizienzsteigerung durch durch Nutzung Nutzung von Rasterlinien Rasterlinien- und Kantenkohärenz auf Basis Basis der Tabellen<br />

- Vorteil: jedes Pixel nur einmal behandelt<br />

- Erweiterungen auf Zeichnen von Flächen<br />

Füge Kanten aus aus PT in in ET ein;<br />

Initialisiere AET;<br />

for(jede Rasterlinie){<br />

Aktualisiere AET aus ET;<br />

for(jedes Pixel){<br />

Setze Bereich-Flags(in,out);<br />

Bestimme auf Pixel projizierende<br />

Kantenpaare aus AET;<br />

Bestimme nächstgelegenes nächstgelegenes Kantenpaar;<br />

Bestimme Wert für Pixel aus PT;<br />

Zeichne Pixelwert;}}<br />

AET: : a AB,AC , C<br />

b AB,AC,FD,FE<br />

g,g+1 AB,DE,CB,FE<br />

g+2 AB,CB,DE,FE


175<br />

Algorithmen mit Flächenunterteilung<br />

Warnock Warnock-Algorithmus:<br />

Algorithmus:<br />

- Bildraum-Flächen-Algorithmus<br />

- Voraussetzung: Polygone<br />

- Verfahren: Verfahren: schrittweise rekursive rekursive Unterteilung in kleinere weniger weniger komplexe komplexe Bereiche Bereiche<br />

- Nutzung von Bereichskohärenz<br />

- 4 Beziehungen Polygon - Bereich: umgebend, schneidend, enthaltend, disjunkt<br />

if(kein Polygon im Bereich){<br />

Bereich){<br />

Füllen Hintergrundfarbe;} //1<br />

if(nur ein schneidendes oder enthaltenes Polygon im Bereich){<br />

Füllen Hintergrundfarbe; //2<br />

Zeichnen Polygon mit mit Polygonfarbe;}<br />

if(nur ein überdeckendes Polygon im Bereich){<br />

Füllen mit Polygonfarbe;} //3<br />

if(ein überdeckendes Polygon im Bereich, das<br />

alle anderen Polygone Polygone in zz überdeckt){<br />

Füllen mit Polygonfarbe;} //4<br />

if(Bereich hat Pixelgröße){<br />

Füllen mit Farbe des am Pixelmittelpunkt<br />

nächsten Polygons;}<br />

Polygons;}<br />

if(sonst){<br />

Zerlegung des Bereiches in Teilbereiche;<br />

Aufruf für jeden Teilbereich;}


176<br />

Weiler-Atherton Algorithmus:<br />

- Objektraum-Linien/Flächen-Algorithmus<br />

- VVoraussetzung: t PPolygone l<br />

- Verfahren: Unterteilung von Polygonen entlang von Polygonkanten<br />

- Nutzung von Bereichskohärenz<br />

- Polygonlisten, yg , Stack zur Erkennung g zyklischer y Überlappungen pp g<br />

void WAVisibilitySurface(void){<br />

polygon *polyList=list of polygons;<br />

sortiere polyList fallend nach maximalem z-Wert;<br />

lö lösche h stack; t k<br />

while(polyList!=NULL)<br />

WASubdivide(firstpolygon on polyList,&polyList);}<br />

void o d WASubdivide(polygon Subd de(po ygo cclipPolygon,polygon p o ygo ,po ygo **polyList){<br />

po y st){<br />

polygon *inList=NULL, polygon *outList=NULL;<br />

for(jedes polygon in *polyList){<br />

klippe polygon an Vorfahre von clipPolygon;<br />

speichere p innere Teile in inList und äußere Teile in outList;} ;}<br />

entferne polygone hinter clipPolygon aus inList;<br />

for(jedes polygon in inList<br />

und nicht auf Stack<br />

und nicht Teil von clipPolygon){<br />

p yg ){<br />

push clipPolygon auf stack;<br />

WASubdivide(polygon,&inList);<br />

pop stack;}<br />

for(jedes (j ppolygon yg in inList){ ){<br />

display polygon;}<br />

*polyList=outList;}


177<br />

Sonstige Verfahren<br />

Algorithmen g für gekrümmte g Flächen:<br />

- Approximation durch Polygone möglich aber nicht immer effizient; Verwendung analytischer<br />

Darstellungen erfordert Anpassung der Algorithmen<br />

Algorithmen g mit Octrees:<br />

- Verwendung einer hierarchischen Struktur räumlich dicht angeordneter disjunkter Würfel, die<br />

den Raum unterteilen, zur Effizienzsteigerung<br />

Algorithmen g mit BSPs:<br />

- Verwendung einer hierarchischen Struktur binärer Zerlegungen des Raumes durch mehrere Ebenen<br />

zur Effizienzsteigerung<br />

Algorithmen g mit Ray y Casting: g<br />

- Verwendung des Ray Tracing zur Ermittlung sichtbarer Flächen; Verfolgung eines virtuellen<br />

Lichtstrahls vom Betrachter durch Bildschirmpixel auf Objektoberflächen der Szene<br />

Darstellung verdeckter verdeckter Kanten Kanten und und Flächen<br />

- keine Darstellung<br />

- anderes Linien- oder Flächenmuster<br />

- andere d Farbe F b<br />

- freier Raum um verdeckende Kanten (haloed Lines)<br />

Kriterien te e für ü Rastergrafikalgorithmen:<br />

aste g a a go t e :<br />

- Funktionalität - Systemunabhängigkeit<br />

- Effizienz - Hardwarerealisierbarkeit


178<br />

13. Geometrische<br />

Transformationen<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Grundlegende 2D und 3D Transformationen der Geometrie<br />

• Verwendung als geometrische Basis der Computergrafik<br />

Abschnitte:<br />

- Affine Räume<br />

- 2D Koordinatensysteme<br />

- Elementare 2D Transformationen<br />

- Komposite i 2D 2 Transformationen f i<br />

- 3D Koordinatensysteme<br />

- Elementare 3D Transformationen<br />

- Komposite 3D 3D Transformationen<br />

- Wechsel von Koordinatensystemen Transformationen in der<br />

2D und 3D Geometrie


179<br />

Affine Räume<br />

Vektorraum: Vn - Menge von Vektoren V, mit Nullvektor als neutrales Element (ursprungsorientiert)<br />

- Operationen: Operationen: - Addition von Vektoren liefert Vektor (kommutativ, assoziativ)<br />

- Multiplikation von Vektor und Skalar liefert Vektor (distributiv, assoziativ)<br />

- Linearkombination von Vektoren und Skalaren spannen Bereich auf a1v1+a2v2+…+anvn Affi Affiner RRaum: A An - Menge von Punkten P und zugeordneter Vektorraum V, ohne neutrales Element (ursprungsinvariant)<br />

- Operationen: - Differenz von Punkten liefert Vektor (eindeutig)<br />

- Addition von von Punkt Punkt und Vektor liefert Punkt Punkt (eindeutig)<br />

- Affinkombination: von Punktpaaren und Skalaren spannen Bereich auf p1+t2(p2-p1)+…+tn(pn-p1) Koordinatensystem: Kn - ZZusammenfassung f von ausgezeichneten i h Punkten P k (Ursprung (U und d Ei Einheitspunkten)<br />

h i k )<br />

- kartesisch: Ursprung und Einheitspunkte, Punkt als Linearkombination (o,e1,e2,…,en) - baryzentrisch: Punkte und Eins-Teilung, Punkt als Affinkombination (p1,p2,…,pn) Koordinaten: kn - kartesisch: p=(a1,a2,…,an) mit p=a1e1+a2e2+…+anen - baryzentrisch: p=(t1,t2,…,tn) mit p=t1p1+t2p2+…+tnpn und t1+t2+…+tn=1


180<br />

Unterraum: Br - linear: r-dimensionale Teilmenge des Vektorraumes<br />

- affin: r-dimensionale Teilmenge des affinen Raumes, für die ein r-dimensionaler Vektorraum<br />

existiert<br />

- Hyperebene Hyperebene ist Unterraum der der Dimension r=n r=n-1 1 (speziell Ebene, Ebene Gerade, Gerade Punkt)<br />

n n<br />

Lineare Abbildung: L : V1<br />

�V2<br />

- Abbildung zwischen Vektorräumen, die als Linearkombination darstellbar ist<br />

n n<br />

Affine Abbildung: � : A1 � A2<br />

- Abbildung zwischen affinen Räumen, die als Affinkombination darstellbar ist<br />

- Zusammenfassung linearer linearer und nichtlinearer nichtlinearer translativer Abbildung Abbildung<br />

- Eigenschaften: Beschränktheit, Parallelität, Längenverhältnisse, Teilungsverhältnisse,<br />

Kollinearität bleiben erhalten<br />

- Längen, Winkel, Flächen- und Rauminhalte können sich verändern<br />

- z.B. Rotation, Skalierung, Translation, Scherung, Spiegelung<br />

- z. B. parallele Projektion, aber keine perspektivische Projektion<br />

Ziel: einheitliche theoretische Grundlage Grundlage für für alle geometrischen geometrischen Darstellungen<br />

Darstellungen<br />

sowie deren Transformationen


181<br />

2D Koordinatensysteme<br />

Homogene Koordinaten<br />

Homogene Koordinaten erlauben durch Hinzufügen einer Koordinate zu kartesischen Koordinaten<br />

die einheitliche Behandlung aller Transformationen über Multiplikation.<br />

P<br />

(0,0,1) (x/W,y/W,1)<br />

x<br />

W=1<br />

Prinzip:<br />

- kartesische Koordinaten: (x,y) W<br />

- homogene Koordinaten: (x,y,W)<br />

- W=1: kartesische Ebene, W=0: Punkte im Unendlichen<br />

- Homogenisierung: Division durch W (x/W,y/W,1)<br />

- kartesischer Punkt hat hat mehrere mehrere homogene Darstellungen:<br />

(x,y,W)=(kx,ky,kW)<br />

- k=const: homogene Gerade<br />

y<br />

Vorgehen:<br />

- Erzeugung homogener Koordinaten: Pk=(x,y) � Ph=(x,y,1) - Transformationen: Ph � Ph' - Erzeugung kartesischer Koordinaten: Ph'=(x,y,W) � Pk'=(x/W,y/W) y<br />

2D Koordinatensystem:<br />

- System aus 2 orthogonalen Achsen x, y<br />

mit Schnittpunkt im Koordinatenursprung<br />

- positiver i i Drehsinn: D h i gegen Uhrzeigersinn<br />

Uh i i<br />

x


182<br />

Elementare 2D Transformationen<br />

Veränderung der Lage von Punkten Punkten in der xy-Ebene xy Ebene durch durch Verschieben, Verschieben Vergrößern und und Drehen<br />

Translation:<br />

- Verschieben eines Punktes in der Ebene<br />

parallel zu x- und y-Achse um die Abstände tx und ty - Skalarform: x'� x �t<br />

x y'�<br />

y � t y<br />

- Matrixform: P'� P � T<br />

� �<br />

� �<br />

� �<br />

�<br />

� �<br />

� �<br />

� �x' x tx<br />

� � � � � � � �<br />

�y'� �y�<br />

�t<br />

y �<br />

Skalierung:<br />

- Vergrößern g eines Punktes bezüglich g Koordinatenursprung p g<br />

parallel zu x- und y-Achse um die Faktoren sx und sy - Skalarform: x'� sx<br />

� x y'�<br />

sy<br />

� y<br />

- Matrixform: P'� S � P<br />

� �<br />

� �<br />

� �<br />

� �<br />

� �<br />

� �x' sx<br />

0 x<br />

� � � � � � � �<br />

�y'�<br />

� 0 s y � �y�<br />

Rotation:<br />

- Drehen eines Punktes bezüglich Koordinatenursprung<br />

um den Winkel �<br />

- Skalarform: x'�<br />

x �cos�<br />

� y �sin�<br />

y'�<br />

x �sin�<br />

� y �cos�<br />

- Matrixform:<br />

P'� R � P<br />

� �<br />

� �<br />

� �<br />

� � �<br />

� �<br />

� �x' cos�<br />

sin�<br />

x<br />

� � � �<br />

� � � �<br />

�y'�<br />

�sin�<br />

cos�<br />

� �y�<br />

Skalierung, Rotation auch bezüglich eines beliebigen Punktes


183<br />

2D Transformationen in homogenen Koordinaten<br />

Darstellung der der 2D Transformationen mit Hilfe von von 3D 3D homogenen homogenen Koordinaten<br />

Koordinaten<br />

� ��<br />

� �<br />

�<br />

x<br />

y<br />

1<br />

� ��<br />

� �<br />

�<br />

��<br />

� ��<br />

0<br />

0<br />

� �<br />

0<br />

1�<br />

x x 0<br />

y ��<br />

y<br />

s<br />

0<br />

s<br />

0<br />

0<br />

� ��<br />

�<br />

��<br />

� ��<br />

'<br />

y'<br />

� �<br />

1 �<br />

� ��<br />

�<br />

��<br />

��<br />

� ��<br />

�<br />

�x'� �1<br />

a 0�<br />

�x<br />

� ��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�x<br />

1 a 0 x<br />

y'<br />

b 1 0 y<br />

�1<br />

0 0 1 1<br />

Translation:<br />

(homogen)<br />

� ��<br />

� ��<br />

� ��<br />

� ��<br />

� ��<br />

� ��<br />

x' 1 0 t x<br />

Skalierung:<br />

x<br />

( g )<br />

(homogen)<br />

y'<br />

0 1 t y<br />

� �<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

� �<br />

�<br />

( g )<br />

y 0 1 t y y<br />

inkl. Reflexion<br />

�1<br />

0 0 1 1<br />

Rotation: �x'� �cos� � sin�<br />

0�<br />

�x�<br />

Scherung:<br />

� ��<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

(homogen) (homogen)<br />

y' sin�<br />

cos�<br />

0 y<br />

b=0: an x-Achse<br />

�1<br />

0 0 1 1 a=0: an y-Achse<br />

�� Parallelogramm<br />

Eigenschaften der Rotationsmatrix:<br />

(linke obere 2x2-Matrix mit Zeilenvektoren):<br />

- orthogonale Einheitsvektoren<br />

- Determinante 1<br />

- Rotation der Vektoren auf positive Koordinatenachsen<br />

�<br />

�<br />

��<br />

� y<br />

x<br />

�t<br />

�<br />

��<br />

t<br />

Transformationsmatrix:<br />

- Festkörper-Transformation:<br />

reine Rotationsmatrix: Erhaltung von Winkel und Längen<br />

- Affine Transformation:<br />

beliebige Parameter Erhaltung von Parallelität<br />

� ��<br />

� ��<br />

r11<br />

r12<br />

tx<br />

�r11<br />

r12<br />

�<br />

R � � � T<br />

M � r21<br />

r22<br />

t y �r21<br />

r22<br />

�<br />

beliebige Parameter, Erhaltung von Parallelität<br />

�<br />

Realisierung:<br />

�<br />

� �<br />

�<br />

� 0 0 1<br />

Ph '�<br />

M � Ph<br />

x'� x �r11<br />

� y �r12<br />

� tx<br />

y'� x � r21<br />

� y � r22<br />

� t y<br />

Pk '�<br />

R � Pk<br />

�T


184<br />

Komposite 2D Transformationen<br />

Nacheinanderausführen von von affinen affinen 2D Transformationen durch sukzessives Multiplizieren von von<br />

Transformationsmatrizen<br />

Aufgabe: Aufgabe: komplexe Transformation Transformation eines durch Punkte Punkte definierten definierten Ausgangsobjektes<br />

Vorgehensweise:<br />

- Zerlegung der komplexen Transformation in elementare Transformationen<br />

- Zuordnung Zuordnung von Transformationsmatrizen zu zu elementaren Transformationen<br />

- Transformationsmatrizen werden in Reihenfolge der Anwendung von rechts nach links multipliziert<br />

- Ergebnis ist eine gesamte Transformationsmatrix für die komplexe Transformation<br />

- Gesamte Transformationsmatrix wird von links mit den Punkten des Objektes multipliziert<br />

- JJede d TTransformation f i durch d h 1 Matrixmultiplikation M i l i lik i abbildbar bbildb<br />

Ergebnis: durch transformierte Punkte definiertes Zielobjekt<br />

Beispiel (1): (1):<br />

)<br />

M � T ( x2,<br />

y2<br />

) � R(<br />

� ) � S(<br />

sx<br />

, sy<br />

) �T<br />

( �x1,<br />

� y1<br />

1<br />

P<br />

P � M �<br />

2<br />

Beachtung:<br />

- Transformationen sind allgemein<br />

assoziativ, , aber nicht kommutativ.<br />

- Reihenfolge der Anwendung ist<br />

relevant.


185<br />

Beispiel (2):<br />

M � T ( x1,<br />

y1)<br />

� R(<br />

� ) �T<br />

( �x1,<br />

�y1<br />

)<br />

� ��<br />

� ��<br />

x1<br />

�<br />

P1<br />

� y1<br />

��<br />

� ��<br />

x1<br />

P1<br />

'� y1<br />

1' P1<br />

M P � �<br />

( 1,<br />

y1)<br />

( ) ( 1,<br />

y1)<br />

� � �<br />

�� � 1 �<br />

� �<br />

�� � 1<br />

� �<br />

� � � � �<br />

� �<br />

� � �<br />

� �<br />

� � �<br />

� �<br />

� �1 0 x1<br />

cos�<br />

sin�<br />

0 1 0 x1<br />

cos�<br />

sin�<br />

x1(<br />

1 cos�<br />

) y1<br />

sin�<br />

� ��<br />

� �<br />

��<br />

�<br />

� �<br />

� �<br />

��<br />

� �<br />

��<br />

� �<br />

� �<br />

��<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

� �<br />

�<br />

�<br />

0 1 y1<br />

sin�<br />

cos�<br />

0 0 1 y1<br />

sin�<br />

cos�<br />

y1(<br />

1 cos�<br />

) x1<br />

sin�<br />

�0<br />

0 1 0 0 1 0 0 1 0 0<br />

1<br />

�<br />

M<br />

Beispiel (3):<br />

)<br />

M � T ( x1,<br />

y1)<br />

� S(<br />

sx<br />

, sy<br />

) �T<br />

( �x1,<br />

�y1<br />

� �<br />

� �2<br />

� �<br />

�<br />

� �<br />

��<br />

4<br />

�1<br />

�<br />

1<br />

P<br />

� �<br />

2 1 x1s<br />

x<br />

1' � y1s<br />

y<br />

� � sx<br />

� x �<br />

� �<br />

�<br />

4s<br />

y � y1<br />

�<br />

� 1<br />

P<br />

� �<br />

� � �<br />

� �<br />

� � �<br />

� �<br />

� �<br />

� �<br />

� � 1 0 x1<br />

sx<br />

0 0 1 0 x1<br />

sx<br />

0 x1(<br />

1 sx<br />

)<br />

� ��<br />

� �<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

� �<br />

��<br />

� �<br />

� �<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

0 1 y1<br />

0 sy<br />

0 0 1 y1<br />

0 sy<br />

y1(<br />

1 sy<br />

)<br />

�0<br />

0 1 0 0 1 0 0 1 0 0 1<br />

�<br />

M<br />

� ��<br />


186<br />

3D Koordinatensysteme<br />

Kartesisches Koordinatensystem für für 3 Dimensionen und und dessen dessen Darstellung in homogenen homogenen<br />

Koordinaten<br />

Prinzip: Prinzip:<br />

- kartesische Koordinaten: (x,y,z)<br />

- homogene Koordinaten: (x,y,z,W)<br />

- W=1: kartesischer 3-Raum<br />

- Homogenisierung: i i Division i i i durch d h W ( (x/W,y/W,z/W,1)<br />

/ / / )<br />

- Darstellung eines Punktes im kartesischen 3-Raum als Gerade im homogenen 4-Raum<br />

P=(kx,ky,kz,kW)<br />

Vorgehen:<br />

- Erzeugung homogener Koordinaten: Pk=(x,y,z) � Ph=(x,y,z,1) - Transformationen: Ph � Ph' - Erzeugung kartesischer Koordinaten: Koordinaten: P Ph'=(x,y,z,W) h (x,y,z,W) �� P Pk'=(x/W,y/W,z/W) k (x/W,y/W,z/W)<br />

y<br />

3D Koordinatensystem:<br />

- rechtshändiges System: Rechte-Hand-Regel für Achsen x, y, z<br />

- positiver Drehsinn: entgegen entgegen des des Uhrzeigersinnes<br />

bei Blick in Richtung negativer Rotationsachse<br />

x<br />

z


187<br />

Elementare 3D-Transformationen<br />

Darstellung der 3D Transformationen mit Hilfe von 4D homogenen Koordinaten<br />

Skalierung:<br />

(h ) � �<br />

� �sx 0 0 0<br />

(homogen)<br />

inkl. Reflexion<br />

� ���<br />

�<br />

�<br />

���<br />

0 sy<br />

0 0<br />

S(<br />

sx<br />

, sy<br />

, sz<br />

) �<br />

0 0 sz<br />

0<br />

��<br />

0 0 0 1�<br />

Translation:<br />

(h ) � �<br />

� �1 0 0 tx<br />

(homogen)<br />

� ���<br />

�<br />

�<br />

���<br />

0 1 0 t y<br />

T ( tx<br />

, t y,<br />

tz<br />

) �<br />

0 0 1 tz<br />

��<br />

0 0 0 1 �<br />

Rotation um z-Achse:<br />

Scherung:<br />

(homogen)<br />

(homogen)<br />

an z-Achse,<br />

� ���<br />

� ���<br />

cos�<br />

� sin�<br />

0 0<br />

sin�<br />

cos�<br />

0 0<br />

R ( � ) �<br />

� ���<br />

� ���<br />

1 0 shx<br />

0<br />

0 1 shy<br />

0<br />

an z Achse, SH ( sh , sh ) �<br />

�<br />

an y-Achse,<br />

an x-Achse<br />

� Parallelepiped<br />

�<br />

Rz<br />

(� )<br />

� 0 0 1 0<br />

�<br />

�<br />

� 0 0 0 1�<br />

�<br />

SH xy ( shx,<br />

shy<br />

)<br />

�0<br />

0 1 0<br />

�<br />

�0<br />

0 0 1�<br />

Rotation um um y-Achse: y Achse: � cos� 0 sin�<br />

0�<br />

�1 sh 0 0�<br />

(homogen)<br />

� ���<br />

�<br />

�<br />

�<br />

���<br />

� cos�<br />

0 sin�<br />

0<br />

0 1 0 0<br />

Ry<br />

( � ) �<br />

� sin�<br />

0 cos�<br />

0<br />

�<br />

� 0 0 0 1<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�1<br />

shx<br />

0 0<br />

0 1 0 0<br />

SH xz ( shx,<br />

shz<br />

) �<br />

0 shz<br />

1 0<br />

�<br />

�<br />

�<br />

�<br />

� 0 0 0 1�<br />

��<br />

0 0 0 1 1�<br />

� ��<br />

0<br />

0<br />

� ��<br />

0<br />

0<br />

1�<br />

0<br />

0<br />

1<br />

0<br />

0<br />

1<br />

0<br />

0<br />

1<br />

y<br />

sh<br />

sh<br />

0<br />

� ��<br />

0 0<br />

� sin�<br />

0<br />

� ��<br />

sin�<br />

0<br />

cos�<br />

0<br />

0 1�<br />

0<br />

cos cos��<br />

sin�<br />

0<br />

� ��<br />

1<br />

0<br />

� �<br />

�<br />

0<br />

0<br />

�0<br />

Rotation um x-Achse:<br />

(homogen)<br />

( � )<br />

� ��<br />

� �<br />

�<br />

�<br />

�<br />

)<br />

z<br />

sh<br />

,<br />

y<br />

sh<br />

(<br />

yz<br />

SH<br />

�<br />

x<br />

R<br />

z


188<br />

� ���<br />

0<br />

0<br />

0<br />

� � 0<br />

1�<br />

Rotation um 3 Koordinatenachsen:<br />

- Winkel: W � � , ��<br />

, ��<br />

(Reihenfolge)<br />

( g )<br />

� ���<br />

cos�<br />

cos�<br />

� cos � sin �<br />

� sin �<br />

sin�<br />

sin � cos�<br />

� cos�<br />

sin � cos�<br />

cos�<br />

� sin�<br />

sin � cos�<br />

sin�<br />

cos �<br />

R(<br />

�,<br />

�,<br />

� ) �<br />

� cos cos�� sin ��<br />

cos cos��<br />

��<br />

sin sin��<br />

sin ��<br />

� cos cos��<br />

sin ��<br />

sin ��<br />

� sin sin��<br />

cos cos��<br />

cos cos��<br />

cos ��<br />

�<br />

�<br />

0<br />

0<br />

0<br />

�<br />

� ����<br />

0<br />

0<br />

0<br />

�<br />

1�<br />

xz(<br />

1�<br />

cos�<br />

) � y sin�<br />

yz(<br />

1�<br />

cos�<br />

) � xsin�<br />

zz(<br />

1�<br />

cos�<br />

) � cos�<br />

0<br />

Rotation um beliebige Achse durch Koordinatenursprung:<br />

- Achse in Richtung des normierten Vektors (x,y,z)<br />

- Winkel �<br />

�<br />

� ����<br />

xx(<br />

1�<br />

cos�<br />

) � cos�<br />

xy(<br />

1�<br />

cos�<br />

) � z sin�<br />

xy(<br />

1�<br />

cos�<br />

) � z sin�<br />

yy(<br />

1�<br />

cos�<br />

) � cos�<br />

R(<br />

x,<br />

y,<br />

z,<br />

�)<br />

�<br />

xz(<br />

1�<br />

cos�<br />

) � y sin�<br />

yz(<br />

1�<br />

cos�<br />

) � xsin�<br />

�<br />

� 0<br />

0<br />

RRotation t ti um beliebige b li bi Achse A h iim Raum: R<br />

Zusammengesetzte Transformation:<br />

- Verschiebung des Rotationszentrums in den Koordinatenursprung<br />

- Rotation um normierten Vektor<br />

- Zurückverschiebung in das Rotationszentrum


189<br />

Eigenschaften der Matrizen:<br />

- linke obere 3x3-Matrix der Rotationsmatrizen: orthogonale Zeilenvektoren, Einheitsvektoren,<br />

Determinante 1<br />

�1 T<br />

- Orthogonalmatrix: R � R<br />

- Inverse: - Translation: Negation der Verschiebungen � t x , � t y , � t z<br />

�1<br />

MM<br />

- Skalierung: Reziproke der der Vergrößerungen<br />

Vergrößerungen 1 / s x , 1 / s y , 1 / s z<br />

- Rotation: Negation des Winkels � �<br />

�1<br />

�1<br />

�1<br />

- komplexe Transformation: ( M � M ) � M � M<br />

1<br />

2<br />

2<br />

1<br />

� ��<br />

� ��<br />

r11<br />

r12<br />

r13<br />

tx<br />

Ph '�<br />

M � Ph<br />

r21<br />

r22<br />

r23<br />

t y<br />

M �<br />

� P ' R P T<br />

��<br />

� ��<br />

r11<br />

r12<br />

r13<br />

R � r21<br />

r22<br />

r23<br />

� ��<br />

� ��<br />

tx<br />

T � t y<br />

� ��<br />

�<br />

�<br />

��<br />

M �<br />

P<br />

r31<br />

r32<br />

r33<br />

t<br />

k '�<br />

R � Pk<br />

�T<br />

z<br />

�<br />

� 0 0 0 1<br />

�<br />

� �<br />

�<br />

�r31 r32<br />

r<br />

� 33<br />

�<br />

� �<br />

� y<br />

�tz Transformationsmatrix:<br />

(homogen)<br />

Angabe von Rotationswinkeln:<br />

- Eulerwinkel: Winkel in Bezug auf ein ortsfestes Koordinatensystem<br />

- Winkelbezeichnungen: Nickwinkel (x, Pitch), Pitch), Gierwinkel (y, (y, Yaw), Yaw), Rollwinkel(z, Roll)<br />

- Gimbal Lock: Verlust eines Rotationsfreiheitsgrades unter bestimmten Bedingungen<br />

- Beispiel: 45° z, 90° y, 45° x � Ausgangszustand<br />

- Lösung: zweites, mitrotierendes Koordinatensystems als Bezug für Winkel<br />

QQuaternionen i


190<br />

Komposite 3D Transformationen<br />

Nacheinanderausführen von von affinen affinen 3D Transformationen durch sukzessives Multiplizieren von von<br />

Transformationsmatrizen<br />

Aufgabe: Aufgabe: komplexe Transformation Transformation eines durch Punkte Punkte definierten definierten Ausgangsobjektes<br />

Vorgehensweise:<br />

(1) Komposition elementarer Transformationen und deren Anwendung auf die Punkte des Objektes<br />

(2) Ausnutzung Ausnutzung der Eigenschaften von von orthogonalen Matrizen (Zeilenvektoren auf auf Koordinatenachsen)<br />

Koordinatenachsen)<br />

Beispiel:<br />

(1) Punkttransformation<br />

)<br />

M � R � T � R Rz<br />

( � ) � R Rx<br />

( ��<br />

) � R Ry<br />

( ��<br />

) � T ( �x1,<br />

�y1<br />

, �z1<br />

(2) Vektortransformation<br />

1z<br />

P1<br />

P2<br />

Rz r2<br />

z �<br />

P1<br />

P2<br />

r � ��<br />

� �<br />

��<br />

1x<br />

�<br />

Rx r2<br />

x<br />

�<br />

�r ��<br />

�<br />

�� r � 3z<br />

�<br />

���<br />

3<br />

r<br />

�<br />

r<br />

�<br />

2<br />

1<br />

3<br />

1<br />

2<br />

P<br />

P<br />

1<br />

P<br />

P<br />

�<br />

�<br />

3<br />

P<br />

P<br />

1<br />

P<br />

P<br />

�<br />

�<br />

�<br />

� ��<br />

r x ��<br />

�<br />

1<br />

x<br />

�<br />

�<br />

0<br />

0<br />

� ��<br />

� �<br />

�<br />

�<br />

y<br />

0<br />

1<br />

� ��<br />

1<br />

0<br />

� �<br />

�<br />

0<br />

�0<br />

x<br />

x<br />

x<br />

1<br />

0 0 1 1<br />

��<br />

y<br />

y<br />

y<br />

� ��<br />

r1<br />

r1<br />

� �� r1<br />

� 0<br />

��<br />

M<br />

x<br />

R<br />

� z<br />

1<br />

� ��<br />

0<br />

0<br />

� ��<br />

1�<br />

z<br />

r y<br />

R r � � R �<br />

��<br />

� ��<br />

1<br />

Ry � r y � Rz<br />

�<br />

r �<br />

y<br />

�<br />

�<br />

�<br />

� � 2<br />

� 3<br />

0<br />

0<br />

r3<br />

r3<br />

r3<br />

0<br />

z<br />

r2<br />

r2<br />

r2<br />

0<br />

z


191<br />

Wechsel von Koordinatensystemen<br />

Darstellen von von Objekten Objekten in unterschiedlichen unterschiedlichen Koordinatensystemen, Koordinatensystemen z.B. z B Darstellen mehrerer mehrerer in<br />

lokalen Koordinatensystemen definierter Objekte in einem einheitlichen globalen Koordinatensystem<br />

Gleichwertige Denkalternativen für Transformationen:<br />

- Bewegung von Punkten in einem festen Koordinatensystem<br />

- Bewegung des Koordinatensystems bei festen Punkten<br />

j<br />

M �<br />

)<br />

i<br />

k<br />

(<br />

P<br />

Vorgehensweise:<br />

( i)<br />

( j)<br />

( k )<br />

- Punkte in den Koordinatensystemen i, j, k: P , P , P<br />

- elementare Transformationsmatrix zwischen den Koordinatensystemen j und i:<br />

( i)<br />

( j)<br />

( j)<br />

- elementare Koordinatensystemtransformation: P � M i�<br />

j � P , P � M j�k<br />

�<br />

- komposite Koordinatensystemtransformation:<br />

Koordinatensystemtransformation: ( i )<br />

( k )<br />

P � M i�<br />

j � M j�k<br />

� P<br />

- komposite Koordinatensystemtransformationsmatrix: M i�k<br />

� M i�<br />

j � M j�k<br />

1<br />

�<br />

M i�<br />

j � M<br />

Regeln:<br />

- Koordinatensystemtransformation:<br />

Inverse der Transformation im Koordinatensystem:<br />

- Koordinatensystemtransformation einer<br />

( i)<br />

( j)<br />

�1<br />

Transformation: M M � M � M<br />

� i�<br />

j<br />

i�<br />

j<br />

)<br />

2<br />

,<br />

4<br />

(<br />

�<br />

)<br />

4<br />

(<br />

Beispiel (1):<br />

( 1)<br />

( 2)<br />

( 3)<br />

P � ( 10,<br />

8),<br />

P � ( 6,<br />

6),<br />

P � ( 8,<br />

6),<br />

P<br />

( 45�)<br />

R<br />

�<br />

)<br />

2<br />

,<br />

6<br />

(<br />

T<br />

�<br />

� T ( 4,<br />

2),<br />

M 2�3<br />

� T ( 2,<br />

3)<br />

� S(<br />

0.<br />

5,<br />

0.<br />

5),<br />

M 3�4<br />

1�2<br />

M<br />

1�4 1�2<br />

2�3<br />

3�4<br />

� M � M � M<br />

M


192<br />

7<br />

x1<br />

� 6 y1<br />

�<br />

M � T ( x , ) ( , ) ( , )<br />

P0' � M � P<br />

1 y1<br />

� S sx<br />

s y �T<br />

�x2<br />

�y<br />

2<br />

0<br />

s sx � 2 s sy<br />

� 1<br />

�1<br />

�1<br />

( 4)<br />

( 1)<br />

M 4�1<br />

� T ( x2,<br />

y2)<br />

� S(<br />

sx<br />

, sy<br />

) �T<br />

( �x1,<br />

�y1<br />

) P0 � M 4�1<br />

� P0<br />

x2<br />

� 4 y2<br />

�<br />

Beispiel (2):<br />

5<br />

�2� �2s � x � s x � �2�<br />

� ��<br />

�<br />

� �<br />

��<br />

�2s<br />

x � x1<br />

sx<br />

x2<br />

P0 '� 3sy<br />

� y1<br />

� sy<br />

y2<br />

�<br />

� 1<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

3<br />

�1<br />

� ��<br />

�<br />

� �<br />

��<br />

�2<br />

� 5<br />

�1<br />

��<br />

2<br />

�<br />

0<br />

P<br />

2<br />

� ��<br />

�<br />

�1 0 x � �s<br />

0 0�<br />

�1 0 � x � �s 0 x � s x<br />

� ��<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�1<br />

0 x1<br />

sx<br />

0 0 1 0 x2<br />

sx<br />

0 x1<br />

sx<br />

x<br />

0 1 y1<br />

0 sy<br />

0 0 1 y2<br />

0 sy<br />

y1<br />

s y<br />

�0<br />

0 1 0 0 1 0 0 1 0 0 1<br />

M �<br />

y<br />

� ���<br />

� ���<br />

1<br />

� � 2<br />

� �<br />

� �<br />

�<br />

� 1<br />

1<br />

x<br />

�1<br />

x2<br />

� sx<br />

( 4)<br />

�1<br />

P0 � y2<br />

� sy<br />

1<br />

x<br />

1<br />

y<br />

1<br />

y<br />

�1<br />

�1<br />

�1<br />

0 x2<br />

sx<br />

0 0 x1<br />

sx<br />

0 x2<br />

sx<br />

�1<br />

�1<br />

�1<br />

M 4�1<br />

� 1 y2<br />

� 0 sy<br />

� 1 y1<br />

� 0 sy<br />

y2<br />

sy<br />

�<br />

�<br />

�<br />

�<br />

� ���<br />

�<br />

�<br />

� ���<br />

�<br />

�<br />

� ���<br />

� ���<br />

0<br />

� 0<br />

�� � �<br />

�<br />

�1 0<br />

P<br />

1<br />

� ���<br />

�<br />

�<br />

1<br />

0<br />

0<br />

� ���<br />

�<br />

�<br />

� ��<br />

� �<br />

�<br />

1<br />

0<br />

� ��<br />

1<br />

0<br />

� �<br />

�0<br />

� ���<br />

0<br />

0<br />

1�<br />

�<br />

0<br />

0<br />

� ���<br />

�<br />

�<br />

� ��<br />

� �<br />

�<br />

1<br />

0<br />

� ��<br />

1<br />

0<br />

� �<br />

�0<br />

BBeispiel i i l (3):<br />

(3)


193<br />

14. Geometrische Projektionen j<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziele:<br />

• Grundlegende 2D und 3D Projektionen der Geometrie<br />

• Verwendung als geometrische Basis der Computergrafik<br />

Abschnitte:<br />

- Projektive Räume<br />

- Projektionen<br />

- Spezifikation von 3D Sichten<br />

- Beispiele für für 3D 3D Sichten<br />

- Formale Darstellung von Projektionen<br />

- Normalisierung von Sichtvolumen<br />

- Implementation von Projektionen<br />

Projektionen in der<br />

2D und 3D Geometrie


194<br />

Projektive Räume<br />

g<br />

Projektiver Raum: P(Vn )<br />

- Menge aller Geraden durch den Ursprung eines Vektorraumes<br />

- Betrachterstandpunkt q p<br />

- speziell parallele Geraden mit Ursprung im Unendlichen<br />

- eigentliche Punkte, uneigentliche Punkte (Fernpunkte, Richtungen)<br />

- Punkte im projektiven Raum: e u<br />

- Dimension: n-1 (projektive Gerade (1) Ebene (2) Raum (3))<br />

P P P � �<br />

g' p'<br />

- Dimension: n-1 (projektive Gerade (1), Ebene (2), Raum (3))<br />

- zwei Geraden sind windschief oder schneidend<br />

q<br />

- Operationen Addition oder Multiplikation nicht anwendbar<br />

n<br />

n<br />

Projektive Abbildung: � : P( V1<br />

) � P(<br />

V2<br />

)<br />

- Abbildung zwischen projektiven Räumen (Punkt, Gerade, Ebene, Raum)<br />

- eineindeutige als reguläre lineare Koordinatentransformation beschreibbare Abbildung<br />

- Geraden und Flächen werden werden wieder auf auf Geraden Geraden und und Flächen abgebildet abgebildet<br />

- Punktreihenfolgen auf Geraden bleiben erhalten<br />

- z. B. perspektivische Projektion, orthogonale Projektion<br />

)<br />

4<br />

3<br />

Zusammenhang zwischen affinem und projektivem Raum: I : V � P(<br />

V<br />

- Affiner Raum lässt sich in projektiven Raum einbetten<br />

- Abbildung in beide Richtungen<br />

- zz. B. B Transformation zwischen kartesischen und und homogenen homogenen Koordinaten<br />

Koordinaten<br />

Ziel: einheitliche theoretische Grundlage für alle geometrischen Projektionen


195<br />

Projektionen<br />

Abbildung von Objekten eines eines n-dimensionalen n dimensionalen Raumes auf Objekte eines (n-1)-dimensionalen (n 1) dimensionalen Raumes Raumes<br />

Projektion allgemein:<br />

* AAufgabe: f b<br />

- Abbildung speziell von Punkten des 3D Raumes auf Punkte der 2D Ebene (Beschränkung auf n=3)<br />

* Vorgehensweise:<br />

- Ve Verwendung e d von Projektoren: P jekt e : St Strahlen, hle die vom Projektionszentrum P jekti e t ausgehen, ehe durch d h die Punkte P kte der de<br />

Objekte verlaufen und die Projektionsebene schneiden<br />

* Klassen:<br />

- Ebene geometrische Projektionen Projektionen (Projektionsflächen und und Projektionsstrahlen nicht nicht gekrümmt) gekrümmt)<br />

- Perspektivische Projektion (endlicher Abstand Projektionszentrum - Projektionsebene)<br />

Effekt: - Verkleinerung proportional zur Entfernung von Projektionszentrum<br />

- Winkel und Parallelität parallel p zur Projektionsebene j<br />

erhalten<br />

- Parallele Projektion (unendlicher Abstand Projektionszentrum - Projektionsebene)<br />

Effekt: - konstante Verkleinerungen entlang einzelner Achsen<br />

- Längenverhältnisse und Parallelität erhalten, Winkel parallel zur Projektionsebene erhalten<br />

- Gekrümmte geometrische geometrische Projektionen


196<br />

Perspektivische Projektion:<br />

* Fluchtpunkt:<br />

- Punkt, k auf f den d parallele ll l Geraden, d die di nicht i h zur Projektionsebene j k i b parallel ll l sind, i d zulaufen l f<br />

- Geraden parallel zur Projektionsebene haben keinen Fluchtpunkt (uneigentlicher Punkt)<br />

- Hauptfluchtpunkt: Fluchtpunkt einer Koordinatenachse<br />

- Hauptfluchtpunkte Hauptfluchtpunkte existieren für für alle Achsen Achsen (die die Projektionsebene Projektionsebene schneiden) schneiden)<br />

* Klasseneinteilung:<br />

nach Anzahl der Hauptfluchtpunkte<br />

Hauptfluchtpunkte<br />

- Einpunktprojektion (Perspektive in Richtung z-Achse mit einem Fluchtpunkt)<br />

- Zweipunktprojektion (mit Fluchtpunkten auf 2 Achsen)<br />

- Dreipunktprojektion (mit Fluchtpunkten auf 3 Achsen)


197<br />

Parallele Projektion:<br />

* Projektionsrichtung:<br />

- Relation l i zwischen i h Richtung i h der d Projektion j k i und d Normale l der d Projektionsebene<br />

j k i b<br />

* Klasseneinteilung:<br />

- Rechtwinklige / Orthogonale Projektion (Projektionsrichtung senkrecht zur Projektionsebene)<br />

- GGrundriss, d i Aufriss, A f i Seitenriss S i i (6 (6 Projektionsrichtungen j k i i h entlang l Koordinatenachsen)<br />

di h )<br />

- Axonometrische Projektion (beliebige Projektionsrichtung ungleich einer Koordinateachse)<br />

- Isometrische Projektion (Projektionsrichtung mit gleichen Winkeln zu jeder Koordinatenachse)<br />

8 Varianten, Varianten, alle Längen Längen werden gleich gleich skaliert, Achsenwinkel Achsenwinkel 3 x 120 120°<br />

- Dimetrische Projektion (gleicher Winkel zu zwei Achsen), Trimetrische Projektion (allgemeiner Fall)<br />

- Schiefwinklige Projektion (Projektionsrichtung nicht senkrecht zur Projektionsebene)<br />

Winkel von Projektionsrichtung zu Projektionsebene (beta) und zu x-Achse (alpha)<br />

- KKavalierprojektion li j k i (Winkel (Wi k l beta: b arctan(1)=45°, (1) 45° Li Linien i senkrecht k h zur Projektionsebene P j k i b original) i i l)<br />

- Kabinettprojektion (Winkel beta: arctan(2)=63°, Linien senkrecht zur Projektionsebene halbiert)<br />

Winkel alpha: zur x-Achse in der Regel 30° oder 45°


198<br />

Spezifikation von 3D-Sichten<br />

Festlegung aller zur zur Bestimmung einer einer Projektionsart notwendigen notwendigen Parameter, Parameter insbesondere<br />

insbesondere<br />

Projektionsebene, Projektionszentrum, Sichtvolumen<br />

Parameterspezifikation:<br />

* Sichtebene / Projektionsebene VP: (in WC)<br />

- Ebene, auf die die Objekte des 3D-Raums abgebildet werden<br />

- Position und und Lage Lage beliebig (vor, (vor zwischen, zwischen hinter Objekten)<br />

- Angaben im Weltkoordinatensystem WC<br />

(1) Sichtreferenzpunkt VRP<br />

(2) Sichtebenennormale VPN<br />

* Sichtreferenzkoordinatensystem VRC: (in WC)<br />

- Koordinatensystem (u,v,n) zur Definition eines Sichtfensters<br />

- Ursprung: p g VRP, , n: VPN, ,<br />

- v: Projektion eines Vektors VUP auf Sichtebene, u: implizit<br />

(3) Sichtobenvektor VUP<br />

* Sichtfenster S VW VW: (in ( VVRC) C)<br />

- zu VRC achsenparalleles Rechteck in VP<br />

- Fenstermittelpunkt CW implizit<br />

(4) Minimaler horizontaler Wert umin<br />

MMaximaler i l horizontaler h i t l Wert W t umax<br />

Minimaler vertikaler Wert vmin<br />

Maximaler vertikaler Wert vmax


199<br />

* Projektionsrichtung DOP: (in VRC)<br />

- Projektionstyp perspektivisch: PRP ist Projektionszentrum<br />

- Projektionstyp parallel: (PRP,CW) (PRP CW) ist Projektionsrichtung<br />

- PRP in VRC angegeben<br />

- (CW,PRP) und (VRP,VPN) parallel oder nicht<br />

(5) Projektionsreferenzpunkt PRP<br />

(6) Projektionstyp PT<br />

* Sichtvolumen VV: (in VRC)<br />

- Bereich der Welt, der ausgeschnitten g und auf VP projiziert p j wird<br />

- perspektivische Projektion: Pyramide mit PRP und VW<br />

Volumen einseitig unendlich<br />

- parallele Projektion: Parallelepiped mit PRP, CW und VW<br />

Volumen zweiseitig unendlich unendlich<br />

- zweiseitige Beschränkung in Projektionsrichtung durch<br />

Definition von vorderer und hinterer Schnittebene parallel<br />

zur Sichtebene<br />

(7) Vorderposition F<br />

Hinterposition B


200<br />

Beispiele für 3D Sichten<br />

Darstellung eines Hauses in durch verschiedene Projektionen erhaltenen Ansichten:<br />

VRP(WC): (16,0,54)<br />

VPN(WC): (1,1,1) (1 1 1)<br />

VUP(WC): (0,1,0)<br />

VW(VRC) (-20,20,-5,35)<br />

PRP(VRC): (0,0,20)<br />

PT: PAR<br />

VV(VRC): (0,-100)<br />

* Objekt in Weltkoordinatensystem<br />

im Bereich x: [0,16], y: [0,16], z: [30,54]<br />

y<br />

(8,16,30)<br />

x<br />

(16,10,30)<br />

VRP(WC): (16,0,54)<br />

(0 (0,10,54) 10 54)<br />

(16,0,30)<br />

VPN(WC): (0,0,1)<br />

VUP(WC): (0,1,0)<br />

VW(VRC) (-20,20,-5,35)<br />

(16,0,54)<br />

PRP(VRC): (20,25,20)<br />

z<br />

PT: PER<br />

VV(VRC): (0,-100)<br />

* Parallele (isometrische) Projektion:<br />

(CW,PRP), (VRP,VPN) parallel<br />

VRP(WC): (16,0,54) (16,0,54)<br />

VPN(WC): (1,0,1)<br />

VUP(WC): (0,1,0)<br />

VW(VRC) (-20,20,-5,35)<br />

PRP(VRC): (0,25,28) (0,25,28)<br />

PT: PER<br />

VV(VRC): (0,-100)<br />

* Perspektivische (Einpunkt-) Projektion<br />

(CW,PRP), (VRP,VPN) nicht parallel<br />

* Perspektivische (Zweipunkt-) (Zweipunkt ) Projektion<br />

(CW,PRP), (VRP,VPN) nicht parallel


2<strong>01</strong><br />

* Perspektivische Projektion:<br />

zentrische Projektion<br />

* Parallele Projektion:<br />

Seitenriss<br />

y<br />

x<br />

VRP<br />

v<br />

u<br />

n<br />

z<br />

VRP(WC): (8,6,54)<br />

VPN(WC): (0,0,1)<br />

VUP(WC): (0,1,0)<br />

VW(VRC) ( (-9,9,-7,11) 9 9 7 11)<br />

PRP(VRC): (0,0,30)<br />

PT: PER<br />

VV(VRC): (1,-55)<br />

PRP<br />

y<br />

VRP(WC): (0,0,54)<br />

VPN(WC): (1,0,0)<br />

VUP(WC): (0,1,0) (0,1,0) x<br />

VW(VRC) (-1,25,-5,21)<br />

PRP(VRC): (12,8,16) VUP v u<br />

PT: PAR<br />

VRP<br />

VV(VRC): (17, (17,-1) 1)<br />

PRP<br />

n<br />

z VPN


202<br />

Formale Darstellung von Projektionen<br />

Mathematische Beschreibung Beschreibung von ebenen geometrischen Projektionen Projektionen mittels Vektoren Vektoren und und Matrizen<br />

Parallele Projektion:<br />

Perspektivische Projektion:<br />

* AAnnahme: h<br />

* AAnnahme: h<br />

- Sichtebene orthogonal zur z-Achse bei z=0 - Sichtebene orthogonal zur z-Achse bei z=0<br />

- Projektionszentrum bei z � �d<br />

- Projektionszentrum bei z � ��<br />

* BBerechnung: h x' x x y' y y<br />

�<br />

�<br />

* B h<br />

' ' ' 0<br />

- Strahlensatz: d z � d d z � d<br />

* Projektionsmatrix:<br />

(h )<br />

� �<br />

� � * Berechnung: x'�<br />

x y'�<br />

y z'�<br />

0<br />

z'�<br />

0<br />

1 0 0 0<br />

- Grenzübergang: M par ( d)<br />

� lim M per ( d)<br />

d ��<br />

- (homogene)<br />

* M t i d t ll<br />

� ���<br />

�<br />

�<br />

���<br />

0 1 0 0 * Matrixdarstellung:<br />

M per �<br />

0 0 0 0<br />

- Projektionsmatrix:<br />

�0<br />

0 1/<br />

d 1<br />

� ����<br />

� ����<br />

1 0 0 0<br />

0 1 0 0<br />

M par �<br />

0 0 0 0<br />

* Anwendung:<br />

� �<br />

�0<br />

0 0 1�<br />

- Gleichung:<br />

� ����<br />

� ����<br />

� �<br />

� ����<br />

� ����<br />

x'<br />

x<br />

y'<br />

y<br />

P'� M P<br />

M<br />

per �<br />

per<br />

z'<br />

z<br />

� � � �<br />

�w'�<br />

�1�<br />

- Ergebnis:<br />

P'<br />

� ��<br />

� ��<br />

� ��<br />

� ��<br />

x'<br />

x<br />

y'<br />

y<br />

� ��<br />

� ��<br />

�<br />

�<br />

�<br />

��<br />

� ��<br />

x<br />

P(x,y,z)<br />

x'<br />

/ w'<br />

dx /( z d)<br />

P'(x',y',z')<br />

y'<br />

/ w'<br />

dy /( z d)<br />

PRP<br />

x'<br />

x<br />

� ��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

��<br />

y y<br />

z'<br />

0<br />

�<br />

�w'<br />

z / d 1<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

y / w dy /( z d)<br />

PRP<br />

x<br />

d<br />

z<br />

z'<br />

/ w'<br />

0<br />

z<br />

� 1 1


203<br />

Allgemeine Projektion:<br />

* Ziel:<br />

- einheitliche Behandlung aller Projektionen<br />

- Zulassung beliebiger Positionen und Lagen von Punkten, Vektoren und Ebenen<br />

- Einschränkung: g Projektionsebene j senkrecht zu z-Achse (Einpunktprojektion, ( p p j , ohne Rotation) )<br />

� ���<br />

d x d<br />

Berechnung von Fluchtpunkt oder<br />

x<br />

� z'<br />

d z d<br />

Projektionsreferenzpunkt:<br />

z<br />

d d<br />

� ����<br />

d y d y<br />

� z'<br />

d z d z<br />

2<br />

z'<br />

z'<br />

� � z'<br />

Qd Qd<br />

� ����<br />

� ����<br />

0<br />

0<br />

F � gen<br />

1<br />

M P<br />

x � Qd x<br />

y � Qd y<br />

z � z'<br />

� ���<br />

Qd z Qd z<br />

� � 2 2 2<br />

1 z'<br />

�0� d x � d y � d z �1<br />

� �1<br />

Qd z Qd z �<br />

0<br />

� ���<br />

1<br />

0<br />

* Projektionsmatrix:<br />

(homogen)<br />

1<br />

�<br />

gen<br />

M<br />

0<br />

� ���� 0<br />

0<br />

� ��� 0<br />

�<br />

mit Einheitsvektor D und Abstand Q<br />

* Ableitung spezieller Projektionen:<br />

PRP<br />

x<br />

M: z': Q: d x: d y: d z:<br />

P'(x',y',z')<br />

P( P(x,y,z) )<br />

z<br />

Q<br />

D=(dx,dy,dz) (0,0,z')<br />

Mort 0 � 0 0 -1<br />

M per 0 d 0 0 -1<br />

Mcav 0 � cos�<br />

sin�<br />

-1<br />

Mcab 0 � cos� 2 sin� 2 -1


204<br />

Normalisierung von Sichtvolumen<br />

Überführung von Sichtvolumen in eine kanonische Form zur effizienten Ausführung des Klippens<br />

Normalisierung:<br />

* Generelle Vorgehensweise<br />

- Reduzierung von Sichtvolumen unterschiedlicher Größe auf eine einheitliche Größe<br />

- Überführung von von pyramidenförmigen Bereichen in Einheitsquader<br />

- dadurch Reduzierung der Kosten für spätere Operationen<br />

* Parallele Projektion<br />

- TTranslation l ti von VRP VRP zum Ursprung U<br />

- Rotation von VRC, dass Achsen n - z, u - x, v - y inzidieren<br />

- Scherung, dass Projektionsrichtung parallel zur z-Achse liegt<br />

- Translation, , Skalierung g in kanonisches paralleles p Sichtvolumen<br />

- Matrix: � S �T<br />

� SH � R �T<br />

( �VRP)<br />

N par par par par<br />

* Perspektivische Projektion<br />

- Translation von von VRP zum zum Ursprung Ursprung<br />

- Rotation von VRC, dass Achsen n - z, u - x, v - y inzidieren<br />

- Translation von PRP zum Ursprung<br />

- Scherung, g dass Mittellinie des Sichtvolumens z-Achse wird<br />

- Skalierung in kanonisches perspektivisches Sichtvolumen<br />

- Matrix: N per �<br />

S per � SH par �T<br />

( �PRP)<br />

� R �T<br />

( �VRP)


205<br />

* Überführung von perspektivischer in parallele Projektion<br />

- Überführung von pyramidenförmigen Bereichen in in Einheitsquader<br />

- Transformation von perspektivischem in kanonisches paralleles Sichtvolumen<br />

� �<br />

� �1 0 0 0<br />

� ����<br />

0 1 0 0<br />

1 � z<br />

0 0<br />

1�<br />

zmin<br />

1�<br />

z<br />

���<br />

0<br />

0 � 1 0<br />

per<br />

N<br />

par<br />

N' per � M per per��<br />

min<br />

�<br />

M per�<br />

par<br />

� ����<br />

���<br />

min


206<br />

Implementation von Projektionen<br />

Algorithmische Umsetzung Umsetzung der der Projektionskonzepte in der der gesamten gesamten Rendering Pipeline<br />

Anwendungsprogramm<br />

Notwendige g Einzelschritte:<br />

Homogene Erweiterung<br />

Modelltransformation<br />

Normalisierungg<br />

Sichtvolumenklippen<br />

Sichtebenenprojektion<br />

* Homogene Erweiterung<br />

- Übergang zu homogenen Koordinaten (Erweiterung)<br />

* Modelltransformation<br />

- Operationen im 3D Raum gemäß Anwendungsmodell (Transformation)<br />

* Normalisierung<br />

- Transformation in ein kanonisches Sichtvolumen (Transformation)<br />

* Sichtvolumenklippen<br />

- Abschneiden nicht sichtbarer Modellbestandteile (Klippen)<br />

* Sichtebenenprojektion<br />

- Überführung g in 2D-Ebene (Projektion) ( j )<br />

* Viewportabbildung<br />

- Überführung in Fenster- bzw. Gerätebereiche (Transformation, Klippen)<br />

* Homogene Reduzierung<br />

- Übergang zu kartesischen kartesischen Koordinaten (Division)<br />

Viewportabbildung<br />

Homogene g Reduzierungg<br />

Ziel: - effiziente strukturelle und und algorithmische algorithmische Realisierung<br />

Realisierung<br />

- mehrere Operationen in einer Transformationsmatrix<br />

Anzeigegeräte


207<br />

15. Mathematische Grundlagen g<br />

Prof. Dr.-Ing. habil. Wolfgang Oertel<br />

Ziel:<br />

KKennenlernen l ausgewählter ähl mathematischen h i h Grundlagen G dl der d Computergrafik<br />

C fik<br />

Sammlung wichtiger Formeln<br />

Abschnitte:<br />

• Anwendungsgebiete<br />

• Zahlenlehre<br />

• Mengenlehre<br />

• Koordinaten<br />

• Trigonometrie<br />

• Planimetrie<br />

• Stereometrie<br />

• Interpolation<br />

• Vektoralgebra<br />

• Matrizenalgebra<br />

Schwerpunkt: Mathematische Formeln


208<br />

Anwendungsgebiete<br />

Einsatz mathematischer Verfahren für computergrafische Aufgabenstellungen<br />

Anwendungsgebiete:<br />

Anwendungsgebiete:<br />

- Kurven<br />

- Flächen<br />

- Körper<br />

- Beleuchtung<br />

- Rendern<br />

- Transformation<br />

- Projektion<br />

- Rastern<br />

- Füllen<br />

- Sichtbarkeit


209<br />

Zahlenlehre<br />

Zahlenbereiche und deren Operationen<br />

Zahlenbereiche:<br />

Zahlenbereiche:<br />

- natürlich: diskret, Strahl N<br />

- ganz: diskret, Linie G<br />

- rational: gebrochen, g Linie R<br />

- reell: dicht, Linie P<br />

- komplex: dicht, Fläche C<br />

i��<br />

i�<br />

z �� re e ��<br />

1 ��<br />

0<br />

z � � a ��<br />

bi z ��<br />

r (cos (cos�� ��<br />

i sin sin��<br />

)<br />

n m<br />

a<br />

m / n<br />

a �<br />

� mn<br />

a<br />

Operationen:<br />

- kommutativ, , assoziativ, , distributiv<br />

m�n<br />

m n m n m n m n<br />

- Potenz:<br />

a � a � a a � a / a ( a ) �<br />

- Logarithmus: log( ab) � log a � logb<br />

a n a<br />

- …<br />

n<br />

log( ) �<br />

log


210<br />

Mengenlehre<br />

Mengen und deren Operationen<br />

B<br />

Konzepte: Konzepte:<br />

- Menge, leere Menge, Universalmenge A , B<br />

- Elemente<br />

a , b<br />

- Operationen: Vereinigung, Vereinigung Durchschnitt, Durchschnitt 3 Differenzen, Differenzen Komplement<br />

Komplement A ��<br />

B , A ��<br />

B , A ��<br />

- kartesisches Produkt A� B<br />

- Tupel<br />

( a,<br />

b)<br />

- Elemente, Teilmenge, Gleichheit, Disjunktheit, Kardinalität a � A , A � B<br />

- ÄÄquivalenz,<br />

Potenzmenge P(A)<br />

- Ordnung, Klassen, Schranken, Grenzen<br />

- Abbildungen, Ein-, Einein-, Mehrdeutigkeit<br />

- Reflexivität Reflexivität, Symmetrie, Symmetrie Transitivität<br />

- Injektion, Surjektion, Bijektion<br />

- Funktionen, Produkt, Inverse<br />

- Reguläre Mengen und Operationen


211<br />

Koordinaten<br />

Parameterangabe für 2D und 3D Punkte<br />

Koordinaten:<br />

Koordinatenursprung und<br />

Rechtssystem als Bezug<br />

w<br />

x , y<br />

x , y , z<br />

r , �<br />

r , � , h<br />

r , � , �<br />

x , y , w<br />

x , y , z ,<br />

- kartesisch (2D):<br />

- kartesisch:<br />

- polar (2D):<br />

- zylindrisch:<br />

- sphärisch:<br />

- homogen (2D):<br />

- homogen:<br />

Beliebige Punkte<br />

als Bezug<br />

1<br />

�<br />

V � tA � sB<br />

t � s � 1<br />

V � tA � sB<br />

� rC<br />

t � s � r � 1<br />

V � tA � sB<br />

� rC<br />

� q qD t � s � r � q<br />

- baryzentrisch:<br />

* Linie:<br />

* Fläche:<br />

* Volumen


212<br />

Trigonometrie<br />

Arbeit mit Dreiecken<br />

sin� � a / c cos� � b / c tan� � b / a 2 2 2<br />

a � b � c<br />

cos� � sin( � � 90�)<br />

tan� � sin�<br />

/ cos�<br />

2<br />

2<br />

sin � � cos � �1<br />

h � ab / c A � ab / 2<br />

Rechtwinkliges Dreieck:<br />

- Seitenverhältnisse:<br />

- Winkelverhältnisse:<br />

- Höhe, Fläche:<br />

Gleichschenkliges Dreieck:<br />

2<br />

/<br />

ch<br />

A �<br />

- Höhe, Fläche: � � 2<br />

2<br />

/<br />

c<br />

2<br />

h � l �<br />

h � 3l / 2<br />

3 / 4<br />

2<br />

A � l<br />

Gleichseitiges Dreieck:<br />

- Höhe, Fläche:<br />

2<br />

/<br />

Allgemeines Dreieck:<br />

- Sinusregel:<br />

a / sin�<br />

� b / sin � � c / sin �<br />

- KKosinusregel: i l a � b cos� � c cos ��<br />

- Summenregel: sin( � � � ) � sin�<br />

cos � � cos�<br />

sin �<br />

- Winkelsumme: � � � � � � 180�<br />

- Umfang: g<br />

U � a � b � c<br />

- Fläche: A � ah / 2 A �<br />

s(<br />

s � a)(<br />

s � b)(<br />

s � c)<br />

, s � U


213<br />

Planimetrie<br />

Arbeit mit ebenen geometrischen Figuren<br />

Fläche:<br />

2<br />

U � 4a<br />

A � a<br />

U � 2a � 2b<br />

A � ab<br />

U � a � b � c � d A � ( a � b)<br />

h / 2<br />

U � 2 2a �� 2 b<br />

A � ab bsin<br />

i �<br />

U � 2a � 2b<br />

2<br />

A � a / 2<br />

U � 2a � 2b<br />

A � ab<br />

( �� � � � ���<br />

2<br />

2<br />

2<br />

n<br />

( x � x ) � ( y � y ) A � � �y � y ���x � x �<br />

i�1<br />

(modn<br />

) � xi<br />

) � ( yi�1(modn<br />

) � yi<br />

) A � � y �<br />

i�0<br />

i yi�1(modn<br />

) xi<br />

xi�1(modn<br />

)<br />

n<br />

��<br />

i�0<br />

2<br />

��<br />

2<br />

A � �r<br />

A � �ab<br />

U � 2�r<br />

1<br />

1<br />

2 2<br />

x � y � r<br />

2 2 2 2<br />

x / a � y / b �<br />

2 2 2 2<br />

xx<br />

/ a � y / b �<br />

2<br />

y � 2 px<br />

- Quadrat:<br />

- Rechteck:<br />

- Trapez:<br />

- Parallelogramm:<br />

- Rhombus:<br />

- Drachenviereck:<br />

- Viereck:<br />

U<br />

- Polygon:<br />

- Kreis<br />

- Ellipse:<br />

- Hyperbel:<br />

- Parabel:<br />

Verhältnisse:<br />

- Strahlensätze an geschnittenen geschnittenen Parallelen: Parallelen:<br />

- Winkelsätze am Kreis:<br />

- Sehnen, Sekanten, Tangenten am Kreis:<br />

- Goldner Schnitt: b � a �� 5 �1��<br />

2<br />

�y � y1�<br />

�x �x1<br />

� � m<br />

�y � y1�<br />

�x �x1<br />

� � �y2 � y1�<br />

�x2 �x1<br />

�<br />

ax � by � d � 0<br />

x / a � y / b �1<br />

n<br />

y � mx �<br />

Gerade:<br />

- Definition:


214<br />

Stereometrie<br />

Arbeit mit räumlichen geometrischen Figuren<br />

Körper:<br />

A � 2( ab � ac � bc)<br />

V � abc<br />

2<br />

3<br />

A � 6a<br />

V � a<br />

A � 2G � M<br />

V � Gh<br />

A � 2�rh<br />

2<br />

V � �r<br />

h<br />

A � G � M<br />

V � Gh / 3<br />

2<br />

2 2<br />

A �� �� r ��<br />

��<br />

r r ��<br />

h<br />

2<br />

V ��<br />

r h h��<br />

/ 3<br />

3<br />

/<br />

4 3<br />

V � �r<br />

2<br />

A � 4�r 1<br />

1<br />

�<br />

�<br />

2<br />

2<br />

0<br />

2 2 2 2<br />

x � y � z � r<br />

2 2 2 2 2<br />

x / a � y / b � z / c<br />

2 22<br />

2 2 2<br />

x / a � y / b � z / c<br />

2 2 2 2<br />

x / a � y / b � 2cz<br />

�<br />

- Quader:<br />

- Würfel:<br />

- Prisma:<br />

- Zylinder:<br />

- Pyramide:<br />

- Kegel:<br />

- Polyeder:<br />

- Kugel:<br />

- Ellipsoid:<br />

- Hyperboloid:<br />

- Paraboloid:<br />

� x1)((<br />

y2z3<br />

� y3z<br />

2)<br />

� ( y3z1<br />

� y1z3<br />

) � ( y1z<br />

2 � y2z<br />

)) �<br />

� y1)((<br />

z2x3<br />

� z3x2<br />

) � ( z3x1<br />

� z1x3<br />

) � ( z1x2<br />

� z2x1<br />

)) �<br />

� z )(( x y � x y ) � ( x y � x y ) � ( x y � x y )) �<br />

( x<br />

1<br />

z � mx � ny � o<br />

ax � by � cx � d � 0<br />

x<br />

/ a � y / b � z / c �1<br />

Ebene:<br />

- Definition:<br />

y<br />

(<br />

0<br />

1<br />

2<br />

2<br />

1<br />

3<br />

1<br />

1<br />

3<br />

2<br />

3<br />

3<br />

2<br />

1<br />

z<br />

(


215<br />

Interpolation<br />

Stetige Überführung von Zahlen, Parametern, Punkten, Vektoren in andere<br />

��<br />

0<br />

1<br />

� 1�<br />

� ��<br />

�<br />

� 1 2 1�<br />

� p<br />

� ��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

� 1 � 2 1 p<br />

� 2 2 0 p<br />

� 1 0 0 p<br />

�<br />

2<br />

Polynomiale Polynomiale Interpolation:<br />

- linear:<br />

- quadratisch:<br />

- kubisch:<br />

- allgemein ll i (nicht ( i h rekursiv): k i )<br />

- allgemein (rekursiv):<br />

(Bernstein-Polynome)<br />

)<br />

( t<br />

n<br />

i<br />

B<br />

i<br />

p<br />

n<br />

�i�0 �<br />

)<br />

( t<br />

p<br />

�� �<br />

�<br />

1<br />

1<br />

�<br />

�<br />

n<br />

i<br />

�� �<br />

�<br />

n!<br />

( n � i)!<br />

i!<br />

� � �<br />

�<br />

�<br />

�<br />

�<br />

�n �1<br />

� i<br />

��1<br />

1�<br />

� p0<br />

�<br />

2<br />

p � �t 1��<br />

� � � � � p � t t<br />

� 1 0�<br />

� p1<br />

�<br />

��1 3 � 3 1�<br />

� p0<br />

�<br />

� �<br />

� ���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

p0<br />

3 2 3 � 6 3 0 p1<br />

p � t t t 1 �<br />

� 3 3 0 0 p2<br />

��<br />

1 0 0 0 0�<br />

� p p3<br />

�<br />

n n i n�i<br />

Bi<br />

t t � t<br />

i<br />

�� �<br />

�<br />

�<br />

�<br />

�<br />

n<br />

( ) � ( 1 )<br />

�<br />

�<br />

i<br />

�� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

n<br />

n�1<br />

n�1<br />

Bi<br />

( t)<br />

� ( 1�<br />

t)<br />

Bi<br />

( t)<br />

� tBi�1<br />

( t)<br />

� � �<br />

�<br />

�<br />

�<br />

�<br />

�n<br />

0<br />

B ( ) 1<br />

� i<br />

0 t � B ( t)<br />

� 0 für j � 0<br />

n<br />

j<br />

n<br />

i � 0,...,<br />

�n<br />

2<br />

2 1 �<br />

�cos ( t)<br />

sin ( t)<br />

�� � �<br />

�n2<br />

�<br />

Trigonometrische Interpolation:<br />

- translatorisch:<br />

n �<br />

- rotatorisch:<br />

��<br />

�<br />

�<br />

1<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

sin(( 1�<br />

t)<br />

� ) sin( t�<br />

)<br />

�<br />

� sin( � ) sin( � )<br />

�<br />

2<br />

v<br />

v<br />

v


216<br />

Vektoralgebra<br />

Arbeit mit Vektoren im 3D Raum (Spezialfall 2D)<br />

p � xi � yj�<br />

zk<br />

p � � T<br />

1<br />

0<br />

� �<br />

2 2 2<br />

p � x � y � z<br />

T<br />

op<br />

p<br />

p � x y z<br />

� � �<br />

pu<br />

� 1<br />

� �T cos� x � p x p cos� y � p y p cos�<br />

z � p z p<br />

p � 1 0 0 � �T � 0 1 0 p � 0<br />

cz<br />

cy<br />

cx<br />

Definition: Definition:<br />

- Positionsvektoren:<br />

- Richtungsvektoren:<br />

- Betrag:<br />

- Ri Richtung: h<br />

- Einheitsvektor:<br />

- Kartesische Vektoren:<br />

- Multiplikation: � � T<br />

� � � � p p cos�<br />

2<br />

1<br />

pu � p p<br />

p � p1<br />

cos�<br />

p s � � xs yx zs zs�<br />

� �T p1<br />

� p2<br />

� x1 � x2<br />

y1<br />

� y2<br />

z1<br />

� z2<br />

T<br />

p1 �p 2 � x1<br />

y1<br />

z1<br />

� x2<br />

y2<br />

z2<br />

� x1x2<br />

� y1y<br />

2 � z1z<br />

2 �<br />

T � y1z<br />

2 � z1y<br />

2 �<br />

�<br />

�<br />

� ��<br />

�<br />

� �<br />

��<br />

T � y1z<br />

2 z1y<br />

2<br />

� y1<br />

z1<br />

x1<br />

z1<br />

x1<br />

y1<br />

�<br />

p1<br />

�p<br />

2 � � �<br />

� � z1x2<br />

� x1z<br />

2<br />

� y2<br />

z2<br />

x2<br />

z2<br />

x2<br />

y2<br />

�<br />

�x1<br />

y2<br />

� y1x2<br />

( p �p<br />

) �p<br />

Manipulation:<br />

- Normalisierung:<br />

- Projektion:<br />

- Multiplikation:<br />

- Addition:<br />

- Skalarprodukt:<br />

- Vektorprodukt:<br />

3<br />

2<br />

1<br />

- Spatprodukt: p p<br />

�p1 p2<br />

sin�<br />

�<br />

3<br />

p1 �p<br />

2 �<br />

( p �p<br />

) �p<br />

2<br />

1<br />

�<br />

�<br />

A<br />

V<br />

- Parallelogrammfläche:<br />

- Parallelipedvolumen:


217<br />

Berechnungen:<br />

)<br />

d<br />

�<br />

�n<br />

p<br />

p � p1<br />

� t(<br />

p2<br />

� p1<br />

p � a � tb<br />

- Definition einer Gerade:<br />

(Punkt, Parameter, Hesse)<br />

0<br />

( � p ) �n<br />

�<br />

p 1<br />

0<br />

( p � p1)<br />

�((<br />

p2<br />

� p1)<br />

� ( p3<br />

� p1))<br />

�<br />

p � a � sb � tc<br />

p �n � d<br />

- Definition einer Ebene:<br />

(Punkt, Parameter, Hesse)<br />

1<br />

p<br />

p2 �<br />

0<br />

�<br />

� ( 2 , n3<br />

�p<br />

0<br />

b� ( p � a)<br />

a � (( p � a ) �b<br />

) b<br />

b� ( a2<br />

� a1)<br />

( a2 � a1)<br />

�(<br />

b1<br />

�b<br />

2)<br />

( b1<br />

�b<br />

2)<br />

cos ( )<br />

1 �<br />

b1 �b<br />

2<br />

1<br />

cos ( )<br />

1<br />

1 2 n<br />

�<br />

n �<br />

cos ( )<br />

( p � ( d � p �n)<br />

�n<br />

1 �<br />

b �n<br />

d � p �n<br />

( p ( p )<br />

a � ( d � ( n �a))<br />

b<br />

b1<br />

�b 2 � 0 � ( a1<br />

� a2<br />

) �(<br />

b1<br />

�b<br />

2)<br />

� 0<br />

p p0<br />

� t n1<br />

�n<br />

2)<br />

mit n1<br />

�p<br />

0 � d1<br />

, n2<br />

�p<br />

0 � d<br />

A � ( p p2 � p p1<br />

) ��<br />

( p p3<br />

� p p1<br />

) / 2<br />

( p2<br />

� p1)<br />

� ( p3<br />

� p1)<br />

� 0<br />

q � �2( n �p<br />

� d)<br />

n �n�n<br />

- Abstand zweier Punkten:<br />

- Abstand von Punkt und Gerade:<br />

- Fußpunkt eines Punktes auf Gerade:<br />

- Abstand zweier paralleler Geraden:<br />

- Abstand zweier beliebiger Geraden:<br />

- Winkel zweier Geraden:<br />

- Winkel zweier Ebenen: Ebenen:<br />

- Winkel von Gerade und Ebene:<br />

- Abstand von Punkt und Ebene:<br />

- Fußpunkt eines Punktes auf Ebene:<br />

- Schnittpunkt von Gerade und Ebene:<br />

- Schnittpunkt zweier Geraden:<br />

- Schnittgerade zweier Ebenen:<br />

- Dreiecksfläche:<br />

- Kolinearität dreier Punkte:<br />

- Reflexion von Punkt an Gerade:<br />

n � 1 p cos�<br />

� d<br />

d<br />

�p � n p cos�<br />

�<br />

n<br />

Hessesche Normalform:<br />

Richtungen- und Normalen sind in der Regel Einheitsvektoren!


218<br />

Matrizenalgebra<br />

Matrizen und deren Operationen<br />

Definition: Definition:<br />

�<br />

1,<br />

n<br />

a<br />

...<br />

� ��<br />

��<br />

m , 1<br />

m m,<br />

n<br />

a<br />

j<br />

�<br />

i<br />

� ��<br />

� a1,<br />

1 ...<br />

A(<br />

m,<br />

n)<br />

� ... ...<br />

n � 1<br />

��<br />

am<br />

...<br />

m � 1<br />

m � n<br />

ai, j � 0 für i � j<br />

a i , j � 1 für f i � j , a i i,<br />

j � 0 für f i � j<br />

ai, j � const für i � j , ai,<br />

j � 0 für<br />

ai , j � 0 für i,<br />

j<br />

ai , j a j,<br />

i für i , j<br />

� j j<br />

ai, j � 0 für i � j , ai,<br />

j � 0 für i � j<br />

det( A)<br />

� 0<br />

det( A) � 0<br />

�1 T<br />

A � A<br />

�1<br />

A � A � I<br />

- Matrix allgemein:<br />

- Spaltenmatrix:<br />

p<br />

- Zeilenmatrix:<br />

- quadratische Matrix:<br />

- Diagonalmatrix:<br />

- Identitätsmatrix I:<br />

- Skalare Matrix:<br />

- Nullmatrix 0:<br />

- symmetrische Matrix:<br />

- untere, obere Dreiecksmatrix:<br />

- reguläre (invertierbare) Matrix:<br />

- singuläre (nicht invertierbare) Matrix:<br />

- orthogonale Matrix: Matrix:<br />

- inverse Matrix:


219<br />

Operationen:<br />

�� a j,<br />

i ai,<br />

j m,<br />

n ��<br />

m,<br />

n � �c i,<br />

j ci,<br />

j � ai,<br />

j bi,<br />

j �<br />

�� b bi,<br />

j b bi,<br />

j a ai<br />

s s��<br />

�ci , j | ci<br />

j � aib<br />

j �<br />

n<br />

ci<br />

| ci<br />

� ai<br />

� � ��<br />

a<br />

j i jb<br />

j�1<br />

, j<br />

l<br />

, n � ci,<br />

j | ci,<br />

j � ai<br />

� j � �<br />

A , � A � | � A<br />

, m<br />

n<br />

n<br />

T<br />

m<br />

- Transponierung:<br />

, � A � B | �<br />

m n m,<br />

n<br />

m , n �� A Am,<br />

n s ��<br />

| ��<br />

, j<br />

C<br />

- Addition, Subtraktion:<br />

B<br />

- Multiplikation Multiplikation mit Skalar:<br />

� �m � j � 1 j<br />

i i�<br />

1<br />

m,<br />

n<br />

� a b �<br />

T<br />

� am<br />

�b<br />

n � ,<br />

m,<br />

n<br />

C<br />

- Multiplikation zweier Vektoren:<br />

� A �b<br />

� b<br />

n<br />

, n<br />

m<br />

m<br />

c<br />

- Multiplikation von Matrix und Vektor:<br />

�1<br />

j<br />

,<br />

i<br />

j<br />

,<br />

k<br />

, k<br />

i<br />

�1<br />

� A �B<br />

b<br />

k<br />

l<br />

, l<br />

1<br />

m<br />

, n<br />

m<br />

C<br />

- Multiplikation:<br />

�1<br />

n<br />

A<br />

�<br />

A<br />

�<br />

n<br />

A<br />

,<br />

A<br />

�<br />

A<br />

,<br />

E<br />

�<br />

0<br />

A<br />

- Potenz:<br />

- Axiome: Kommutativität, Assoziativität, Distributivität<br />

- Minorisierung: B 1 � min A Löschen der i-ten Zeile und j-ten Spalte einer Matrix<br />

, m�1<br />

i,<br />

j � m m �<br />

�� �� ��<br />

�� �� ��<br />

��<br />

i�1<br />

i�<br />

j<br />

n � cof �A m,<br />

n � � �ci , j | ci,<br />

j � ( �1)<br />

det�min<br />

i,<br />

j �A m,<br />

n ���<br />

� � � � ��T<br />

m � adj j �A m , n � �coff �A m , n ��<br />

�1<br />

�1<br />

i�<br />

j<br />

m � adj �A m,<br />

m � det�A m,<br />

m � � ai,<br />

j | ai,<br />

j � ( �1)<br />

det�min<br />

i,<br />

j �A m,<br />

m ��<br />

det�A<br />

m,<br />

m �<br />

m �<br />

,<br />

m i�<br />

j<br />

- Determinante: det A m,<br />

m ��<br />

A m,<br />

m ��<br />

a ai,<br />

j ( � 1 ) det min i,<br />

j A m,<br />

m für beliebige Spalte j<br />

,<br />

m<br />

C<br />

- Kofaktormatrix:<br />

B �<br />

- Adjungierte Matrix:<br />

� �<br />

n ,<br />

�1<br />

m,<br />

A<br />

- Inverse Matrix:<br />

B<br />

�1<br />

X � B A � A �<br />

- Division:

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!