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

Aktuelle Zeit: Fr Jul 18, 2025 08:05

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: So Apr 26, 2009 16:06 
Offline
DGL Member

Registriert: So Apr 26, 2009 11:56
Beiträge: 6
Wohnort: Chemnitz
Hallo

Ich denke ich hab beim einarbeiten in die funktionen einen fehler gemacht.
Ich finde aber nicht heraus wo der ist.

Ich hab eine Funktion (draw_objekt). Dort werden werden Linien und eine Sphere im Raum verteilt.
Code:
  1.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2.       if ( pause == 0) draw_object();
  3.     glFlush();


Code:
  1. (draw_object)       for(int i = 0; i < 500; i++)
  2.     {
  3.        glPushMatrix();
  4.        glColor3f(0.5f, 0.5f, 0.8f);
  5.        glBegin(GL_LINES);
  6.        glVertex3f(obj[i][0] - 7*4,obj[i][1] - 40,obj[i][2]);
  7.        glVertex3f(obj[i][3] - 7*4,obj[i][4] - 40,obj[i][5]);
  8.        glEnd();
  9.        glPopMatrix();
  10.     } 


Dann wird alles mit der Mausbewegung rotiert.

Code:
  1.       if ( maus_butt == 1 ) {
  2.           if ( maus_x != X ) {  glRotatef(maus_x-X, 0.0, 1.0, 0.0); }
  3.           if ( maus_y != Y ) {  glRotatef(maus_y-Y, 0.0, 0.0, 1.0); }
  4.        }



Hier zwei Bilder: Beide Bilder zeigen die Scene von oben. (eigentlich sollten daher beide bilder gleich aussehen)
Der rote Rahmen ist immer unten - der blaue oben.

Also wenn ich das ganze zwei drei mal gedreht hab dann passiert es zufällig das alles was ich habe an der y achse gespiegelt wird - und die im Raum liegenden Objekte werden an der [y,x]-Ebene im z-buffer andersherum Überlagert.

http://www.htwm.de/~vannacke/cpp/Bild1.png
http://www.htwm.de/~vannacke/cpp/Bild2.png

*verzweifel*

Grüße

Edit:

Wenn ich mir das recht anschaue und überlege ist der depth_buff immer invertiert zu dem was zu sehen ist.
Das was zu sehen ist wird während des drehens dann sporadisch an x,y Ebene gespiegelt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 26, 2009 18:46 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Problem kommt mir irgendwie bekannt vor. Bei einer Anwendung die ich vor einigen Jahren programmiert hatte, kam dieser Fehler bei der Kamera auch vor.
Das hat wohl irgendwelche mathematische Gründe. Da es nur bei recht wilden Kamerafahrten auftrat konnte ich es ignorieren.

Singularitäten im Fluxspeicher der Hydrogonkammern, wenn du mich fragst. 8)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 26, 2009 19:15 
Offline
DGL Member

Registriert: So Apr 26, 2009 11:56
Beiträge: 6
Wohnort: Chemnitz
^^
Arigato für die Antwort.

Das Problem stört bei mir zu sehr. Das muss ich umschiffen.
Und ich denke immernoch ein wenig das ich etwas falsch gemacht habe.

Also ich hab in meinem Model bzw meiner Scene verschiedene Linien im Raum.
Ich glaube das passiert am häufigsten (oder sogar nur) wenn ich entlang der Z-Achse von + oder - z auf die Objekte schau.
Also genau in der Lage wie die Bilder gemacht sind. Von der Seite passiert das glaube nicht.

Weiterhin glaube ich das es je nachdem aus welcher Richtung ich schaue - also aus +Z oder -Z - sowohl das Depth-Buffering als auch die Position im Raum umschaltet. (das glaub ich nicht - das ist SO)

Ich find aber einfach nicht den Grund.

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 26, 2009 21:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ich tippe mal auf einen Gimbal Lock. Dazu haben viel klügere Leute als ich bereits eine Menge geschrieben, das Web ist voll davon, google mal ein bisschen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 27, 2009 05:51 
Offline
DGL Member

