CG1-01-15.pdf
CG1-01-15.pdf
CG1-01-15.pdf
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: