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

Aktuelle Zeit: Fr Jul 18, 2025 04:19

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Minimap: Einfachste Lösung
BeitragVerfasst: Fr Aug 06, 2010 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

zur besseren Orientierung will ich eine Minimap unten links hinzeichnen. Also dachte ich mir, es genügt einfach zweimal alles zu zeichnen und dann beim zweiten Mal den Viewport zu verkleinern und die Kamera hochzukippen. So schön und einfach ist das jedoch nicht, denn die Kamera müsste dann nur dafür wieder komplett umprogrammiert werden bzw. um einen Modus erweitert werden. Alles in allem ist das nicht wirklich die beste Lösung denke ich, denn gibt es keine Möglichkeit das einfacher zu realisieren ? Sonst bräuchte man zwei Kameras, doppelte Zeichenroutine etc. für so eine so kleine Minimap.

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Minimap: Einfachste Lösung
BeitragVerfasst: Fr Aug 06, 2010 14:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Öh... das lässt sich so direkt schwer sagen... jenachdem wie du das alles implementiert hast etc eben.

In meiner Engine/Framework sage ich halt einfach "Camera1.render()" bzw "MinimapCamera.render()".. dadurch kann ich einfach eine beliebige anzahl an Kameras haben die alle einfach die Scene Rendern können.

Allerdings ist sowieso die frage ob es das geschickteste ist einfach eine Top-Down ansicht der Scene zu rendern. Kommt eben drauf an um was es geht.. Ich finde in der regel eine minimalistische darstellung der scene besser. Das kann man entweder vorher einfach als Bild erstellen und das dann anzeigen oder irgendwie automatisch aus der map generieren.

Aber auch hier ist es ein riesen unterschied ob es um ein Rennspiel, einen Shooter oder einen Snake-Clon geht ;)

Aya


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Minimap: Einfachste Lösung
BeitragVerfasst: Fr Aug 06, 2010 15:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Bei mir geht es um ein Sonnensystem. Aufgrund von CallLists geht ein Rendervorgang recht flott und es wäre von daher auch kein Problem das so zu lösen, wie Du es bei Dir oft löst. Problem ist halt einfach, dass ich die Kamera ziemlich umrechnen müsste und es dabei Probleme gibt. Um die Implementation mal zu zeigen und die Hilfe zu erleichtern, hier mal ein recht langer Beitrag.
Code:
Pos, Cam : TVec3f;

Code:
// Apply-Prozedur - setzt die Kamera
glRotatef(Cam[0], 1.0, 0.0, 0.0);
glRotatef(Cam[1], 0.0, 1.0, 0.0);
glTranslatef(Pos[0], Pos[1], Pos[2]);
glRotatef(110.0, 1.0, 0.0, 0.0); // Blickwinkelkorrektur - ohne diese Zeile hätte man die für Minimap gewünschte Draufsicht - in der Datei im Anhang nicht vorhanden, dafür steht sie aber hinter dem Camera.Apply im Hauptprojektcode

Abhängig von den Tasten, welche hier von Integer-Werten repräsentiert werden werden dann die paar Werte berechnet.
Code:
// KeyDown
// Oben/Unten
if Key in [0, 1] then
begin
  if Key = 0 then
    Speed :=  CAM_SPEED
  else
    Speed := -CAM_SPEED;
  Pos[0] := Pos[0]+Cos(Cam[1]/180*Pi+Pi/2)*Cos(Cam[0]/180*Pi)*Speed*tDelta/Scale;
  Pos[1] := Pos[1]+                        Sin(Cam[0]/180*Pi)*Speed*tDelta/Scale;
  Pos[2] := Pos[2]+Sin(Cam[1]/180*Pi+Pi/2)*Cos(Cam[0]/180*Pi)*Speed*tDelta/Scale;
end;
// Links/Rechts
if Key in [2, 3] then
begin
  if Key = 3 then
    Speed :=  CAM_SPEED
  else
    Speed := -CAM_SPEED;
  Pos[0] := Pos[0]+Cos(Cam[1]/180*Pi)*Speed*tDelta/Scale;
  Pos[2] := Pos[2]+Sin(Cam[1]/180*Pi)*Speed*tDelta/Scale;
end;

Die Maus muss auch eingebunden werden:
Code:
// MouseMove, MousePressed simuliert die Maustasten
if MousePressed > 0 then
begin
  Cam[1] := Cam[1]-(oMousePos.X-X);
  New    := Cam[0]-(oMousePos.Y-Y);
  if (New < 90) and (New > -90) then
    Cam[0] := New;
end;
oMousePos.X := X;
oMousePos.Y := Y;