Registriert: Mo Mär 16, 2009 10:22
Beiträge: 26
antimon hat geschrieben:
^^
Also ich hab in meinem Model bzw meiner Scene verschiedene Linien im Raum.
Ich glaube das passiert am häufigsten (oder sogar nur) wenn ich entlang der Z-Achse von + oder - z auf die Objekte schau.
Also genau in der Lage wie die Bilder gemacht sind. Von der Seite passiert das glaube nicht.
Grüße


Ich könnte mir dabei auch ein simples numerisches Problem bei der Matrix vorstellen, wegen der endlichen Genauigkeit der Zahlen. Wenn man von +-z auf die Szene schaut, können eventuell durch vorherige Drehungen noch -sehr kleine- Anteile in anderen Richtungen vorhanden sein, mit denen dann irgendwie fehlerhaft gerechnet wird/ ein Vorzeichen flippt.

Gimbal Lock tritt prinzipiell erst ab 3 Drehungen auf, also könnte es maximal innerhalb jeweils 1.5 Schleifendurchläufe auftreten, wenn die Matrix nur an der Stelle modifiziert wird. Ich kann mir dabei aber nicht vorstellen, wie es durch diesen Effekt immer genau gespiegelt wird.


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

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Also, wenn man dem englischen WIKI-Artikel http://en.wikipedia.org/wiki/Gimbal_lock folgt, kann ein Gimbal Lock bereits nach einer einzigen Euler-Rotation auftreten, denn schon bereits nach einer einzigen Rotation von 90 Grad um eine der Koordinatenachsen sind zwei Achsen praktisch deckungsgleich. Das sagt zum Beispiel auch http://books.google.at/books?id=0VOEjFmPB-0C&pg=PA358&lpg=PA358&dq=%22Gimbal+Lock%22&source=bl&ots=hYvne73cgT&sig=xiSdJhVCUh0DqgWau7KSI3VJaPs&hl=de&ei=lJT1SbvvH4Gw-Qa6qe3DDw&sa=X&oi=book_result&ct=result&resnum=4:

Zitat:
This effect is more common than one might think - a single 90 degree turn to the right (or left) can potentially put an object into a gimbal lock.


Ich kanns aber nicht mit absoluter Sicherheit behaupten, weil ich es selber noch nicht ausprobiert habe. 8)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 27, 2009 18:12 
Offline
DGL Member

Registriert: Mo Mär 16, 2009 10:22
Beiträge: 26
Traude hat geschrieben:
Also, wenn man dem englischen WIKI-Artikel http://en.wikipedia.org/wiki/Gimbal_lock folgt, kann ein Gimbal Lock bereits nach einer einzigen Euler-Rotation auftreten, denn schon bereits nach einer einzigen Rotation von 90 Grad um eine der Koordinatenachsen sind zwei Achsen praktisch deckungsgleich.
Ich kanns aber nicht mit absoluter Sicherheit behaupten, weil ich es selber noch nicht ausprobiert habe. 8)


Naja aber im Code sieht man ja, um welche Achsen er dreht ( y und z -Achse).
Um ungewollt an der Y-Achse zu spiegeln, müsste er also erst ausversehen die z-Achse auf die y-Achse diese drehen, wozu man aber eine Rotation um die x-Achse braucht, und dann nochmal die z-Achse um 180°.
Oder irgendwo im Code ist noch was versteckt, was z.b. die Y-Achse einfach so zu weit dreht.
Ansonsten ist am Gimbal-Lock ja interessant, Drehung um 3 "irgendwelche" Achsen schon zu einem führen kann, auch um Achsen, bei denene das nicht wirklich offensichtlich ist.

Aber: Ob der Lock in OpenGL überhaupt eintreten kann, weiß ich jetzt auch nicht mehr sicher. Ich sehe dass so, dass die tatsächlichen Achsen immer senkrecht zueinander bleiben, egal wie man dreht und wendet. Also irgendwohin dreht man immer, und es werden keine Achsen "verschluckt". Das Problem ist ja in der Realität aufgetreten, wo z.B. bei Kreiseln in Flugzeugen/Raumschiffen mehrere der an sich beweglichen Achsen übereinander gefahren sind, und ab dann (ohne die Lösung: Hilfsmotor) zusammen bleiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 28, 2009 08:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Vermutlich hast Du recht und es ist gar kein Gimbal Lock.

