User:Hanekomi/OpenGL-Tilebetrachter

From OpenStreetMap Wiki
Jump to navigation Jump to search
Beispiel für die perspektivische Darstellung

Was tut das Programm?

Es stellt die Landkarte, wie sie auf dem Openstreetmap-Server in vorgerenderten Tiles zur Verfügung steht, in perspektivischer Ansicht (3D-Perspektive, also auch schräg, gekippt usw.) dar. Dazu lädt es die benötigten Tiles herunter und speichert sie (um sie nicht jedesmal neu holen zu müssen und somit die „Tile usage policy“-Bedingungen nicht zu verletzen) auch auf der Platte im „temporären“ Verzeichnis. (Unter dem Menüpunkt „Bedienungsanleitung“ erfährt man die Stelle konkret – das gebietet die Fairness, denn das Programm löscht sie nicht mehr; es kann ohnehin nicht wissen, ob es nach Ablauf einer Speicherfrist nochmal aufgerufen wird. Der Benutzer sollte das also bei Bedarf von Hand tun.) Die Einstellung der Perspektive erfolgt über Tastendrücke; die Anfangsposition kann man mit Befehlszeilenparametern angeben. Auch das ist in der Hilfe-Messagebox erklärt.

Wo kriege ich es her?

Man muss es selbst compilieren, und ich gebe keine Garantie, dass das funktioniert, denn ich habe selbst vorher nie so etwas (OpenGL für Qt4) programmiert, und habe dieses Programm nur auf meinem Rechner (Gentoo-Linux) und eine andere Version auf dem Rechner eines Bekannten (Arch-Linux) compiliert (wobei sich schon herausstellte, dass er im Makefile einen etwas anderen Include-Pfad brauchte). Auch auf einer MacOS-X-Maschine konnte es schon zum Laufen gebracht werden (siehe Makefile.mac); dort wurden allerdings die gespeicherten Tilebilder bei jedem Systemstart gelöscht. Also man sieht, es ist eine Alphaversion für Benutzer, die sich von solchen Ansagen nicht abschrecken lassen ... Umso willkommener sind Erfahrungsberichte von anderen Leuten, die es zum Laufen gekriegt haben (und wie) oder auch nicht. Auch angepasste Makefiles, oder was man sonst für solche Zwecke auf eurer Entwicklungsplattform nimmt, sind willkommen! (Verbesserungen am Programm selbst erst recht, siehe unten.)

Der Code kann auf dem öffentlichen Server Launchpad unter https://launchpad.net/persplka heruntergeladen und eingesehen werden, entweder unter „View the branch content“, oder gleich mit dem dort propagierten Tool bzr.

Kurzanleitung für (Noch-)Nicht-Programmierer

auf unixartigen Systemen

  • Die Pakete für Qt4 und OpenGL müssen installiert sein. Wenn es davon auf dem System gesonderte Pakete zum Entwickeln von Software gibt, dann die.
  • man muss sich auf der Kommandozeile (also im Textmodus oder Terminalfenster) befinden und im aktuellen Verzeichnis (was mit cd angegeben werden kann), müssen die Dateien persplka.cpp, persplka.h und Makefile liegen.
  • dann make eingeben
  • Daraufhin sollte das System eine ausführbare Datei namens persplka herstellen => voilà! Wenn stattdessen nur Fehlermeldungen herauskommen, kann man versuchen, im Makefile (mit irgendeinem Texteditor) die Angaben anzupassen (z. B. Verzeichnispfade, wo irgendwelche .h-Dateien liegen), oder hier auf der Diskussionsseite Rat und Hilfe suchen.

auf anderen Systemen

Gute Frage. Wer mehr weiß, bitte ergänzen ...

