Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 12:36

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Dez 02, 2005 12:06 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Ich habe schon in einem anderem Forum nachgefragt aber ich denke mal, die Frage ist hier besser aufgehoben. :)

Ok, ich möchte gerne in einem normalen Fenster eine flache Karte darstellen lassen die man hin und herschieben kann, wie man will. In diesem Fenster soll unten ein Feststehendes Bitmap dargestellt werden für verschiedene Funktionen. (Ich habe mal ein Bild gemalt um zu verdeutlichen wie ich das meine (siehe Anhang))

Mein Problem besteht darin, das ich nicht weis, wie ich es umsetzen soll, das wenn man mit der Maus über ein bestimmtes Gebiet fährt, dieses umrandet wird und auchausgewählt werden kann.
Und wie stelle ich die Karte so dar, das sie so schräg angezeigt werden und auch im dem Stiel verschoben werden kann?

Sorry, absoluter Noob ! :D

Wenn mir da jemand paar Links oder Codeschnipsel zuposten könnte, wo sowas schonmal behandelt wurde, wäre ich sehr dankbar. Hab schon viele Seiten durchstöbert aber nie das wahre gefunden.

Terra


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
Also die Karte so isometrisch darzustellen ist nicht das Problem, dafür verschiebst du einfach die Kamera mit gluLookAt so wie du gerne auf die Fläche schauen möchtest.

Und für die "selektion" gibt es zig verschiedene Möglichkeiten, da kommt es hauptsachlich darauf an wie deine Karte aufgebaut ist! (schau mal im Wiki gibts ein gleichnamiges Tutorial)

Das Bitmap in den Vordergrund zu rendern ist dann widerum einfach. Einfach ne Orthogonale Projection einstellen und in Fenster-Coordinaten rendern.

Hoffe das hilft dir weiter, wenn nicht solltest du dir mal die EinsteigerTuts im Wiki anschauen.

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 13:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Das Scrollen kannst du am einfachsten realisieren wenn du wie folgt vorgehst.
4 If Abfragen von der Maus um festzustellen ob gescrollt werden soll.
Hierbei ist If Abfrage Nr.1 en rechteck oben
Code:
  1.  
  2. ScrollY:=0;
  3. ScrolllX:=0;
  4. //geht nur wenn du im Vollbild bist sonnst muss die if Abfrage ausgweitet werden
  5. if MY<5 then ScrollY:=1;//oben
  6. if MY>Window.Height-5 then ScrollY:=-1;//unten
  7. if MX<5 then ScrollX:=-1;//links
  8. if MX>Window.width-5 then ScrollX:=1;//rechts
  9.  


Nun haben wir alle Fälle und in ScrollX/Y sind nun die bewegungsrichtung die du mit deiner Scrollgeschwindigkeit multiplizierst und direkt für X und Z von der Kameraposition einsetzen kannst.
Wahlweise auch mit GluLookup machbar aber gleice vorarbeit mit der Prüfung.
Dann zeichnest deine Karte und am besten noch nicht benötigte Teile nicht mitrendern lassen siehe Frustumculling

Am besten verkleinest du den GLViewport noch von der Höhe her somit sparst du ein bischen performance wenn die terrains komplexer werden.
Wenn es dann zur Gui geht machst du den Viewport wieder auf vollbild und gehst in den orthogonalmodus mit glortho und zeichnest deine GUI.

Die wichtigen dinge hab ich mal dick makiert die findest du in unserem Wiki, wo die funktionen sehr ausführlich erklärt sind.
Dort findest du auch die Tutorials zum zeichnen von Texturen mit einem Alphakanal und 2D zeichnen in OpenGL, welche für deine Gui sehr hilfreich sein sollte.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 13:38 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Selektion ist im Falle der Karte etwas anders als normal.

