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

Aktuelle Zeit: Di Mai 28, 2024 19:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 04:52 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Ich hab die letzten Tage damit verbracht ein brauchbares Framework für eine kleine GUI zu schreiben,
nun war ich soweit das ich sie mal richtig testen wollte und habe zu diesem Zweck mal ein rotierenden Würfel rendern lassen bevor ich die render routine meiner gui aufrufe, nun rotiert mir nur leider nicht nur der würfel, leider fliegt mir auch mein fenster in der gegend rum...

Wie schalte ich zwischen meiner 3d und 2d Ansicht um und wieder zurück damit sich die jeweiligen perpektiven richtig verhalten?

Bisher habe ich glOrtho so aufgerufen:
Code:
  1.  
  2.         glMatrixMode GL_PROJECTION
  3.         glPushMatrix()
  4.         glLoadIdentity()
  5.    
  6.         glOrtho(0,WWidth,WHeight,0,-128,128)    
  7.        
  8.         glMatrixMode GL_MODELVIEW  
  9.         glPushMatrix()
  10.         glLoadIdentity()
  11.  


und zurück dann nochmal so:
Code:
  1.  
  2.         glMatrixMode GL_PROJECTION                          
  3.         glPopMatrix()
  4.    
  5.         glMatrixMode GL_MODELVIEW
  6.         glPopMatrix()
  7.  


Hab das ganze push und pop matrix zeug auch schon auskommentiert... aber das ergebnis blieb das gleiche...

Edit: peinlich, aber der Fehler lag an einem vergessenen 'glEnd()' -.-

Aber dennoch eine Frage dazu, nun dreht dich mein Würfel schön in der mitte vor sich hin und meine fenster werden richtig angezeigt und kann sie verschieben... leider ist nun der würfel in der mitte im weg...

Wie setze ich den tiefentest am sinnvollsten damit die fenster die 3d szene überlagern?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 05:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
In meiner GUI kann man auch 3D-Elemente in Fenster darstellen, und die Sache mit dem Tiefenpuffer löse ich so : Wenn im Fenster ein 3D-Element gerendert wurde rendere ich darüber ein Quad (mit Tiefentest = immer) mit dem Z-Wert des Fensters, und fertig ist. So kann man im Fenster allen möglichen 3D-Kram rendern und unterschiedliche Fenster überlagern sich trotzdem korrekt. Alternativ (für komplexere 3D-Szenen) nutze ich aber sowieso FBOs, damit hat man die Problematik dann natürlich nicht mehr, da man diese dann ja direkt auf normale Quads mit Tiefenwert des Fensters zeichnen kann.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 06:38 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Nach etwas Googlen und Probieren bin ich dann auch darauf gekommen, hab dann meine 'SetToOrtho' Funktion um ein 'glDepthFunc(GL_ALWAYS)' erweitert und nun wird mir die hintergrundszene richtig überlagert...

Die Idee 3D Objekte/Szenen auch im Fenster zu rendern klingt toll, leider ist mein Framework dafür nicht ausgelegt, vor dem rendern aller fenster wechselt mein Framework in den Orthogonalen modus und wechselt anschliessend wieder in die 3D Perspektive... mit FBO's allerdings könnte da was zu machen sein, da ich dank Callbacks mein Layout und meine Gadgets frei erstellen kann bleibt da immernoch reichlich spielraum....

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 10:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Alternativ kannst du den Tiefenpuffer einfach löschen bevor du anfängst die GUI zu rendern oder den Tiefentest ausschalten. Letzteres könnte dir eventuell sogar einen vernachlässigbaren Schub an Geschwindigkeit bringen ;)

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 11:40 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Den Tiefenpuffer löschen wäre vielleicht noch eine Alternative gewesen, aber abschalten ginge leider gar nicht da mein Mousevent einen Tiefentest bei Mausklicks durchführt um zu prüfen ob ich ein Fenster 'treffe'

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 11:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das funktioniert? Ich könnte mir vorstellen dass das mit den Tiefeninformationen der unterschiedlichen Projektionen sowie der Floatgenauigkeit probleme geben könnte.

Auf lange Sicht empfehle ich, das Verfahren auf eine einfache Punkt-In-Rechteck Prüfung umzubauen.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Mi Jun 13, 2012 18:03 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Das Funktioniert eigentlich recht gut, ich ermittel damit im prinzip nur den ZLevel und prüfe darauf hin ob sich ein fenster dort befindet (meine fenster werden von hinten nach vorne gerendert/sortiert)

Code:
  1.  
  2.             'Wurde 'irgendeine' Maustaste gedrückt den ZLevel ermitteln
  3.             If anyButton Then
  4.  
  5.                 glGetIntegerv(GL_VIEWPORT, Viewport )' Aktuellen Viewport speichern
  6.                    
  7.                 ' Auslesen des Tiefenpuffers an der Position (X/Y)
  8.                 glReadPixels(.PositionX, Viewport[3] - .PositionY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, @tmpZ )
  9.  
  10.                 .ZLevel = CInt(128-(tmpZ*256)) 'Dif (ZNear(-128)/ZFar(128)) = 256 (Center = /2)
  11.             End If
  12.  


Wenn ich ins leere klicke erhalte ich -128, das erste fenster beginnt ab ZLevel -127, davon ausgehend das ich eigentlich keine 256 fenster brauchen werde :D

die punkt/maus im rechteck(e) habe ich aber zur sicherheit auch noch zusätzlich zur kontrolle eingebaut...

Das Framework ist mit sicherheit noch ausbaufähig und bestimmt nicht das beste, aber dafür das es mein erstes GUI-Werk ist bin ich ganz zufrieden da ich schon darauf geachtet habe die GUI mit Callbacks recht flexibel erweiterbar und anpassbar zu machen...

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Do Jun 14, 2012 14:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, meine Frage ist eher, was passiert wenn du auf ein 3D-Objekt klickst?

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2D und 3D Konflikt
BeitragVerfasst: Sa Jun 16, 2012 19:58 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Das mit dem prüfen per ZLevel war meine erste eingebung und entsprechend natürlich umgesetzt, hab aber nun mal drüber nachgedacht und ein bisschen probiert... da ich nachdem ich ein zlevel gefunden habe eh noch einmal mit einer 'in-recheckt' prüfung sicher gehe... kann ich mir da ja alle fenser sortiert sind den zlevel quatsch auch ganz sparen, hab nun tiefentest aus, den zlevel kram weg, die gesamte prüfung konnte ich somit verkürzen und hab ein (kaum merkbaren) geschwindigkeitsvorteil rausholen können :) also vielen dank für den mehrfach subtilen hinweis :D

Allerdings, würde man NUR die GUI (ohne weiteren 3D oder hintergrundkram) selbst und keine Childfenster nutzen wäre die ZLevel Methode glaub durchaus brauchbar ^^

_________________
Bild


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.008s | 14 Queries | GZIP : On ]