Das wäre nun die freie Kamera, man kann hinschauen wo man will und sich hinbewegen wo man will. Wenn man es genaunimmt bräuchte man jetzt für die Minimap eine an den Betrachter gefixte Kamera da der Betrachter in der Minimap in der Mitte stehen soll. Da man das oben genannte Rotate in der Applay-Prozedur nun weglässt, hat man die Draufsicht. Allerdings verzerrt das die Achsen etwas stark, weshalb man dann bei der Tastenüberprüfung schauen muss, die Verschiebung mit einzuberechnen. Ist nicht schwierig, X- und Y-Achse wären es dann, die Z-Achse sollte man allerdings nicht mehr ändern, da das die Höhe des Vogels aus der Vogelperspektive, die man ja jetzt hat, darstellt. Das große Problem - sitze da wirklich schon den ganzen Tag dran und komme keinen Meter weiter - ist, dass die Mausberechnungen wieder recht zickig werden. Die Maus darf jetzt nicht mehr den Blickpunkt ändern, sie ist nur noch dazu da, die Minimap zu drehen UND das glTranslate so zu beeinflussen, dass alles passt. Und genau das schaffe ich nicht. Es ist aus der Perspektive heraus auch recht ungewohnt, ich muss mir sogar die Achsen zeichnen lassen um überhaupt eine gute Orientierung zu haben.
Bei der Umsetzung der Idee fange ich jetzt mal bei den Tasten an:
Code:
// Hoch runter
Pos[0] := Pos[0]+Cos(Cam[1]/180*Pi+Pi/2)*Cos(Cam[0]/180*Pi)*Speed*tDelta/Scale;
Pos[1] := Pos[1]+Cos(Cam[1]/180*Pi)*Speed*tDelta/Scale;
// Links rechts
Pos[0] := Pos[0]+Cos(Cam[1]/180*Pi)*Speed*tDelta/Scale;

Die if-Abfrage welche die Richtung beeinflusst habe ich mal weggelassen damit es nicht zu lang wird, das steht ja oben auch schon.
Was soll man sagen ? Funktioniert. Bei der Maus kam ich auf die Idee, mich auch erstmal nur auf die Y-Achse zu beschränken, damit man den besseren Überblick hat und habe einfach den Maus-Code von oben übernommen, aber habe dafür die Apply geändert:
Code:
glTranslatef(Pos[0], Pos[1], Pos[2]);
    glRotatef(Cam[1], 0.0, 1.0, 0.0);

Wenn ich mich einfach mit der Maus umschaue passt noch alles, aber sobald ich mich dann in eine andere Richtung bewege, als auf der Startachse auf der ich bin, passieren in der Minimap seltsame Verschiebungen, es wirkt als wäre der Rotationspunkt falsch gesetzt - die Sonne verändert ihre Position nicht, wenn ich von ihr wegschaue, aber ihre Z-Achse verschiebt sich. Aber da weiß ich nicht was daran falsch sein soll, denn in der Minimap ist der Betrachter schließlich in der Mitte und nicht die Sonne und dafür habe ich das Translate vor dem Rotate ausgeführt.
Im Anhang für den Fall der Fälle nochmal die komplette Datei, ist vielleicht schöner zu betrachten als die Fetzen hier im Beitrag.

Gruß,
Nils


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

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Minimap: Einfachste Lösung
BeitragVerfasst: Fr Aug 06, 2010 18:45 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ich bin mir nicht ganz sicher ob ich das richtig erfasst habe wie das bei dir dann aussehen soll. Und bei den ganzen Rotationen dreht sich mir auch der Kopf.
Das Sonnensystem ist doch fast 2-dimensional oder? Also müsste die Minimap immer senkrecht nach "unten" schauen. Also in Weltkoordinaten zB (0,-1,0). Wenn die Blickrichtung geändert wird, soll sich auch die Minimap drehen. Vielleicht so das nach Vorne immer oben auf der Minimap ist. So gibts das auch in vielen Spielen.
Kommt das so etwa hin?