Man kan in OpenGL ganz leicht einen Gimbal Lock erzeugen. Nimm irgendein Objekt (ein Würfel genügt) und probier es einfach mit dem normalen glRotate (bzw. mit mehreren glRotates) aus. Man sieht den Effekt ganz deutlich, denn das Objekt fängt an zu "eiern", so lange, bis es den prekären Bereich wieder verlassen hat. Ich wette Ihr habt so etwas alle schon einmal am Bildschirm gesehen, ohne zu wissen, dass es sich um einen Gimbal Lock handelt.

@antimon: Heute nachmittag hätte ich Zeit, um den Code auszuprobieren. Vielleicht krieg ich was raus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 28, 2009 09:59 
Offline
DGL Member

Registriert: Mo Mär 16, 2009 10:22
Beiträge: 26
Hm. Wahrscheinlich kommt das Eiern dann auch über numerisch ungünstige Zahlen in den Matrizen zustande, was dann den Gimbal Lock erzeugt. In Drehmatrixen stehn ja auch noch lauter lustige sin-cos-Kombinationen der Winkel drin, was ja gerade im Bereich 0 und 90°(*n) zu nur geringen Abweichungen von 0 oder 1 führt. Gepaart mir einer Multiplikation einer vielleicht vergleichsweise großen Drehachse... aber auf Anhieb sehe ich in dem Code direkt erstmal solche Probleme nicht.
Man ist sich meistes ja auch garnicht bewusst, das Computer garnicht sooooo exakt rechnen, wie man es gerne hätte, insbesondere, wenn man z.b. bewegungen auf recht kleine Intervalle zerstückelt.
Ich hatte letzen bei einer Messwertauslese von sehr kleinen Strömen auch schon "Probleme", mit diesen zwecks Skalierung/Darstellung in einem Diagramm zu hantieren. Da ist mir nichts übrig geblieben, als die Werte einfach um ein paar Zehnerpotenzen größer zu machen um was damit anfangen zu können (leider kann man vom verwendeten Messgerät aber auch nur doubles empfangen, und keine echten Exponential-Zahlen ala 5*10^(-6) oder so).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 28, 2009 18:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallihallo,
Ich habe Deinen Code - oder sagen wir mal: eine Interpretation Deines Codes - ausprobiert.

Versuchsanordnung:

1) Meine 3D-Welt ist nur ganz einfach, ein texturiertes Quad bei Z=0

Code:
  1. Procedure RenderShape;
  2. Begin
  3.    glBegin(GL_QUADS);
  4.       glTexCoord2f(0,1); glVertex3f(-1,-1,0);
  5.       glTexCoord2f(1,1); glVertex3f(+1,-1,0);
  6.       glTexCoord2f(1,0); glVertex3f(+1,+1,0);
  7.       glTexCoord2f(0,0); glVertex3f(-1,+1,0);
  8.    glEnd;
  9. End;


2) Renderprozedur:

Code:
  1.    
  2.    ZNear:=1;
  3.    ZFar:=30;
  4.    
  5.    glMatrixMode(GL_PROJECTION);
  6.    glLoadIdentity;
  7.    glGetIntegerv(GL_VIEWPORT, @Viewport);
  8.    gluPerspective(45.0, ViewPort[2]/ViewPort[3], ZNear,ZFar);
  9.  
  10.    glMatrixMode(GL_MODELVIEW);
  11.    glLoadIdentity;
  12.  
  13.    glTranslatef(0,0,-5);
  14.    glRotatef(AngleY, 0.0, 1.0, 0.0);
  15.    glRotatef(AngleZ, 0.0, 0.0, 1.0);
  16.  
  17.    glColor3f(1.0, 1.0, 1.0);
  18.    RenderShape; // siehe oben


3) Eine "OnMouseMove" - Prozedur:

Code:
  1. Procedure OnMouseMove(APointer,ASender: TGUIItem; X,Y: TInt32);
  2. Begin
  3.    If X > LastX
  4.       Then Inc(AngleY)
  5.       Else Dec(AngleY);
  6.    LastX:= X;
  7.  
  8.    While AngleY < 0 Do Inc(AngleY,360);    // *)
  9.    While AngleY > 360 Do Dec(AngleY,360);  // *)
  10.  
  11.    If Y > LastY
  12.       Then Inc(AngleZ)
  13.       Else Dec(AngleZ);
  14.    LastY:= Y;
  15.  
  16.    While AngleZ < 0 Do Inc(AngleZ,360);    // *)
  17.    While AngleZ > 360 Do Dec(AngleZ,360);  // *)
  18. End;


ERGEBNIS:
Das Quad benimmt sich ganz manierlich. Die mit "*)" gekennzeichneten Zeilen
sorgen dafür, dass der Winkel immer positiv bleibt. Vielleicht liegt es bei Dir an dem Umspringen der positiven/negativen Winkel?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 06, 2009 22:04 
Offline
DGL Member

Registriert: So Apr 26, 2009 11:56
Beiträge: 6
Wohnort: Chemnitz
So hallo - Bin wieder da =)

War unterwegs.
Ich hab auch nochmal bissl rumgebastelt. Und werd morgen nochmal schaun.

Ja ich hab negative winkel. Aber das umkippen passiert einfach irgendwo - und nicht an der grenze zum negativen.

Gimbal look ist nen guter Gedanke aber müste dann nicht eine Achse gesperrt sein und das ganze Eiern ?
Ich hab nach wie vor dann aber alle 3 Achsen zur Bewegung zur Verfügung.
Nur der Inhalt springt um.

Ich probier mal was.

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 07, 2009 08:54 
Offline
DGL Member

Registriert: So Apr 26, 2009 11:56
Beiträge: 6
Wohnort: Chemnitz
Es passiert auch innerhalb nur positiver und es passiert innerhalb der ersten Drehungen.

Und es reicht auch die Drehung um ausschließlich eine Achse.
Aber um z - Achse gehts nicht - schließlich klappt es nur um wenn ich von der anderen Seite "schaue".

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 07, 2009 09:44 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mach doch mal folgendes:

Logge alle x,y und z rotationen in einem Graph. Und wenn das Schnappen passiert guckst du mal welche Werte da so anliegen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 07, 2009 18:58 
Offline
DGL Member

Registriert: So Apr 26, 2009 11:56
Beiträge: 6
Wohnort: Chemnitz
@ traude

Warum machst du bei jedem render durchgang:
Code:
  1. gluPerspective(45.0, ViewPort[2]/ViewPort[3], ZNear,ZFar);


Damit wird ja alles wieder resettet o.O
Im übrigen hab ich Ortho unn nicht Perspektive.


Ok ich werd mal alle anzeigen. Hab bisher nur zwei angezeigt.
Dies benötigt ein paar zeilen mehr code ^^

grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 08, 2009 09:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Damit wird ja alles wieder resettet o.O

Nein, wird es nicht. Es würde genügen, die Perspektivmatrix bloß ein einzigesmal zu setzen, ich habe das bloß der Deutlichkeit wegen dazugeschrieben. Hier wird nur die aktuelle Perspektivmatrix mit einer neuen Perspektivmatrix überschrieben, die genau die gleichen Werte hat wie die vorige Matrix. Dadurch ändert sich gar nichts.

Welchen Perspektivmodus Du nimmst - Ortho oder Zentralsperspektive - ändert für das Rotations-Ergebnis auch nichts.

Das einzige, was sich hier ändert, ist die Modelviewmatrix, die durch den Winkel verändert wird, den Du ins glRotate hineinschreibst. Diesen Winkel musst Du kontrollieren, um zu sehen, wann und warum das Umschnappen auftritt. Mittels Debugger oder Logfile oder was auch immer.

Du musst ja nicht Dein ganzes Programm hier reinstellen. es genügt doch, wenn Du dokumentierst was genau X und Y dieser Funktion sind bzw. wie sie berechnet werden:

Code:
  1.       if ( maus_butt == 1 ) {
  2.           if ( maus_x != X ) {  glRotatef(maus_x-X, 0.0, 1.0, 0.0); }
  3.           if ( maus_y != Y ) {  glRotatef(maus_y-Y, 0.0, 0.0, 1.0); }
  4.        }
  5.  


Dann wärs möglich, dass ich Dein Problem nachvollziehen kann.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]