Wenn die "Länder" so unregelmäßig geformt sind, dann wäre es eine Möglichkeit jedem Land eine Eigene Farbe zu geben und bei einem Click (bzw. MouseMove) die Farbe auszulesen. Keine Ahung wie Performant das ist. Du würdest dir auf alle Fälle viele Probleme nehmen, wenn die Karten aus regelmäßigen Objekten aufgebaut wären. (Quads, Dreiecke, Hexfelder) Dann könntest du die normale GL Selektin nehmen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 14:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das mit dem Farbe auslesen hatte ich in dem anderen Forum auch schon mal vorgeschlagen/überlegt. Allerdings geht glReadPixels doch auch nur auf den sichtbaren Bereich, oder? Und die dargestellte Textur soll ja nicht so eine spezielle eingefärbte Textur sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 16:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die genauste und am wenig zeitraubenste methode würde ich sagen wäre, eine 2. Textur mit füllfarbe mitzuliefern oder den alphakanal dafür zu vergewaltigen. Einfach ein raycast und den treffer mit den eckpunkten vergleich und dann mit einem 3satz in dem echten pixel der textur gucken die rückgabe sagt welcher wert und somit weiß man was ausgewählt wurde. Also das schwerste daran ist der raycast und dazu findet man ja was im WIki :wink: Es ist denke am besten wirklich den Alpha channel zu nutzen mehr als 255 verschiedene regionen wird man wohl kaum auf einer 512/1024 textur bringen. Und höhere auflösung machen dann der Graka ganz schön zu schaffen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 20:19 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
Ich würde das so machen:

Erst mal zu Karte. Die würde ich erst mal Malen und als Textur laden. Dazu gibts eine Textur für jedes Land, wo dieses Land z.B. farblich hervorgehoben ist, und der Rest durch den Alpha-Kanal rausmaskiert/durchsichtig ist. In deinem Prog (Ich gehe mal davon aus, du weißt, wie du OGL initialisierst und Texturen lädst) machst du dann ein Quad, auf dass du die erste Textur mit der gesammten Karte klebst. Wie du die Kamera setzt und das Scrollen machst wurde ja schon beschrieben. Die Auswahl der Länder mit der Maus würde ich ganz simpel stricken. Zu jedem Land legst du einen Punkt fest, der schön Mittig im jeweiligen Land liegt, und schreibst dir die Koordinaten auf. Die rechnest du dann in die Koordinaten im OGL-Raum um, also wenn z.B. dein Quad die Eckpunkte (-1 -1), (1 -1), (1 1), (-1 1) hat, und der Punkt in deiner Textur (mit der Auflösung 256x256) an der Stelle (12 34) liegt, dann hätte er im Objectspace die Koordinaten (12/256*2-1 34/256*2-1). Denk dran, dass bei OGL die Texturkoordinaten auf den Bereich von 0..1 skaliert werden. Das kannst du alles vorher berechnen. Im Prog projezierst du dann diese Mittelpunkte mit gluProject (müsste im Wiki stehen) auf den Bildschirm und guckst dann welcher am nächsten an der Maus ist. Das is dann zwar nicht so exact, aber die Benutzung dürfte dennoch recht intuitiv sein.
Anschließend wird das Quad nochmal gerendert, nur mit der Textur des ausgewählten Landes und mit eingeschalteter Transparenz, so dass nur das farblich hervorgehobene Land angezeigt wird.
Wenn du zu viel Zeit hast, kannst du das auch noch mit so stylischen Überblendungen zwischen den Ländern machen^^

Die Box unten im Bild mit den Tools drin wird hinterher gerendert, zu GUIs gibts hier ja bereits ein paar Threads.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 22:09 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Deine Methode geht net bei Ländern wie z.B. Chile. Das is sehr lang und dünn. Wenn jetzt Neben einen solchen Land viele Kleine Länder wären würdest du jedes Land leichter auswählen können als Chile.