Wozu ist das gut?

  • Man kann, ohne eine komplexe Rendersoftware und die ganzen Datenmassen installieren zu müssen, die offene Karte perspektivisch anschauen und die Aussicht genießen :)
  • Beispiel dafür, wie bei Zusammenstellung eckiger Tile-Bilder gemäß der Kugelform der Erde insbesondere da Zwischenräume auftreten, wo Tiles verschiedener Größenstufen aufeinandertreffen. Das ist wegen der Abhängigkeit des Maßstabs vom Breitengrad vor allem in hohen Breiten erforderlich, wenn man Tiles von einigermaßen gleichem Maßstab verwenden will.
    Entwickler, die sich verschiedene Ansätze für ähnliche Aufgaben (siehe auch Category:3D, Things_To_Do#Other_suggestions) durch den Kopf gehen lassen, könnten es als Anschauungsobjekt interessant finden, wohin einer davon führt. Vielleicht dann halt auch als Beispiel, wie man es nicht machen will, es gibt ja inhärente Probleme beim Ansatz mit den Tiles: Man kann Tiles unterschiedlicher Zoomstufe gleichzeitig auf dem Schirm haben (siehe kleines Bild und im großen Bild die obere rechte Ecke), und die Schrift kann beispielsweise „auf dem Kopf stehen“.
  • Möglicherweise können auch Codeteile für Verfahren, die in diesem Programm ihre Funktionsfähigkeit bereits gezeigt haben, bei der Erstellung anderer Programme Arbeit sparen.

Idee „Tischdeckennavigation“

Vor allem aber habe ich eine bestimmte Anwendungsform vor meinem inneren Auge, für die dieses Programm eine Vorbereitung darstellen kann: man müsste „nur noch“ ein Modul dazuprogrammieren, das diese Idee implementiert (wofür mir selbst die Spezialkenntnisse fehlen und auch schwierig zu erarbeiten sein dürften). Deshalb stelle ich dies in die Öffentlichkeit, in der Hoffnung, dass jemand mit solchen Kenntnissen oder noch mehr Enthusiasmus „anbeißt“ und sich der Idee annimmt.

Es geht darum, dass man ein videofähiges Handy oder dergleichen (von der Webcam bis zum PDA) über eine (geeignet bedruckte, oder im utopischen Fall auch nur irgendwie ungleichmäßig gefärbte) Fläche hält und dabei (auf dem Computerbildschirm, oder vielleicht sogar auf dem Gerät selbst, wenn dessen Leistung es hergibt) die Ansicht der Karte angezeigt bekommt, die es filmen würde, wenn da eine Landkarte wäre. (Bzw. wenn da das Land wäre und das Handy ein Flugzeug ...) Damit könnte man sechs Koordinaten auf einmal (von Position und Ausrichtung) auf bequeme Art steuern und sich einen Mischung aus Überblick und Detailansichten in schnellem Wechsel bei leicht zu verstehender Bedienung verschaffen, wie man sie gerade haben will. Sinnvoll (wenn auch nicht ganz so „intuitiv“ - eigentlich hasse ich dieses Wort im Zusammenhang mit Software, meistens ist es einfach gelogen bzw. trifft halt auf manche Benutzer zu und auf andere nicht) wäre dabei noch ein Mechanismus, der in diesen „sechs Dimensionen“ (oder vielleicht nur den dreien für die Position) dem entspricht, was in zwei Dimensionen jemand macht, der eine Maus hochhebt und, „ohne dass sie es mitbekommt“, an einer anderen Stelle wieder absetzt, weil er z. B. über den Rand des Mousepad zu fahren drohte. So könnte man, etwa durch Gedrückthalten einer bestimmten Taste während der Bewegung, weitere „Reisen“ und größere Änderungen im Maßstab durchführen.

Die Berechnung der Koordinaten ist wohl nicht sehr schwierig, wenn die aufgenommene Fläche mit einem rechtwinkligen Liniennetz überzogen ist und man dieses erst einmal auf dem Bild dingfest gemacht hat. Die Perspektive liefert dann für beide Dimensionen einen „Fluchtpunkt“ (Wenn die Kamera in gewisser Weise ganz gerade hängt, allerdings ein „unendlich ferner Punkt“ der Ebene ...), die von einem gewissen hinter dem Bildsensor liegenden virtuellen Beobachtungspunkt aus gesehen selbst unter einem rechten Winkel (irgendwo i. A. schief im Raum hängend) erscheinen (und aus denen man auch schon einen gedachten „Horizont“ der Ebene als Gerade auf dem Bild konstruieren kann). Ich vermute, dass dieser Beobachtungspunkt durch die Bauart der Kamera bestimmt ist und immer derselbe bleibt. Dann kann man ihn für eine gegebene Kamera bei einer Art Kalibrierungslauf berechnen, zu dem man eine geeignete Kombination von drei Aufnahmen von so einem rechtwinkligen Muster benutzt, da man zu einer solchen Aufnahme mit dem Thalessatz eine Kugelschale konstruieren kann, auf der der gesuchte Punkt liegen muss. Kennt man nun also diesen Punkt und die aktuellen „Fluchtpunkte“, dann hat man eine Ebene, die zu der aufgenommenen karierten Fläche parallel sein muss, und kann die Projektion entsprechend zurückrechnen. Ein geeignetes Testmuster für den Anfang wären etwa fünf schwarze Rechtecke auf weißem Grund, die in der Art eines 3x3-Schachbretts mit schwarzer Mitte aneinanderstoßen, nur dass z. B. die obere Zeile und die mittlere Spalte halb so breit ist wie die anderen. Kennt das Programm diese Konfiguration und die Koordinaten der acht Linien auf seinem Foto (vier in jeder Richtung), kann es die Koordinaten ausrechnen.

Das Schwierige bei der Realisierung wird vermutlich (wenn man einmal eine einigermaßen portable Möglichkeit gefunden hat, pixelweise an die Videodaten zu kommen, was käme da infrage?) der Umgang mit den Ungenauigkeiten der Aufnahme: Teile außerhalb der genormten Fläche, Lichtverhältnisse (samt Schatten), Unschärfen, Ungenauigkeiten der Optik oder des Untergrunds (was ist eine gerade Linie?) ... Mustererkennung ist ja ein Thema, an dem sich die Fachwelt früher jahrzehntelang die Zähne ausgebissen hat. (Deswegen traue ich mich da nicht dran, weil man da mit meinem bevorzugten Arbeitsstil, dem selber Ausdenken, kaum weiterkommen wird.) Wer sich damit auseinandersetzen möchte, kann vielleicht etwas mit der Seite http://www.soe.ucsc.edu/classes/cmps290b/Fall07/GameRecord/index.html anfangen, die ich im Web zum Thema Erkennung von Go-Brettern gefunden habe (die sind schließlich auch kariert). Vielleicht aber auch nicht, ich bin den Literaturhinweisen nicht nachgegangen, habe dorther aber immerhin schonmal die Information, dass die Schachbrett-Erkennung (ohne die Figuren vermutlich ...) einfacher ist.

Wie geht es weiter?

Da ich voraussichtlich in absehbarer Zeit nicht an diesem Programm weiterarbeiten werde, ermuntere ich ausdrücklich alle Interessierten dazu, sich den Code zu schnappen und daran zu herumzuändern, wie sie es für richtig halten.

Stellen im Code, an dene ich selbst der Meinung war, dass man etwas verbessern oder ergänzen sollte, wenn man die Zeit aufbringen will oder wenn einem eine Möglichkeit einfällt, wie es geht, oder an denen ich mir unsicher war, ob meine Lösung richtig war, oder nicht, habe ich im Code mit „XXX“ markiert. Man beachte, das ich vorher mit OpenGL noch nichts gemacht hatte und mit Qt nur sehr wenig – also nicht wundern, wenn hinter einem „XXX“ eine für versierte Leute ziemlich dumme Frage steht ... (bei der die passende Änderung, wenn die Antwort lautet „Das ist doch O.K. so“, auch sein könnte, den Kommentar einfach zu entfernen). Gelegenheiten zur Verbesserung wird es dementsprechend auch an Stellen geben, wo es mir nicht einmal auffiel. Einige Stellen, an denen ich besonders eklatanten Verbesserungsbedarf sehe, habe ich mit „XXX XXX“ oder gar „XXX!XXX“ kommentiert.

Den Programmquelltext habe ich zu diesem Zweck ja auf einen für so etwas ausgelegten Open-Source-Code-Server gestellt (siehe oben), was für mich ebenfalls neu ist; sollten Probleme auftreten, ihn da herzubekommen oder zu ändern, bitte (hier oder dort) Bescheid sagen!