Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Indem du zuerst die glScissor-Koordinaten anpasst (also x=60, y=640-60), um den Ausschnitt zu verschieben, und dann glTranslatef(-60,±90) (nagel mich auf die Werte nicht fest) aufrufst, damit deine TileMap entsprechend verschoben wird.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Nochmal ich: ich habe immer noch nicht ganz mitbekommen/verstanden, was ich tun muss, um die TileMap vorher zu bewegen (z.B. auf die Position 250|250) und dann erst den Ausschnitt zu machen. Ist dies möglich oder muss ich dann mit glScissor/glOrtho tricksen?
edit: Um das besser zu verdeutlichen: Kann ich _vorher_ die Map mit glTranslatef irgendwie verschieben und _danach_ dann glScissor anwenden? Beispiel: Ich habe ein Fenster der Größe 1024x640 px. Ich will meine Map an der Position 250|50 (obere linke Ecke) haben. Der Ausschnitt soll an der Map Position 90|90 starten (obere linke Ecke) und soll 60px breit und hoch sein.
Ist das irgendwie so möglich? (Kein originaler oder funktionierender Code, sondern dient nur zum veranschaulichen)
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
glScissor wird von glTranslate nicht beeinflusst. Scissor nimmt immer Fensterkoordinaten. glTranslate nimmt „Weltkoordinaten“, das ist bei passend eingestelltem glOrtho aber das gleiche. Keiner der beiden Schinpsel funktioniert aber, da du wieder Fenster- und Weltkoordinaten mischst. Nimm die 90 und 60-Summanden aus x und y von glScissor raus. Dann musst du noch deine Map korrekt Translaten, wenn du an Map-Position 90/60 starten willst (glTranslate(-90, -60, 0) oder mit anderem Vorzeichen) und dann sollte der zweite Schnipsel funktioniern.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Schau Dir den Schnippsel aber doch lieber nochmal an, oft hat man einfach nur unglückliche Sonderfälle bei denen es funktioniert. Wenn Du es mit Horazonts Erklärungen auch hinkriegst, dann dürfte das ein weitaus sicherer Weg sein.
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich möchte den Ausschnitt an den Map-Koordinaten 90|90 anfangen lassen. Die Map wiederum soll an der Position 250|50 anfangen. Also würde laut Horazont glScissor so aussehen, oder?
Code:
glScissor(250, 640 - 150, 60, 60); // (90 + 60) = 150 -> 90 y Koordinate ; 60 Höhe
Aber Inwiefern muss ich meine Map nun verschieben? Um 90|90, also
Registriert: Di Dez 13, 2011 19:14 Beiträge: 166 Wohnort: Hamburg / Mölln
Programmiersprache: D
Nur um es schon einmal zu verraten: Das funktioniert, im Gegensatz zum vorherigen (aber scheinbar falschen) Ansatz, nicht.
edit: Wenn wir schon dabei sind: Es wäre sicher sehr hilf- und lehrreich, wenn ich gleich verstehe, warum und was an meinem obigen Ansatz falsch ist und warum er trotzdem funktioniert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich glaube ich verstehe deine Positionsangaben nicht. Mal ganz abstrakt:
Wir haben die Welt-Koordinaten wx und wy, die angeben, welcher Punkt der Welt (lies: Map) in der oberen linken Ecke des sichtbaren Ausschnitts sein soll. Weiterhin haben wir die Fenster-Koordinaten fx und fy, welche angeben, wo im Fenster (von unten links aus gemessen) die obere Linke Ecke des sichtbaren Ausschnitts sein soll. Weiterhin noch fh und fw, die Höhe und Breite des sichtbaren Ausschnitts und sh, die Höhe des gesamten Fensters.
Dann braucht es folgende Aufrufe:
Code:
glScissor(fx, sh-(fx+fh), fh, fw);
glTranslatef(-wx,-wy,0);
glTranslatef(fx, fy);
Die letzte Zeile gilt nur, wenn keine Skalierung/Rotation/… angewandt wurde und glOrtho so konfiguriert ist, dass die Einheiten „Pixel“ und „Weltkoordinate“ identisch sind.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.