Ist die Karte immer gleich? Wenn ja, dann könntest du dir die mühe machen paar Polygone im Selektionsmodus über die Karte zu legen, welche die Form der Länder aproximieren (annähern). Dann kannst du ganz normal mit Selktion arbeiten.

Ist natürlich nur praktikabel, wenn du keine Zufallskarten generierst...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 02, 2005 22:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Ich hatte ein ähnliches Projekt vor und werde es wohl auch verwirklichen.
Ich habe es so gemacht, dass ich eine Liste hatte, in der jedem Land eine Farbe zugeordnet war (war ein 24Bit-Bitmap).
Dann habe ich ein kleines Programm geschrieben, wo ich die RGB-Werte aus meiner Liste eintragen konnte und dann ein Land "ausmalen". Lässt sich in Delphi dank Canvas SEHR einfach realisieren.
Dann kannst du
a) aus den Mittelwert alle Punkte einer Farbe den Mittelpunkt eines Landes ausrechnen ("Bananenländer" mal ausgenommen...)
b) du kannst
b.1) life ein Land immer hervorheben, indem du nur SEINE Farbe hervorhebst
b.2) beim initialisieren für jedes Land ein extra Bmp erstellen (wenn möglich an max. größe des Landes angepasst) mit Alphakanal, wo das Land NICHT ist. Die Methode wäre nicht so performance, aber speicherlastig.

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 03, 2005 18:57 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also so Komponenten nehm ich für GL-Sachen net.

Aber was ginge wäre: Einen Editor schreiben, welcher die Karte in der Draufsicht darstellt. Und dann Eckpunkte eines Polygons definieren, welches im Land liegt. Diese Eckpunkte in einem Array später im Selektionsmodus mittels glDrawArrays (glaube das war die richtige funktion) rendern.

Aber ums mal auf den Punkt zu bringen: Keine Ahnung wie das die Kommerziellen Spiele machen. :roll:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 18:12 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Das sind ja sehr viele Lösungsvorschläge. Vielen Dank erstmal dafür.

Wie schon gesagt, bin ich nicht so gewant in OpenGL und stehe da eigentlich wie nen Ochse vor´m Berg.
Was mich aber aufhorchen ließ war das Cyberpuer schon etwas änliches gemacht hat. Vielleicht könntest du mir da mal Bruchstückhaft mal dein Quelltext mit Pics zukommen lassen, das ich mir das mal an einem praktischen Beispiel anschauen könnte. Wäre echt nett und vorallem Hilfreich. terra-interaktive@gmx.de

Was gibt es noch zu sagen. Naja, eigentlich nichts bis auf das, das ich es jetzt mal versuchen werde. Ach ja, gleichbleibende Flächen geht leider nicht da auf der Karte spezielle Bereiche ausgewählt werden sollen. Und da mal die Karte sehr unrägelmäßig ist, wirds halt bissel schwieriger.

Das Tutorial hab ich mir mal bei Wiki schonmal durchgelesen. Weitergekommen bin ich aber nicht da es nur mit in Delphi gezeichnete Farben beschrieben wurde und nicht mit Bitmaps. Kann aber auch sein, das ich mir ein anderes Tutorial durchgelesen habe als ihr meint.

Soweit erstmal. Für weitere Lösungen bin ich sehr verbunden.

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 05, 2005 19:24 
Offline
DGL Member

Registriert: Do Dez 01, 2005 21:56
Beiträge: 10
Wohnort: Stuttgart
wie wärs wenn du jede landesgrenze in einer eigenen Farbe auf die kartezeichnest,
und dann ständig abfragen welche farbe sich gerade "unter" dem dem Courser befindet.
Und je nach dem Welche Farbe als letztes überschritten wurde weisst du in welchem Land du bist.
Das Problem wäre halt das diese Landesfarbe nicht mehr auf der Karte vorkommen dürfte.
Und leider keine Ahnung wie dick du die Grenzen machen müstest...

