Iso Rendering

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Iso Rendering

Beitrag von Glocke » Mi Apr 03, 2013 1:27 pm

Hi, ich glaube ich habe ein konzeptionelles Problem ^^ Ich arbeite an einer 2D Engine mit isometrischer Darstellung (ähnlich Age of Empires 1/2, Diablo 1/2, Anno 1602 uvm.). Dabei habe ich auf einer Karte:
  • Fußboden-Kacheln (z.B. Steinboden), über die wird alles andere drübergezeichnet
  • flache Objekte (z.B. Teleport-Bereich), kommt über den Boden aber unter die normalen Objekte
  • Wandkacheln (z.B. Felswand)
  • normale Objekte (z.B. Spielfigur)
Dabei habe ich die Kacheln in assoziativen Feldern angeordnet, als Key dient die Kachel-Koordinate. Jede Kachel enthält zusätzlich eine Liste von Objekten, die sich auf ihr befinden. Diese Liste wird beim Bewegen aktualisiert, so dass ich beim Zeichnen keine Objekte weiter suchen muss (sondern direkt habe).

Hier mal der Pseudo-Code zum Rendering-Vorgang:

Code: Alles auswählen

Für jede sichtbare Zeile
    Für jede sichtbare Spalte
        Ermittle Fußbodenkachel
        Zeichne Kachel

Für jede sichtbare Zeile
    Für jede sichtbare Spalte
        Ermittle Fußbodenkachel
        Für jedes flache Objekt auf Kachel
            Zeichne Objekt

Für jede sichtbare Zeile
    Für jede sichtbare Spalte
        Ermittle Wandkachel
        Zeichne Kachel
        Für jedes normale Objekt auf Kachel
            Zeichne Objekt
Ich vermute bald, dass ich in

Code: Alles auswählen

Für jedes flache Objekt auf Kachel
    Zeichne Objekt
eine Zeichenreihenfolge einbauen sollte. Nur fehlt mir dazu der Ansatz.

Ich habe hier noch ein paar Screenshots zusammengeschnitten, die mein aktuelles Problem zeigen. Die Grafiken sind von http://opengameart.org/ entnommen, also nicht meine.

Die Treppe im Bild hat als Bezugsecke (zum Rechnen) jene in der Mitte Unten (ist ja Iso, also um 45° gedreht). Nehme ich eine andere Bezugsecke habe ich ähnliche Probleme (dann ist meine Figur mal drüber obwohl sie drunter sein sollte).

Zu sehen sind zwei Fälle wo es klappt und einige wo es nicht klappt. Die gesamte Treppe ist eine Grafik.
example.jpg
LG Glocke
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Iso Rendering

Beitrag von Xin » Mi Apr 03, 2013 1:34 pm

Wenn die Treppe eine Grafik ist, wie bestimmst Du die Positionierung? Also wo steht die Treppe?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Iso Rendering

Beitrag von cloidnerux » Mi Apr 03, 2013 1:34 pm

Wie wäre es mit nem Z-Index für die Zeichenreinfolge? Erst alle Objekte mit Z-Index 0 Zeichnen, dann alle mit Z 1, dann mit Z 2 usw?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Iso Rendering

Beitrag von Xin » Mi Apr 03, 2013 1:36 pm

cloidnerux hat geschrieben:Wie wäre es mit nem Z-Index für die Zeichenreinfolge? Erst alle Objekte mit Z-Index 0 Zeichnen, dann alle mit Z 1, dann mit Z 2 usw?
Geht nicht, er schaut nicht entlang einer Z-Achse.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Iso Rendering

Beitrag von Glocke » Mi Apr 03, 2013 1:38 pm

Xin hat geschrieben:Wenn die Treppe eine Grafik ist, wie bestimmst Du die Positionierung? Also wo steht die Treppe?
Die Treppe steht auf der gelben Kachel.
cloidnerux hat geschrieben:Wie wäre es mit nem Z-Index für die Zeichenreinfolge? Erst alle Objekte mit Z-Index 0 Zeichnen, dann alle mit Z 1, dann mit Z 2 usw?
Ausgehend von der "Stand-Kachel" (wie auch eingezeichnet mit gelb und grün): wie würdest du die Indizierung vornehmen?

@Xin: Richtig^^ Ich könnte maximal z := x+y annehmen. Aber in der Reihenfolge zeichne ich schon (zeilenweise, dann spaltenweise - ergibt das bei Diamond Iso Maps)

/EDIT: Ein Bekannter schlug mir eben vor ich solle in jeder Zeile die zu zeichnenden Objekte bezüglich ihrer Tiefe sortieren (d.h. Treppe hat mehr Tiefe als Spielfigur, also Treppe vor Spielfigur) und dann in der Zeile nicht spaltenweise sondern entsprechend der Sortierung zeichnen. Was haltet ihr davon?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Iso Rendering

Beitrag von Xin » Mi Apr 03, 2013 1:51 pm

Glocke hat geschrieben:/EDIT: Ein Bekannter schlug mir eben vor ich solle in jeder Zeile die zu zeichnenden Objekte bezüglich ihrer Tiefe sortieren (d.h. Treppe hat mehr Tiefe als Spielfigur, also Treppe vor Spielfigur) und dann in der Zeile nicht spaltenweise sondern entsprechend der Sortierung zeichnen. Was haltet ihr davon?
Die Treppe ist imho zu groß. Wenn Du die Treppe als eine Grafik hast, dann gibt es nur eine Entscheidung, was wo gezeichnet wird. In der Grafik unten rechts zeigt sich das ja - die Entscheidung wird an der gelben Kachel getroffen, dass die untere Spitze vor der Figur gezeichnet wird. Die Figur ist aber überhaupt nicht an der Stelle. Entweder müssen Treppe und Figur durch die Verwendung einer passenden Kachel sortiert werden, also der Kachel die über dem Vergleichsgegenstand (z.B. der Figur) liegt oder die Treppe wird in mehrere gleichgroße Kacheln unterteilt.
Ich würde sie wohl unterteilen, denn ansonsten stellt sich die Frage wieder, wenn Du mehrere Objekte sortieren musst, die größer als eine Kachel sind und sich die Frage stellt, wer steht eigentlich an welcher Stelle vorne? Anders ausgedrückt: Es sollte nichts größer als eine Kachel sein, sonst musst Du Sonderbedingungen beschreiben und die Sache wird kompliziert.

