mmofacts.com

Iso- Karte und Koordinatenberechnung

gepostet vor 18 Jahre, 9 Monate von Skyrunner
Moin,

ich habe folgendes Problem. Ich verwende eine Isometrische Karte. Funktioniert soweit auch ohne Probleme.

Nun möchte ich aber neben dieser Ausschnittskarte (9x9 Felder) auch eine Gesamtübersicht darstellen, damit der Spieler weiß wo er ist. Gesagt getan. Bild mittels gdlib und verschieden- farbigen Pixeln erstellt (100x100 px). Wenn der Spieler jetzt auf einen Punkt der Übersichtskarte klickt übergebe ich an das PHP Skript die geklickten Koordinaten mittels dem -Tag ismap.

Jetzt könnte ich diese kleine Übersichtskarte ja neben die Ausschnittskarte stellen. Doch das sieht naja... bescheiden aus, denn die Ausschnittskarte ist im iso format und die Übersichtskarte ist quadratisch... ned so dolle dacht ich mir und hab die kleine Übersichtskarte mittels GIMP

1. um 45° gedreht und dann
2. um die hälfte in der Höhe "zusammengedrückt"

Nun ist auch die Überischtskarte im Iso- Format. natürlich funktioniert die Berechnung der Koordinaten die an das PHP Skript via -Tag ismap übergeben werden nicht mehr, was bedeutet, dass ich sie in PHP manipulieren muss, damit ich wieder die Koordinaten der quadratischen Karte bekomme.

Nach langem nachdenken bin ich aber immnoch auf keine Lösung gestoßen. Weiss vielleicht jemand eine Lösung bzw stand schonmal vor dem selben Problem?

Falls meine Ausführungen nicht eindeutig genug waren, hier nochmal ein Bild:
gepostet vor 18 Jahre, 9 Monate von Kallisti
Wenn 100x100 px bei dir 100x100 Koordinaten darstellen und du es nach dem Drehen um die Haelfte shrinkst, verlierst du natuerlich einige Koordinaten, irreversibel... Demnach muss die Skalierung schon anders sein.

Als genereller Ansatz:

Multiplizier die Koordinate mit einer Drehmatrix, hier also
[[cos a, -sin a][sin a, cos a]]... Alpha ist bei dir ja 45%, daher
[[sqrt(2)/2. -sqrt(2)/2][sqrt(2)/2, sqrt(2)/2]], also

[x,y] * [[sqrt(2)/2. -sqrt(2)/2][sqrt(2)/2, sqrt(2)/2]] = [sqrt(2)/2*x+sqrt(2)/2*y, -sqrt(2)/2*x, sqrt(2)/2*y]

Hoffe das stimmt. :-)
gepostet vor 18 Jahre, 9 Monate von Skyrunner
Danke für die schnelle Antwort, aber ich bin nicht der Mathematiker vor dem Herrn, könntest du mal ein Beispiel formulieren?

Dass mir durch das "quetschen" Koordinaten verloren gehen ist nicht so tragisch, dmit kann ich leben

Aber über ein kleines Rechenbeispiel würd ich mich freuen.

Grüße aus Berlin
gepostet vor 18 Jahre, 9 Monate von TheUndeadable
http://depon.net/test/isometrie.html

Dort findest du im JS die Formeln für die Hin- und Rücktransformation. Ist im Prinzip genauso gemacht, wie Kallisti es gesagt hat.
gepostet vor 18 Jahre, 9 Monate von Skyrunner
Danke, sobald ich das Problem gelöst habe werd ich die Lösung mit Bsp. hier mal für die Nachwelt festhalten
gepostet vor 18 Jahre, 9 Monate von BuschnicK
Was du willst ist eine Basis-Wechsel-Matrix. Die übliche Iso Perspektive ist um 45 Grad rotiert und meist zusätzlich noch gestaucht (eine Raute ist doppelt so breit wie hoch). Damit erhälst du ne Matrix, die irgendwie so aussieht:
World to Screen:
( 2 2 )
(-1 1 )

Mein BrowserGame benutzt das, ist aber noch nicht online. Ich hab aber auch eine OpenSource C++ Game engine, die eine solche Transformation umsetzt, such im Source nach der Funktion GetScreenForWorld oder Render, dann müsstest du den Kram finden:
www.buschnick.net/BlackFish/About.shtml

mfG,

Sören
gepostet vor 18 Jahre von Skyrunner
*push*
Beispielkarte:
warfare1942.de/test.php
Das Bild war vor dem drehen exakt 1000x1000 px groß. Das Seitenverhältnis beträgt nun 2:1.
Kann mir jemand mal verständlich machen, was hier in meinem Falle w und h sind? Bezieht sich w auf 1000 oder auf die volle Breite des Bildes? Oder auf die Breite eines Kartenfeldes auf dem Bild?
x = (mousex/w + mousey/h)

y = (mousey/h - mousex/w)
gepostet vor 18 Jahre von Kapsonfire
edit ooooopppps hab die frage voll nicht vollständig gelesen

Auf diese Diskussion antworten