nur so ein gedanke kene ahnung obs funktioniert :p


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 06, 2005 13:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das is dann genau dass mit den "Ländern eine bestimmte Farbe zuweisen"

Problem hatte Lössy gesagt, dass deine eigentliche Karte ja nicht so gefärbt werden soll.
Lösung wäre:
- im OnKlick rufst du selektion auf
- Statt der bisherigen Karten texturierst du dein Quad mit der FarbSelektion-Textur
- Du ließt die Farbe aus und berechnest welches Land gemeint war
- Du bindest wieder die normale Textur
- du gibst das Ergebnis zurück

Fertig. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 10:22 
Offline
DGL Member

Registriert: Fr Dez 02, 2005 11:59
Beiträge: 44
Programmiersprache: Delphi XE3
Ich überlege ganze Zeit, ob es vielleicht einfacher wäre über der Karte ein Virtuelles "feinmaschiges" Gitternetz zu legen und einfach mittels eines Array´s die Bereiche zu definieren, die dann später den Mauskoordinaten entsprechen. Ich habe da etwas gefunden, das in etwa die gleiche Technik verwendet. Ist das Bomberman Script. Um genau zu sein, der Level-Editor davon. Alles schön und gut. Was mich ein bissel stuzig macht ist aber, das ich es nichtmal hinbekomme, meine Karte überhaupt mal zu definieren. Sprich, das was oben vorgeschlagen wurde mittels "gluLookAt" meine Karte so schräg anzeigen zu lassen funktioniert nicht. Egal wo ich den Befehl hinsetze. Entweder wird meine Karte ganz normal (von oben) angezeigt oder ich erhalte ganz einfach einen schwarzen Bildschirm. Auch mit glRotatef oder Perspective geht nix. Also irgendwas mache ich grundlegend Falsch.

Blöd ist halt, das ich zu Hause kein Internet habe und mal schnell nach bestimmten Befehlen suchen kann. Und hier auf Arbeit ist es immer so eine Sache Programme zu installieren. Außerdem lerne ich besser, wenn ich ein funktionierendes Script vor mir habe als wenn man mir sagt "mach es mit dem und dem Befehl". Ich hoffe, ihr versteht, was ich damit sagen will. Nicht das mir jemand jetzt mein Programm schreiben soll aber vielleicht kennt jemand ja ein Projekt, was änlich funktioniert und wo auch der Source mit vorhanden ist.

Terra


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Dez 08, 2005 13:32 
Offline
DGL Member

Registriert: Sa Jan 22, 2005 21:10
Beiträge: 225
hmm, wie wärs damit?

Code:
  1.  
  2. //Matrizen
  3.      glMatrixMode(GL_Projection);
  4.      glLoadIdentity;
  5.      gluPerspective(60, 4/3, 0.1, 75);
  6.      glMatrixMode(GL_Modelview);
  7.      glLoadIdentity;
  8.      glTranslatef(0, 0, -5);
  9.      glRotatef(-45, 1, 0, 0);
  10.  
  11.  
  12. //Map malen (Hier ohne Texcoords)
  13. glBegin(GL_QUADS);
  14.  glvertex2f(-1.0, -1.0);
  15.  glvertex2f(1.0, -1.0);
  16.  glvertex2f(1.0, 1.0);
  17.  glvertex2f(-1.0, 1.0);
  18. glend;
  19.  



musst eventuell bei
glTranslatef(0, 0, -5);
glRotatef(-45, 1, 0, 0);
noch n bisschen noch mit den Werten rumspielen, damits schön aussieht, aber so, wie es jetzt ist, sollte es wenigstens die Karte in den Sichtbereich bringen.

_________________
[18:30] tomok: so wie ich das sehe : alles. was nich was anderes ist als nen Essay ist nen Essay

hi, i'm a signature viruz, plz set me as your signature and help me spread :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 15 Queries | GZIP : On ]