moderiert von: Maddin
Übersicht -
Spiele Entwicklung -
Verfahren und Effekte -
Auf dem Weg von DDraw nach OpenGL ..| Auf dem Weg von DDraw nach OpenGL .. | ||
|---|---|---|
| HeinzK | verfasst: 08.05.2010, 12:09 | |
1968 REFAL
registriert: Nov. 2009
Beiträge: 40
Status: offline letzter Besuch: 15.05.10 |
Ich mach gerade meine ersten Schritte in OpenGL. So weit .. so gut. Bisher habe ich unter DDraw auf folgende Weise gearbeitet: - Vollbild mit Width und Height des aktuellen Desktop - Alle Objekte (Linien, Bögen, Ellipsen, etc.) selber Pixelweise ins VRAM geschrieben - Zoom und Pan über eine eigene Skalierung erzeugt - 2D Sicht von Oben Nun ich möchte ich das so effektiv wie möglich unter OpenGL nachahmen. 1. Problem: Eine EINHEIT soll ein Fenster-PIXEL groß sein. Wie mach' ich das am Besten? glViewport(...) gluPerspective(.....) glTanslatef(....) Sind das die richtigen Funktionen, oder habe ich hierzu andere, bessere Möglichkeiten? Nach ersten Test stelle ich mir vor, dass ich unter OpenGL Zoom und Pan über die Kamera (gluPerspective) löse und mein Modell nicht mehr selbst skaliere! Richtig? Ich hoffe auf eure Hilfe .. ________________________ Es ist leichter einen Sack Flöhe zu hüten .. |
|
| HeinzK | verfasst: 08.05.2010, 14:38 | |
1968 REFAL
registriert: Nov. 2009
Beiträge: 40
Status: offline letzter Besuch: 15.05.10 |
Ich habe mich im Moment für gluOrtho2D entschieden. Skalierung ist da! Gleiche Orientierung wie unter DDraw. Super! Nächstes Problem: Während ich das Bild 'vergrößere', sind diese unschönen Rahmen zu sehen. Abgefangen habe ich nur WM_SIZE: Gibt es hiefür eine bessere (weitere) Möglichkeit? ________________________ Es ist leichter einen Sack Flöhe zu hüten .. |
|
| HeinzK | verfasst: 09.05.2010, 09:13 | |
1968 REFAL
registriert: Nov. 2009
Beiträge: 40
Status: offline letzter Besuch: 15.05.10 |
WM_SIZING .. jetzt läuft's wie gewollt! ________________________ Es ist leichter einen Sack Flöhe zu hüten .. |
|
| uNiQue | verfasst: 14.05.2010, 13:44 | |
1988 Erlang
registriert: Mrz. 2004
Beiträge: 135
Status: offline letzter Besuch: 14.05.10 |
ich habe noch nie was mit DDraw gemacht... nur mal an der oberfläche von D3D gekratzt. ich hätte mir jetzt vorgestellt, dass man in DDraw auch eher mit matrizen/transforms arbeitet, als zoom, etc. selber zu machen. gluOrtho2D habe ich ehrlich gesagt auch noch nie gesehen, aber die doku sagt mir, dass hier das gleiche gemacnth wird, wie wenn man glOrtho mit near=-1 und far=1 aufruft. passt also. der befehl sorgt dafür, dass die projektionsmatrix fürs 2D-zeichnen gesetzt wird. die parameter left, right, top und bottom legen im prinzip fest, welcher teil des koordinatensystems im viewport dargestellt wird. wenn du z.B. per glViewport festgelegt hast, dass dein viewport 800x600 pixel gross ist, dann würde ein aufruf von glOrtho mit left=0, right=800, top=0 und bottom=600 dafür sorgen, dass eine einheit genau ein pixel gross ist, und der ursprung (left=0, top=0) oben links liegt. gluPerspective ist das gegenstück zu glOrtho. während glOrtho die projektionsmatrix für eine 2D-projektion (ORTHOgonale projektion) vorbereitet, baut gluPerspective eine projektionsmatrix für eine perspektivische projektion, also eine "normale" 3D-projektion. eine kamera kann man damit nicht nachbauen. es gibt natürlich die möglichkeit, den angezeigten bildausschnitt mit glOrtho neu zu setzen, und so z.B. bei 2D-projektion die kamera zu verschieben. normalerweise setzt man viewport und projektion aber nur einmal (bzw. bei bestimmten events erneut (fenster-resize, etc.)), und macht alle verschiebungen, zooms und rotationen über die modelview-matrix. diese sollte man am anfang eines frames erstmal in einen festen zustand bringen. das wäre entweder die identitäts-matrix (mit glLoadIdentity), oder direkt die kamera-matrix (dann am besten mit glLoadMatrix). dann kann man sie mit glTranslate verschieben, mit glScale skalieren und mit glRotate rotieren. in kamera-tutorials findet man eigentlich meistens den befehl gluLookAt. diesem kann man als parameter die position der kamera, einen blickrichtungs-vektor und einen "oben"-vektor mitgeben. daraus wird dann die passende matrix gebaut (und auf aktuelle modelview-matrix multipliziert). für 2D-projektionen ist das aber eher ungeeignet... eine andere möglichkeit wäre (ist mir lieber), einfach direkt eine matrix als kamera zu definieren. diese hat eine position, und durch die drei richtungsvektoren (x, y, z) wird die ausrichtung festgelegt. zu beachten wäre dabei, dass diese matrix die position und ausrichtung der kamera darstellt, während die modelview matrix angibt, an welcher position und mir welcher ausrichtung gerade gezeichnet wird... das ist sozusagen das "gegenteil", weshalb man die kamera-matrix vor der multiplikation auf die modelview-matrix erstmal invertieren muss. am besten nochmal an einem beispiel: am anfang wird als modelview-matrix die identität geladen (glLoadIdentity). diese matrix liegt jetzt im nullpunkt des koordinatensystems (im 2D-beispiel oben links). alles was jetzt (z.B. mit glVertex) gezeichnet wird, wird relativ zur modelview-matrix gezeichnet. also ein punkt würde mit glVertex2f(1, 1) an die position 1, 1 gesetzt. wenn man jetzt anschliessend mit glTranslatef(10, 0) die modelview-matrix um 10 einheiten (im beispiel = 10 pixel) in x-richtung verschiebt, würde der ein punkt mit glVertex2f(1, 1) danach an die bild-position 11, 1 gezeichnet. wenn man das jetzt z.B. für die "kamera" verwenden will, könnte man sagen, die kamera wurde um 10 pixel nach links verschoben, weil alles ein stück weiter rechts gezeichnet wird, ohne die koordinaten der geometrie zu verändern. zoomen wäre mit glScale möglich. ein aufruf von glScalef(2, 2, 2) vergössert sämtliche geometrie auf die doppelte grösse, bzw. am beispiel unseres punktes mit glVertex2f(1, 1): glLoadIdentity(); glScalef(2, 2, 2); glBegin(GL_POINTS); glVertex2f(1, 1); glEnd(); ... dieser code zeichnet einen punkt an die bildschirmposition 2, 2. ich hoffe mal, das war halbwegs verständlich... sehr wichtig für die grafikprogrammierung ist auf jeden fall vektorrechnung, und dass man die geschichte mit den matrizen/transforms versteht. da würde ich erstmal ansetzen. und doku für diese befehle durchlesen, und damit rumspielen: glLoadIdentity, glMultMatrix, glLoadMatrix glTranslate, glRotate, glScale und natürlich, damit man auch was am bildschirm sieht: glBegin, glEnd, glVertex (aber die kennst du wahrscheinlich schon) die tutorials auf nehe.gamedev.net sind ein sehr guter einstieg in OpenGL! ________________________ -= Zwei Eier in der Pfanne. Sagt das eine : "Heiss hier!" - Sagt das andere : "Waaah !! Ein sprechendes Ei !!" =- |
|
| HeinzK | verfasst: 14.05.2010, 20:14 | |
1968 REFAL
registriert: Nov. 2009
Beiträge: 40
Status: offline letzter Besuch: 15.05.10 |
Danke für die vielen hilfreichen Tipps. Im Moment bin ich zwar etwas von der Grafik abgekommen, denn ich musste zuerst mal einen Ersatz für CString suchen. Gleichzeitig habe ich versucht auf Ubuntu Fuß zu fassen. Im Moment bin ich am Testen, wie ich am Besten meinen Loopbegrenzer auf Linux zum Laufen bekomme. Melde mich wieder mit den nächsten Problemen. PS: Ich dachte schon, von dieser Seite kommt keine Antwort mehr. Schön, sich geirrt zu haben. Kann man hier irgendwo einstellen, dass man automatisch per EMail benachrichtigt wird? ________________________ Es ist leichter einen Sack Flöhe zu hüten .. |
|
| Maddin | verfasst: 14.05.2010, 20:26 | |
2115 Loga
registriert: Mrz. 2004
Beiträge: 1182
Status: offline letzter Besuch: 19.07.10 |
weiter oben auf Einstellungen klicken und dann die einzelnen Foren "Abonieren". Das die Kamera angeht sollte an dieser Stelle vielleicht noch gesagt werden das OpenGL im Gegensatz zu DirectX nicht zwischen Model und View Matrix unterscheidet. Der Programmierer muss also slebst zuerst die View Matrix setzten und kann dann Modell Matrizen drüber multiplizieren. ________________________ May the schwarz be with you! |
|
| HeinzK | verfasst: 15.05.2010, 08:50 | |
1968 REFAL
registriert: Nov. 2009
Beiträge: 40
Status: offline letzter Besuch: 15.05.10 |
Hallo Maddin. Bei "Abonieren" bin ich immer vorsichtig. Aber ich hab's getan. ________________________ Es ist leichter einen Sack Flöhe zu hüten .. |
|