Bleibt die Frage: Kannst Du die Treppe auseinander nehmen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Iso Rendering

Beitrag von Glocke » Mi Apr 03, 2013 2:00 pm

Xin hat geschrieben:Bleibt die Frage: Kannst Du die Treppe auseinander nehmen?
Naja ich will die Treppe ungern auseinandernehmen. Im schlimmsten Falle würde die Figur über die unterste Kachel gezeichnet aber von der oberen verdeckt, so dass z.B. der Kopf weg ist. Die Objekte möchte ich aber auch nicht in ihrer Größe auf die Größe der Kacheln reduzieren. Das ist eigentlich ja auch nicht üblich bei isometrischer Darstellung.
Als Vergleichkriterium für eine Suche würde mir halt die Breite des Bildes einfallen, das zu zeichnen ist. Nur weiß ich nicht, ob ich mir mit der Sortiererei die Performance kaputt mache.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Iso Rendering

Beitrag von Xin » Mi Apr 03, 2013 2:28 pm

Glocke hat geschrieben:
Xin hat geschrieben:Bleibt die Frage: Kannst Du die Treppe auseinander nehmen?
Naja ich will die Treppe ungern auseinandernehmen. Im schlimmsten Falle würde die Figur über die unterste Kachel gezeichnet aber von der oberen verdeckt, so dass z.B. der Kopf weg ist.
Wie soll das gehen, die Kachel über der untersten ist doch definitiv hinter der der untersten Kachel. Wenn die Figur also vor der untersten gezeichnet wird muss sie auch vor der darüberliegenden Kachel sein.
Glocke hat geschrieben:Die Objekte möchte ich aber auch nicht in ihrer Größe auf die Größe der Kacheln reduzieren. Das ist eigentlich ja auch nicht üblich bei isometrischer Darstellung.
Ich habe einen Kurs für 3D-Grafik gemacht (OpenGL). Wichtigste Aussage: Wir simulieren eine 3D-Welt. Das bedeutet nicht, dass es eine 3D Welt ist - es muss nur so aussehen.
Nur weil Du die Treppe in mehrere Einzelteile unterteilst, um Entscheidungen treffen zu können, muss das keine Änderung der Grafik auf dem Bildschirm mit sich ziehen.
Du arbeitest halt mir 4 Vierteltreppen und wenn Du die vier Vierteltreppen darstellst, sieht man halt auf dem Bildschirm vier Vierteltreppen. Optisch unterscheidet sich das aber nicht von einer ganzen Treppe.
Glocke hat geschrieben:Als Vergleichkriterium für eine Suche würde mir halt die Breite des Bildes einfallen, das zu zeichnen ist. Nur weiß ich nicht, ob ich mir mit der Sortiererei die Performance kaputt mache.
Ich auch nicht. Deswegen denke ich, dass 3 zusätzliche Fragen für die Treppe ohne Sonderbedingung effizienter sind, als eine Sonderbedingung pro Kachel.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Iso Rendering

Beitrag von Glocke » Mi Apr 03, 2013 2:36 pm

Xin hat geschrieben:Wie soll das gehen, die Kachel über der untersten ist doch definitiv hinter der der untersten Kachel. Wenn die Figur also vor der untersten gezeichnet wird muss sie auch vor der darüberliegenden Kachel sein.
Das geht indem man seinen Kopf abschaltet xDD
Sorry das war ein Denkfehler meinerseits :) Das geht nicht ^^
Xin hat geschrieben:Ich habe einen Kurs für 3D-Grafik gemacht (OpenGL). Wichtigste Aussage: Wir simulieren eine 3D-Welt. Das bedeutet nicht, dass es eine 3D Welt ist - es muss nur so aussehen.
Schon richtig. Allerdings bedeutet das im Umkehrschluss, dass meine Figuren auch nicht breiter als MAX_TILE_WIDTH sein dürfen :?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Iso Rendering

Beitrag von cloidnerux » Mi Apr 03, 2013 2:38 pm

Ein Bekannter schlug mir eben vor ich solle in jeder Zeile die zu zeichnenden Objekte bezüglich ihrer Tiefe sortieren (d.h. Treppe hat mehr Tiefe als Spielfigur, also Treppe vor Spielfigur) und dann in der Zeile nicht spaltenweise sondern entsprechend der Sortierung zeichnen. Was haltet ihr davon?
Sowas wollte ich ja mit dem Z-Index realisieren. Man muss sich nicht auf die Z-Achse fixieren, Namen kann man ändern^^
Das Problem mir der Treppe ist doch, wenn ich dich Richtig verstehe, dass es ein Objekt ist, dass man je nach Position der Spielfigur unterschiedlich betrachten muss.
Von daher musst du entweder für deine Treppe eine Komplexere Beschreibung finden, die auch Abhängig von der Position der Spielfigur eine Richtige Entscheidung trifft, oder du zerlegst es solange in einfachere Teile, die du Beherrschen kannst(Teile und Herrsche)

Gibt es egt den Fall, auf der Treppe zu stehen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten