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

Aktuelle Zeit: Do Mai 16, 2024 03:46

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 2D auf 3D zeichnen
BeitragVerfasst: So Dez 16, 2012 21:58 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Moin...
Ich würde gern sowas wie ein HUD auf meine Scene malen und scheitere daran wie ich den krams organisieren muss.
Ich würde das gern in dem Stil
Code:
  1. setPerspective();
  2. draw3dStuff();
  3.  
  4. setOrtho();
  5. draw2dStuff();
machen.

Ich weiß jedoch nicht womit die beiden set-Funktionen gefüllt werden müssen.
Könnt ihr mir helfen?

(Ich hab so einiges darüber im bei google gefunden, nichts davon hat jedoch bei mir funktioniert!)

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: So Dez 16, 2012 23:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Also nachdem du allen 3D-Kram gezeichnet hast, einfach
Code:
  1.  
  2.   gldisable(GL_DEPTH_TEST);
  3.   glLoadIdentity();
  4.   glMatrixMode(GL_PROJECTION);
  5.   glLoadIdentity();
  6.   glOrtho(0, breite, 0, höhe, 0.1, 2000);  // Am besten hier Breite  und Höhe vom Render-Fenster verwenden.
  7.   gltranslatef(0, 0, -1);   //damit das was du zeichnest auch gesehen werden kann
  8.   gldisable(GL_LIGHTING);  //HUD braucht ja keine Lichteffekte.


Jo, und ab jetzt einfach alles in 2D zeichnen, die dritte Koordinate lässt du immer 0
Beispiel für Punkt in der Mitte:

Code:
  1. glbegin(gl_points);
  2. glvertex3f(breite / 2, höhe / 2, 0);
  3. glend;


lg

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: Mo Dez 17, 2012 00:11 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Danke, nun wird zumindest der 2D-Krams richtig dargestellt.
Allerdings fehlt alles was ich voher in 3d gezeichnet habe.

Ich poste mal meinen Code, jedoch kann es durch die viele rumprobiererei sein, dass irgendwas blödes drin ist, oder fehlt. Hab den Überblick bissl verloren:
Code:
  1. public static void paint() {
  2.             GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
  3.  
  4.             setModelviewMatrix();
  5.  
  6.             GL.MatrixMode(MatrixMode.Modelview);
  7.             GL.LoadIdentity();
  8.             GL.LoadMatrix(ref modelview);
  9.  
  10.             setupObjectLighting();
  11.  
  12.             paintWorld(objects.getWorld().getLogicals());
  13.            
  14.             //break
  15.            
  16.             GL.Disable(EnableCap.DepthTest);
  17.             GL.LoadIdentity();
  18.             GL.MatrixMode(MatrixMode.Projection);
  19.             GL.LoadIdentity();
  20.             GL.Disable(EnableCap.Lighting);
  21.             GL.Ortho(0, clientWidth, clientHeight, 0, -1, 1);
  22.  
  23.             paintGui();
  24.         }

Das interessante ist: wenn ich alles unter dem break-Kommentar auskommentiere, stimmt der 3d-Krams wieder.
Kommentiere ich alles darüber aus (außer das clear) sehe ich alles was in 2d gezeichnet wird.
Jedes für sich funktioniert also. Nur zusammen haut das nicht hin :(

Irgendwas mache ich sicher mit dem Matrizen falsch...

Help me pls ;)

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: Mo Dez 17, 2012 08:23 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Uh, hm, da kann es viele Einstellungen geben die die Suppe versalzen, ich weiß ja nicht was
in deinen Funktionen steht.

Was mir aber aufgefallen wäre:
Umbedingt beim "3D-Kram" bevor du ihn zeichnest

GL.Enable(EnableCap.DepthTest);

hinschreiben, wenn das DISABLED ist wird einfach alles was du bisher gezeichnet hast komplett übermalt, ohne
das OpenGL richtige Darstelleung von ineinander liegenden Objekten richtig beachtet. Aus dem Grund ist das beim HUD
eingestellt, es soll ja alles bisherige gnadenlos überzeichnen. Und da nach dem Rendern vom HUD das noch disabled ist, übernimmt er das
auch fürs nächte Mal Rendern und macht dein 3D-Zeug auch disabled.

Mal sehen ob das hilft

lg

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: Mo Dez 17, 2012 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Licht im 3D-Teil wieder eingeschaltet? Weil für den HUD machst du es ja aus.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: Mo Dez 17, 2012 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
wenn du es im 3D Teil brauchst sicherlich!

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: Mo Dez 17, 2012 22:22 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Also, da ich mir sicher war, dass die Matrizen da eine Rolle spielen habe ich mit Push-bzw. PopMatrix rumgespielt und siehe da es funktioniert:

Code:
  1.  
  2. GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
  3.  
  4.             setModelviewMatrix();
  5.  
  6.             GL.MatrixMode(MatrixMode.Modelview);
  7.             GL.LoadIdentity();
  8.             GL.LoadMatrix(ref modelview);
  9.  
  10.             setupObjectLighting();            
  11.  
  12.             paintWorld(objects.getWorld().getLogicals());
  13.            
  14.             GL.Disable(EnableCap.DepthTest);
  15.             GL.LoadIdentity();
  16.             GL.MatrixMode(MatrixMode.Projection);
  17.             GL.PushMatrix();    //<----- hier
  18.             GL.LoadIdentity();
  19.             GL.Disable(EnableCap.Lighting);
  20.             GL.Ortho(0, clientWidth, clientHeight, 0, -1, 1);
  21.  
  22.             paintGui();
  23.  
  24.             GL.PopMatrix();     //<----- und hier
  25.  

Jedoch bin ich mir nicht sicher warum das ganze so funktioniert. Kann mir das jemand mal erklären?
Was genau passiert da?

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D auf 3D zeichnen
BeitragVerfasst: Di Dez 18, 2012 06:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Du überschreibst deine Projektionsmatrix mit der von glOrtho generierten Matrix. Und wenn du diese nicht wieder explizit (was in deinem Code nicht zu sehen ist) für deine 3D-Ansicht setzt (also z.B. mit gluPerspective), dann ist klar warum du diese sichern musst. Wenn du das nicht machst, dann renderst du nach dem ersten glOrtho auch deine 3D-Szene mit der der orthagonalen Projektsionmatrix.

I.d.R. setzt man also auch vor der 3D-Ansicht eine entsprechende Projektionsmatrix, und dann später nochmal vor der 2D-Ansicht. Dann kann man sich das push/pop sparen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.041s | 17 Queries | GZIP : On ]