Grafik- programmierung GDI+, 3D Frank Lange Microsoft Deutschland GmbH .NET Strategy & Developer Group franklan@microsoft.com
Agenda GDI+ 3D-Grafik Schlußbemerkung
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Das Historische Erlebnis DOS Welcher Grafikkartentyp, welcher Grafikmode, was sind Latchregister, reich‘ mir mal das Programmierhandbuch des Druckerherstellers, gibt es einen schnelleren Integer-Algorithmus, hat‘s einen 387 oder 287, Postscript!, Prescribe… Windows GDI HDC, SelectObject, ReleaseDC, SelectPalette,… Windows GDI+ Graphics g; g.DrawLine(..); g.RotateTransform(30) Gibt‘s ja auch noch: OpenGL, GAPI, Direct3D, DirectDraw,… Und sowieso - ist Grafik nicht etwas, das es zu beschreiben gilt, anstatt APIs und Methodenaufrufe zu initiieren?
GDI+ Verfügbarkeit Windows XP: ja. Win98, WinME, NT4SP6, Win2K: als Add-On .NET Framework: kein Ausweg!
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Unterschiede zu GDI Graphics-Objekt statt DC Pens, Brushes,… sind unabhängig vom Graphics-Objekt (Parameter statt selektiertes Objekt) Koordinatentransformationen (endlich nicht mehr selbst zu programmieren) Keine Current Position Alpha-Blending (Transparenz) Farbverläufe Imaging (JPEG etc.)
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Demo: Minimal Graphics-Objekt private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; } // auch: Graphics g = this.button1.CreateGraphics();
GDI+ und PrgSprachen .NET WinForm-Projekte C++ Windows-Apps #include <windows.h> #include <gdiplus.h> // link: GDIPLUS.LIB using namespace Gdiplus; VOID OnPaint(HDC hdc) { Graphics graphics(hdc); Pen pen(Color(255, 0, 0, 255)); graphics.DrawLine(&pen, 0, 0, 200, 100); }
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Demo: BuildingBlocks Lines Rectangles Ellipses Arcs Polygons Cardinal Splines Wie mit biegsamem Linieal gezogene Linie Bézier splines Start-, Endpunkt und zwei „magnetische“ Punkte in der Ferne
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Koordinatensysteme World Page Device Beliebig positionier-, rotier- und skalierbar Transfomationsmatrix speichert die Welttransformation Page Ursprung links oben Default: Pixel-Einheit, aber änderbar PageUnits (z.B. auf „2,54 cm“ umstellbar, DpiX, DpiY sind abfragbar – Größe der Grafikkarte;-)) PageScale zusätzlich für andere Auflösungseinheiten Device Ursprung links oben Pixel als Einheit
Trafomatrix 3x3 – Matrix speichert gesamte Folge von Trafos (Translation, Rotation, Skalierung) „Matrix Representation of Transformations“ ( .NET Framework Developer's Guide )
Demo: Trafo g.Transform die Trafo-Matrix z.B: immer 1000*1000-Koordinatensystem (Egalisieren von Fenster, Drucker,…) g.ScaleTransform (xMult, yMult) g.TranslateTransform (dx,dy) z.B: Ursprung in Mitte des Fensters setzen g.RotateTransform (30) z.B: y-Werte nach oben wachsend Pen-Breite ist in Weltkoordinaten z.B. Auflösung auf DINA4-mm stellen und dann Pen in mm
Demo: Bewegung Dito: Drawing ändert sich nicht, aber das Koordinatensystem („der Betrachter)
AllPaintingInWmPaint Double Buffering Zappelfrei bei bewegter Darstellung DoubleBuffer Bild wird im Hintergrund aufgebaut WM_ERASEBKGND führt noch nicht zum Löschen des Fensters AllPaintingInWmPaint OS führt kein Caching des Inhalts aus. Bei schnellen Bewegungen wäre das unnötig. UserPaint private void FormMain_Load(…) { this.SetStyle( ControlStyles.DoubleBuffer | ControlStyles.AllPaintingInWmPaint, true ); }
Demo: ObjMover Objekte, rotierbar und verschiebbar Anklicken eines Objekts erkennen Flicker-freie Darstellung
Demo: BenchLines In GDI+ wird jeder Punkt über die Koordinatentransformation geschickt Hier: Extrembeispiel Treppenstufen mit 3 Pixel langen Linien Das ist der Preis für den Komfort! Anmerkung: zeitaufwendige Grafik sollte den UI-Thread nicht blockieren…
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Standarddrucker (GDI) GDI (ohne „+“) PRINTDLG pdlg; // Init memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Flag: ich möchte DC pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Kein Show! PrintDlg( &pdlg ); // Da ist er: DC pdlg.hDC; ..und nun gleich wieder vergessen!
MSDN TechTalk – <<Monat JJJJ>> <<Thema>> 23 Drucker wählen MSDN TechTalk – <<Monat JJJJ>> <<Thema>> 23 .NET: PrintDialog liefert Druckerinfos, kein Graphics-Objekt Standarddrucker PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); MessageBox.Show ( dlg.PrinterSettings.PrinterName ); Druckerwahl SDK: PRINTDLG pdlg; // Initialize the PRINTDLG structure. memset( &pdlg, 0, sizeof( PRINTDLG ) ); pdlg.lStructSize = sizeof( PRINTDLG ); // Set the flag to return printer DC. pdlg.Flags = PD_RETURNDEFAULT | PD_RETURNDC; // Invoke the printer dialog box. PrintDlg( &pdlg ); // hDC member of the PRINTDLG structure contains // the printer DC. return pdlg.hDC; PrintDialog dlg = new PrintDialog(); dlg.Document = new PrintDocument(); if( dlg.ShowDialog()==DialogResult.OK) MessageBox.Show ( dlg.PrinterSettings.PrinterName );
Standarddrucker (.NET) PrintDocument, PrintPageEventHandler PrintDocument doc = new PrintDocument(); // Default Printer doc.PrintPage += new PrintPageEventHandler(MyPrintFunc); doc.Print(); // Empfehlenswert: try-catch-Szenario void MyPrintFunc (object sender, PrintPageEventArgs e) { // nutze e.Graphics e.HasMorePages = false; } PrintDocument PrintPageEventHandler
Print mit Druckerwahl PrintDialog, PrintDocument, MyFunc PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler( MyPrintFunc ); PrintDialog dlg = new PrintDialog(); dlg.Document = doc; if (dlg.ShowDialog() == DialogResult.OK) doc.Print(); //---------------------------------------------------- void MyPrintFunc (object sender, PrintPageEventArgs e) { //... }
Print Preview PrintPreviewDialog PrintDocument doc = new PrintDocument(); doc.PrintPage += new PrintPageEventHandler( MyPrintFunc ); PrintPreviewDialog dlg = new PrintPreviewDialog(); dlg.Document = doc; dlg.ShowDialog(); //---------------------------------------------------- void MyPrintFunc (object sender, PrintPageEventArgs e) { //... }
Demo: Printing Print! Print… Print Preview
Agenda GDI+ 3D-Grafik Schlußbemerkung Historie auf Microsoft-Systemen Unterschiede zu GDI Verwendung von GDI+ Vektorgrafik Building Blocks Koordinaten und Transformationen Printing Bilddateien und Metafiles 3D-Grafik Schlußbemerkung
Demo: Images Bitmaps (JPG, GIF, BMP) Metafiles (EMF) (Demo: ObjMover) Bitmap bitmap = new Bitmap("Grapes.jpg"); e.Graphics.DrawImage(bitmap, 60, 10); Metafile metafile = new Metafile("SampleMetafile.emf"); e.Graphics.DrawImage(metafile, 60, 10);
Agenda GDI+ 3D-Grafik OpenGL Direct3D Schlußbemerkung
Hinter den Bergen… Programm Idee Verstehen der/einer Grafikbibliothek Programmrahmen Einige grundlegende Features Programm Arbeit Funktionen Mathe Idee
OpenGL vs. Direct3D OpenGL Direct3D Ähnliche Features OpenGL, Direct3D Von Hardware beschleunigt In .NET nutzbar OpenGL Standard von Silicon Graphics Das rote Buch: Addison-Wesley, „OpenGL Programming Guide“ © Silicon Graphics, Inc ) Gut sichtbare Grundfunktionalität SDK bringt neuen Projekttyp ins VS .NET - derzeit nicht in Everette Beta;-( Objektklassen Schnell und gut für Spiele Nur Windows-Plattform Direct3D
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
OpenGL als Standard OpenGL (TM) Plattformunabhängig “Echtzeitgrafik” Architectural Review Board Plattformunabhängig Unix, NT, Win95... “Echtzeitgrafik” schnelle Algorithmen, kein Raytracing
Funktionsgruppen Präfix Core Set - Funktionen Wiggle - Funktionen (MS) “wgl” Win32 - Funktionen (MS) ohne Utility - Funktionen “glu” Auxiliary - Funktionen “aux”
Datentypen OpenGL .NET Kennung GLbyte SByte b GLint Int32 i GLenum UInt32 ui GLfloat Single f GLdouble Double d (Array) v ... .NET z.B. System.Int32 (unabh. Von Programmiersprache)
Funktionsnamen API-Präfix Name Parametertyp-Postfix (falls versch. Versionen) Beispiel glVertex3dv Core Set API “Vertex”-Funktion 3 double-Werte als Array void glVertex3dv( double[] v); --> Online Hilfe: z.B. glVertex, glGet
Einstellungen (Licht...) Rendering Context 3D-Programmierung Einstellungen (Licht...) RENDERING CONTEXT Frame Buffer Color Buffer ( DC ) Depth Buffer (z-Buffer) sonstige Puffer x,y x,y x,y
OpenGL unter .NET Noch kein offizielles MS-Assembly Verschiedenes im Internet: GLSharp (http://www.headbits.com/) CsGL (http://sourceforge.net/projects/csgl) … Tatsächlich benötigt Deklarationen der OpenGL-Funktionen und Datentypen Aux-Funktionen über DLL statt statischer native Code Library Hilfe für RC-Benutzung „Altbekannte“ OpenGL-Programmierung in .NET-Apps – kaum Unterschied zu SDK-Apps
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
Koordinatensystem Rechtssystem Y -Z X +z rechte Hand-Regel Zeigefinger Daumen Mittelfinger
Welt-, Modellkoordinaten Y Modellkoordinaten (Arbeitskoordinaten) MC 1 -Z 1 Y -Z X X 1 WC Weltkoordinatensystem (immer fix)
Transformationen MC für Objektausgabe vorbereiten Translation (Verschieben) glTranslate Rotation (Drehen) glRotate Skalierung (Dehnen/Stauchen) glScale
„Aux“-Objekte auxSolidTeapot Teekessel auxWireTeapot -”- Drahtmodell auxSolidCube Würfel auxWireCube -”- Drahtmodell ... Anmerkung: Aux-Funktionen heißen in GLSharp glut-Funktionen.
Demo: Transformations .NET-Rahmen static void Paint () { glTranslated (0,0,-5); glRotated (30,0,0,1); glRotated (20,1,0,0); Aux.WireTeapot (1.0); } Form1.cs ShowThis.cs
Demo: MoveMC MoveMC Tastatur-Steuerung MoveMC.exe
Geräte-Ausgabebereich Voreinstellungen Y X -Z Sichtbereich im WC glFrustum / gluPerspective Geräte-Ausgabebereich Window glViewport
Sichtbarer Bereich Sichtbereich im WC glFrustum / gluPerspective Oder: Y X -Z Sichtbereich im WC glFrustum / gluPerspective glMatrixMode ( GL_PROJECTION); glFrustum ( links, rechts, unten, oben, zStart, zEnde ); Oder: glMatrixMode ( GL_PROJECTION); gluPerspective ( öffnungWinkel, y_zu_x_Aspect, zStart, zEnde );
Geräte-Ausgabebereich Y X -Z glViewport glViewport ( 0,0, windowWidth, windowHeight); Window
Trafo-Pipeline 2 3 1 4 Window Y Eye Coordinates (WC) Modelview Trafo X -Z Eye Coordinates (WC) Modelview Trafo Projection Trafo 2 3 MC 1 1 Object Coordinates (MC) Clip Coordinates (Fläche) Window 4 Viewport Trafo Windows Coordinates
Wo sind die Trafo-Infos? Modelview Trafo Modelview Matrix Projection Trafo Projection Matrix Viewport Trafo x,y, width, height Matrix: mathematische Datenstruktur, die alle Tranformationenseinstellungen speichert
Zugriff auf Einstellungen Modelview Trafo glMatrixMode (GL_MODELVIEW) glLoadIdentity, glTranslated, glRotated, glScaled,... Projection Trafo glMatrixMode (GL_PROJECTION) glLoadIdentity, glFrustum,... Viewport Trafo glViewport Abfrage über glGet GL_MODELVIEW_MATRIX, GL_PROJECTION_MATRIX, GL_VIEWPORT Zwischenspeichern glPushMatrix(), glPopMatrix() OpenGL als State Machine Aktuellen Einstellung zählen --> glLoadItentity wirkt im aktuellen Matrixmode
Demo: SDK_Minimal Create Size Paint Destroy CreateWindow DC bekommen SetPixelFormat DC vorbereiten wglCreateContext RC erzeugen glViewport Ausgabebereich glFrustum Sichtbereich glClear Frame Buffer löschen glTranslated... MC transformieren auxSolidTeapot... Objekt ausgeben glFlush Ausgabe fertig wglDeleteContext RC zerstören Create Size Paint Destroy
Demo: NET_Minimal Load SizeChanged Paint Render Context erzeugen Sichtbarkeitsbereich und Fensterbereich einstellen ClearBuffer() MC-Trafos Objekte ausgeben SwapBuffer() Load SizeChanged Paint
Demo: NET_Bewegt Bewegtes Bild Timer WinForm Timer_Tick globale Paramter ändern Invalidate() Form_Load myForm.SetStyle( ControlStyles.Opaque, true ); Fensterbereich nicht löschen („Zappelei“), sondern nur OpenGL Buffer einblenden WinForm
Eigene Objekte OpenGL bisher: “aux”-Objekte Punkt Linie Polygon (Dreieck, Viereck) OpenGL 3D Objekt Oberflächen- elemente
Fläche übergeben -1,1,1 1,1,1 -1,-1,1 1,-1,1 OpenGL Pipeline Linksumlauf glBegin (GL_POLYGON); //Würfel vorne glVertex3d (+1,+1,+1); //r o glVertex3d (-1,+1,+1); //l o glVertex3d (-1,-1,+1); //l u glVertex3d (+1,-1,+1); //r u glEnd (); OpenGL Pipeline
Fläche & Normale Normalvektor * senkrecht von Oberfläche weg * z.B. für Lichtabstrahlung wichtig -1,-1,1 1,-1,1 1,1,1 -1,1,1 Linksumlauf glBegin (GL_POLYGON); //Würfel vorne glNormal3d (0,0,1); glVertex3d (+1,+1,+1); //r o glVertex3d (-1,+1,+1); //l o glVertex3d (-1,-1,+1); //l u glVertex3d (+1,-1,+1); //r u glEnd ();
Demo: Wuerfel Würfel ohne Licht und Material
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
Licht & Material ambientes Licht bis 8 Lichtquellen glEnable ( GL_LIGHTING ) ambientes Licht bis 8 Lichtquellen glEnable ( GL_LIGHT0 )... Material-Eigenschaften Farbe im Color Buffer
Licht-Arten ambientes Licht diffuses Licht Spekulares Licht keine Einfallsrichtung (im Raum verteilt) keine Abstrahlrichtung Einfallsrichtung (--> Schräge der Fläche) Ausfallsrichtung (--> Lage zum Betrachter) Unabhängige Materialfarbe ambientes Licht diffuses Licht Spekulares Licht “Emittiertes Licht”
Ambientes Licht (global) glLightModelfv (GL_LIGHT_MODEL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); Interne Berechnung Beispiel: Rot-Wert: RDarstellung = RGlobalAmbient * RMaterial + RLight0 * Rmaterial
Lichtquellen 0..7 glLightfv ( GL_LIGHT0, GL_AMBIENT, new float[] { 0.2f, 0.2f, 0.2f, 1.0f } ); glLightfv ( GL_LIGHT0, GL_DIFFUSE, new float[] { 0.4f, 0.4f, 0.4f, 1.0f } ); glLightfv ( GL_LIGHT0, GL_SPECULAR, new float[] { 0.5f, 0.5f, 0.5f, 1.0f }); glLightfv ( GL_LIGHT0, GL_POSITION, new float[] { 0.0f, 0.0f, 1.0f, 1.0f } ); //1=nahes Licht //0=fernes Licht glEnable ( GL_LIGHT0 );
Material glMaterialfv ( GL_FRONT, GL_AMBIENT, new float[] { 0.4f, 0.4f, 0.0f, 1.0f } ); glMaterialfv ( GL_FRONT, GL_DIFFUSE, new float[] { 0.7f, 0.7f, 0.7f, 1.0f } ); // RGBA! glMaterialfv ( GL_FRONT, GL_SPECULAR, new float[] { 0.9f, 0.9f, 0.9f, 1.0f } ); glMaterial ( GL_FRONT, GL_SHININESS, 10.0 ); glMaterialfv ( GL_FRONT, GL_EMISSION, new float[] { 0.0f, 0.0f, 0.0f, 1.0f } ); auxSolidCube (1.0);
Demo: LichtMaterial (1) Sample 1..15 Lichtquellen und Materialeigenschaften.
Nahe Lichtquelle als “Taschenlampe” Spotlight Nahe Lichtquelle als “Taschenlampe” float fDirection[] = { 0.0f, 0.0f, -1.0f }; glLightfv ( GL_LIGHT0, GL_SPOT_DIRECTION, fDirection );//Richtung glLightf ( GL_LIGHT0, GL_SPOT_CUTOFF, 15.0f ); //Öffnungswinkel glLightf ( GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f ); //Fokussierung Exponent =0 --> immer Faktor 1 sonst: je senkrechter Licht, desto stärker
entfernt weniger Licht Nahe Lichtquelle als “Taschenlampe” glLightf ( GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0f ); glLightf ( GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.0f ); glLightf ( GL_LIGHT0, GL_QUDRATIC_ATTENUATION, 0.0f ); Alles wirkt zusammen konstant unabhängig von Entfernung schwächeres Licht linear mit Entfernung gleichmäßige Lichtabnahme quadratisch mit Entfernung raschere Lichtabnahme
Nebel Näher --> Materialfarbe Ferner --> Nebelfarbe float fRGB[] = { 0.1f, 0.1f, 0.1f }; glFogi ( GL_FOG_MODE, GL_EXP ); // exponentiell mit Entfernung glFogfv ( GL_FOG_COLOR, fRGB ); // Nebelfarbe glFogf ( GL_FOG_DENSITY, 0.15 ); // Nebeldichte glEnable ( GL_FOG );
Transparentes Material RGBA A = Alpha-Wert Alpha Blending Vorhandene, weiter entfernte Pixel im Frame Buffer: * nicht überschreiben * “durchscheinen” lassen i.a.: Alpha = 1 --> undurchsichtig z.B. Alpha = 0.2 --> 80% von dahinterliegendender Pixelfarbe
ff transparentes Material glEnable ( GL_BLEND ); glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); float fDiffuse[] = {0.9f, 0.9f, 0.9f, 0.7f ); // Alpha=0.7 glMaterialfv ( GL_FRONT, GL_DIFFUSE, fDiffuse ); auxSolidShere (1.0); // Überschreibt nicht gnadenlos // weiter entfernte Teile
Back Face Culling Back Face Culling Rückseiten der Flächen werden nicht gezeichnet. Ausschalten glDisable ( GL_CULL_FACE ); //keine Anzeigeunterdrückung glLightModeli ( GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE ); //auch Lichtberechnungen
Demo: LichtMaterial (2) Sample 17.. Alpha-Blending, Back Face Culling
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
OpenGL Bitmaps Nix bunt! ( „Bit“-Map) 1er-Bits = aktuelle Farbe Keine Trafo (Drehen…) glRasterPos Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... glBitmap
Images Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Keine Trafo (Drehen…) glRasterPos Ausgabeposition im MC Darstellung Parameter: Adresse der Pixel,... glDrawPixels Win32 BMPs: Blue-Green-Red-Reihenfolge!
glEnable ( GL_TEXTURE_2D ) Texturen Farbe (RGB) Farbauflösung mind. 1 Byte je R, G, B Höhe, Breite: 2n-Wert Überzieht eine Objekt-Fläche Mit der Fläche transformiert (gedreht…) glEnable ( GL_TEXTURE_2D ) Texturen verwendbar glTexImage2D Pixelarray übergeben Win32 BMPs: Blue-Green-Red-Reihenfolge!
Textur auf Fläche t 1 1 s Rahmen: Ziel-Fläche eines 3D-Objekts glBegin (GL_POLYGON); //Fläche glNormal3d (0,0,1); glTexCoord2d ( 0.6, 0.5); glVertex3d (1,1,0); //r o glTexCoord2d ( 0.2, 0.5); glVertex3d (-1,1,0); //l o glTexCoord2d ( 0.2, 0.1); glVertex3d (-1,-1,0); //l u glTexCoord2d ( 0.6, 0.1); glVertex3d (1,-1,0); //r u glEnd (); t 1 0.5 0.1 0.2 0.6 1 s Rahmen: Ziel-Fläche eines 3D-Objekts
Demo: BmpNFonts (1) BmpNFonts Bitmap Image Texture (Font kommt später)
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
Display Lists Anweisungsfolgen OpenGL-Verwaltung Abruf mit Index (RC-lokal!) glNewList (inx,GL_COMPILE) // OpenGL-Anweisungen glEndList () glCallList (inx) glListBase ( inxOffset ) glCallLists ( nCount, GL_INT, inxArr ) glDeleteLists (inxFirst, nCount)
True Type Fonts wglUseFontOutlines Erzeugt Display List für jeden Glyphen (Zeichendarstellung) glCallLists Anzeige eines String. String als Indexarray für die Display Lists der Glyphen
Demo: BmpNFonts (2) BmpNFonts Font
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
Flächenelemente Nicht erlaubt Nein ! Einkerbung Nein ! Ausstanzung 1 2 Rechts-Umlaufsinn Nein ! 3 4
Einfache Elemente Flächen direkt programmierbar Würfel Pyramide …
Berechnete Objekte Flächenelemente berechnen Kugel Rohr … oft Punktegitter erzeugen Die benachbarten Punkte umschließen eine Fläche (vgl. auxWireSphere...)
Zusammensetzung aus elementaren Teilobjekten Kombi-Objekte Zusammensetzung aus elementaren Teilobjekten
Objekte scannen Prinzip: Thomograf Punktegitter Textur Farben Echoabstastung für Koordinaten + Kamera für Texturelemente Lichtreflexion messen für Material,Normalen Punktegitter Textur Farben
Demo: Objects Objects KombiObjects RobotMSJ RobotMSJ stammt vom MSDN.
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
Demo: MoveCamera Implementierung Fall: Kamera schwenkt nach rechts --> ganze Szene dreht sich nach links --> MC-System vor der Objektdarstellung nach links rotieren dito: sonstige Bewegung
Agenda GDI+ 3D-Grafik Schlußbemerkung OpenGL Direct3D Allgemeines Koordinaten und Transformationen Licht und Material Bitmaps, Images und Texturen Display Lists und Fonts 3D-Objekte Kamera (Bewegung durch den Raum) Direct3D Schlußbemerkung
Direct3D Schnelle 3D-Grafik auf Windows-Systemen Gerne für Spiele verwendet Rendering Engine mit Objektmodell Projekttyp im VS .NET …
3D Beschreibungsformat Z.B. 3D-Grafik über das Internet via 3D-Modell-Beschreibungsformat VRML, ISO Standard seit 1997 (Virtual Reality Modeling Language) Soll ersetzt werden, weil XML erwünscht Cosmo Player (Platinium) als IE-Plugin Beispiele, siehe http://www.ocnus.com/models/Buildings/ X3D (eXtensible 3D) Wird als VRML-Nachfolger gesehen Siehe auch www.web3d.org
Agenda GDI+ 3D-Grafik Schlußbemerkung
Zusammenfassung GDI+ wird in WinForms verwendet GDI+ nutzt Transformationsmatrizen OpenGL und Direct3D ermöglichen 3D-Grafik Transformationen sind das A&O Objekte werden im durch Flächenelemente beschrieben Verschiedene Lichtquellen für plastische Darstellung
Fragen!? Uff...