Wenn ja, kann man vielleicht einfach die Matrix mit glGet holen und darauß die Blickrichtung und Position auslesen. Den Blickrichtungsvektor müsste man dann auf die Ebene projizieren. Der resultierende Vektor wäre dann der Up-Vektor für die Minimap-Ansicht. Der Look-Vektor wäre (0,-1,0) und als Position nimmt man eben die Position die man aus der Matrix hat und addiert bei der Y-Komponente einen Wert drauf. Die Minimap Camera würde ich dann mit gluLookAt erstellen.
Eventuell ist auch eine orthogonale Draufsicht gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Minimap: Einfachste Lösung
BeitragVerfasst: Do Aug 12, 2010 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Meine Idee war, dass in der Minimap der Betrachter in der Mitte festsitzt und sich dann die Karte verschiebt. Man kann sich einfach ein Kreuz vorstellen und in der Mitte ist man selbst. Dann bewegt man sich und man ist weiterhin in der Mitte, allerdings verschiebt sich die Karte und man ist woanders - aber in der Minimap immer noch in der Mitte wie gesagt. Das was Du gesagt hast war im Endeffekt das Gleiche oder ? Du meintest bloß, dass man den Betrachter oben in der Mitte festmacht auf der Minimap statt in der Mitte. Das mit dem glGet klingt nach einer Lösung, doch ist es nicht ungeschickt glGet in der Render-Prozedur zu verwenden ? Ich meinte mal gelesen zu haben, dass das gehörig auf die Performance ginge. Ich habe generell das Gefühl, man müsste das 3D-Koordinatensystem aufs zwei Dimensionen runterbügeln, die Höhe braucht man einfach in der Minimap nicht. Die Frage ist bloß wie man das am einfachsten hinkriegt, denn wenn ich die Kamera um 90° drehe und dann von oben draufblicke ist es nicht das Gleiche wie ein wirkliches 2D - sieht man dann auch wenn man die Kamera bewegt, die Ringe der Planeten rotieren gerne nochmal etwas. In der Richtung wäre vielleicht auch noch was möglich, aber ich habe noch nie eine Minimap gebraucht und daher frage ich ja auch, was es denn für Möglichkeiten dafür gibt. Es muss ja eine schnelle Variante geben, denn in einem Spiel mit guter Grafik und Minimap muss das ja auch möglichst schnell gehen.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Minimap: Einfachste Lösung
BeitragVerfasst: Do Aug 12, 2010 14:58 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Nils hat geschrieben:
Das was Du gesagt hast war im Endeffekt das Gleiche oder ?

Ja, das ist das was ich meinte. Ich war bloß unsicher weil ein Sonnensystem im Weltraum ja eigentlich nicht flach sein muss und für manche Weltraum-Spiele gibts dann so dreidimensionale Minimaps.

Nils hat geschrieben:
Das mit dem glGet klingt nach einer Lösung, doch ist es nicht ungeschickt glGet in der Render-Prozedur zu verwenden ? Ich meinte mal gelesen zu haben, dass das gehörig auf die Performance ginge.

Wüsste ich jetzt eigentlich nicht. Ich verwende das auch manchmal und so schlimm das es dann wie Software-Modus ruckelt ist es definitiv nicht. Wenn man das sparsam verwendet sollte das also nichts ausmachen.
Wenn's wirkllich ganz schlimm kommen sollte kann man auch die Matrixoperationen auf einer eigenen Matrix nachbilden. Dann brauch' man kein glGet und kann die Matrix dann auch mit glLoadMatrix weiterverwenden.

Nils hat geschrieben:
Ich habe generell das Gefühl, man müsste das 3D-Koordinatensystem aufs zwei Dimensionen runterbügeln, die Höhe braucht man einfach in der Minimap nicht. Die Frage ist bloß wie man das am einfachsten hinkriegt, denn wenn ich die Kamera um 90° drehe und dann von oben draufblicke ist es nicht das Gleiche wie ein wirkliches 2D - sieht man dann auch wenn man die Kamera bewegt, die Ringe der Planeten rotieren gerne nochmal etwas.

Mit glOrtho bekommt man eine zweidimensionale Projektionsmatrix. Also die Tiefe spielt immernoch eine Rolle bei der Einsortierung der Tiefe nach, aber die Objekte werden mit größerer Entferung zur Kamera nicht kleiner und man sieht sie immer nur aus einer Richtung. Außer für UIs kann man das nämlich auch für Ansichten einer vormals 3-dimensionalen Scene benutzen:
Code:
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity;
    glOrtho(-Width/2,Width/2,-Height/2,Height/2,NearClipping,FarClipping);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity;
    gluLookAt(pos[0],pos[1],pos[2],pos[0]+look[0],pos[1]+look[1],pos[2]+look[2],up[0],up[1],up[2]);

Width und Height sind die Abmessungen die die Minimap anzeigen soll. Also irgendwas großes bei dir. Die größe der Minimap selbst stellt man dann aber über den Viewport ein (ist hier nicht dabei). Wenn man das wie oben macht ist die Kamera in der Mitte des Bildes, wie du das wolltest. Die Position und Blickrichtung usw. werden bei mir mit gluLookAt eingestellt, kann man aber theoretisch auch anders machen.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]