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

Aktuelle Zeit: Fr Jul 18, 2025 08:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Billboard wird nicht angezeigt
BeitragVerfasst: Mo Sep 07, 2009 09:57 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Hallo ;)

Ich bin gerade dabei Billboards in mein aktuelles Projekt zu implementieren. Hierzu verwende ich diesen Code:
Code:
  1.         // Save Light status
  2.         gl.glPushAttrib(GL.GL_LIGHTING);
  3.         // Disable Light
  4.         gl.glDisable(GL.GL_LIGHTING);  
  5.         // Save current modelview matrix
  6.         gl.glPushMatrix();
  7.         // Set the billboard's position
  8.         gl.glTranslatef(position.x, position.y, position.z);
  9.         // Get the current modelview matrix
  10.         DoubleBuffer modelview = DoubleBuffer.allocate(16);
  11.         gl.glGetDoublev(GL.GL_MODELVIEW_MATRIX, modelview);
  12.         // Identity matrix
  13.         double[] identity = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 };
  14.         // Overwrite rotation values
  15.         modelview.put(identity);
  16.         gl.glLoadMatrixd(modelview);
  17.         // Draw billboard
  18.         gl.glBegin(GL.GL_QUADS);
  19.         gl.glVertex3f(-1,  1, 0);
  20.         gl.glVertex3f(-1, -1, 0);
  21.         gl.glVertex3f( 1, -1, 0);
  22.         gl.glVertex3f( 1,  1, 0);
  23.         gl.glEnd();
  24.         // restore
  25.         gl.glPopMatrix();
  26.         gl.glPopAttrib(); // GL_LIGHTING

Die Manipulation der Matrix scheint richtig zu sein. Interessanterweise wird das Quad gezeichnet, wenn ich glLoadMatrix weglasse. Selbst wenn die Matrix vor und nach der Manipulation die gleiche ist, verhindert der Aufruf von glLoadMatrix auf irgendeine Art, dass ich etwas sehe. Wie kann das sein?

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 07, 2009 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Deine Einheitsmatrix ist keine:
double[] identity = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0 };
Das sind nur 12 Werte, nicht 16. Vermutlich wird da die letzte Spalte mit Datenmüll gefüllt.

Edit: Wozu ist dein glTranslatef gut? Das wird später von glLoadMatrix überschrieben? Was spricht eigentlich gegen glLoadIdentity?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 07, 2009 10:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich glaube du machst ein Fehler bei der Column-Row Order der Matrix und überschreibst die Position durch 0 statt w=0 zu setzen.
Noch dazu, wenn du ein glTranslate machst, um die Position zu setzen, dann solltest du vorher gl.glLoadIdentity(); aufrufen sonnst wird von der aktuellen position noch die Position vom Billboard hinzu gerechnet.

_________________
"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: Mo Sep 07, 2009 12:14 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Der Code ist an den Wiki Code angelehnt. Es ist schon richtig, dass es nur zwölf sind, da ich den Translations-Teil der Matrix unangetastet lasse.
Soweit ich weiß werden Matrizen in OpenGL wie folgt durchnummeriert:

1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16

also müssen die Elemente 1, 6 und 11 zu 1 werden, 13, 14, 15 und 16 bleiben unangetastet (Translation) und der Rest wird zu 0. Ich habe mir die Matrizen auch schon ausgeben lassen und die Ergebnisse scheinen zu stimmen. Wenn ich beispielweise mit der Identität anfange, kommt auch die Identität raus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 07, 2009 12:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Es ist schon richtig, dass es nur zwölf sind, da ich den Translations-Teil der Matrix unangetastet lasse.

Sicher? Woher weiß den modelview.put wie groß das Array ist? (Wenn es sich hier um Java handelt, ist das natürlich kein Problem...)

Zitat:
Wenn ich beispielweise mit der Identität anfange, kommt auch die Identität raus.

Die Identität ist in diesem Fall wirklich kein gute TestCase....idealerweise weißt du jedem Feld der Matrix einen eindeutigen Wert zu, z.B. einfach 1,2,3,4...dann weißt du genau was womit überschrieben wurde.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 07, 2009 14:57 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Die Identität war nur ein Beispiel, es klappt aber auch bei abstrusen Zahlenwerten. Und ja, es handelt sich um java ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 07, 2009 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Durch deine glLoadMatrix-Aktion hast du die ModelViewMatrix überschrieben. Ein vorheriges gluLookAt oder ähnliches wird damit unwirksam. Entsprechend befindet sich die Kamera in (0,0,0) und blickst in Richtung der positiven (oder negativen?) Z-Achse. Ist das so gewünscht?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 07, 2009 21:19 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Aber ich lese die Matrix doch vorher aus und überschreibe die Translation nicht. Nur die Rotation wird zurückgesetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Sep 08, 2009 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
@Seth: Schau dir mal jmonkeyengine.com an. Benutze ich seit ein paar Monaten und bin sehr zufrieden damit. Ich war es irgendwann leid immer wieder die gleiche Pionierarbeit zu leisten und das was andere schon zu genüge programmiert haben zum tausendsten mal durchzuackern.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 09, 2009 20:56 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Naja dann wäre das was ich bisher gemacht habe auch umsonst gewesen. Wenn ichs selbst probiere, kann ich dabei nur lernen. Und es hapert ja auch nur an den Billboards im moment. Einarbeiten müsste ich mich in die Engine ebenfalls.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 10, 2009 06:18 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Ich finde es doof, dass den Leuten hier immer öfters nahe gelegt wird sich doch bitte Fremdbibliotheken anzusehen anstatt sich vernünftig mit dem Problem auseinander zusetzen. Immerhin geht es hierbei nicht einfach nur darum als Ziel eine laufende Anwendung herraus zu bekommen, wie es in professionellen Software-Schmieden häufig der Fall ist, sondern die Materie an sich zu verstehen. Wenn wir so Probleme lösen möchten, dann kann man das Forum auch dicht machen und durch eine Linkliste auf entsprechende Seiten ersetzen, denn Hilfeforen zu den jeweiligen Fremdbibliotheken findet man dort meistens auch. Außerdem war die Frage auch nicht "Billboarding geht nicht, suche Fremdlib!", sondern eher "Billboarding geht nicht, was hab ich falsch gemacht?"

Vorteil an der Bibliothek ist allerdings, dass sie OpenSource ist und man dort evtl. mit ein bischen suchen die Stelle findet in der das Billboarding implementiert ist. Da könnte man dann schauen wie es gemacht wurde und es so zusagen abkupfern um an einem Funktionierenden Beispiel zu lernen.
Ich habe mir mal den Code angesehen und müstest du nicht eigentlich für jedes Quad eine eigene ModelMatrix errechnen, die auf die vom Betrachter liegende X-Achse zeigt, also die negierte Z-Achse der ViewMatrix als Z-Achse der ModelMatrix hat und X- und Y-Achse der ViewMtrix übernimmt?

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 14, 2009 23:04 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich habe lange überlegt, ob ich es posten soll.

Habe meine Antwort!

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 3 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.009s | 16 Queries | GZIP : On ]