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

Aktuelle Zeit: Sa Jul 12, 2025 23:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit Translation
BeitragVerfasst: Do Jul 05, 2007 20:48 
Offline
DGL Member

Registriert: Do Jul 05, 2007 19:57
Beiträge: 3
Hallo zusammen,
ich - blutiger Anfänger - hab ein Problem mit der Translation, was mich jetzt schon fast wahnsinnig macht ^^ und darum würde ich mich auch riesig über Hilfe freuen.
Problem ist folgendes: ich hab ein ganz einfaches Dreieck gezeichnet und will es in den Raum rein verschieben, also die z-Koordinate bei der Translation vergrößern. Nur irgendwie verändert sich die Ausgabe bei der Änderung der z-Koordinate absolut nicht *heul*. Ist wahrscheinlich nur ein total dummer Fehler.
Hier mein Quellcode:

Code:
  1. #include <GL/glut.h>
  2. #include <stdlib.h>
  3.  
  4. void display(void) {
  5.      
  6.      glClearColor(0,0,0,0);
  7.  
  8.      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  9.  
  10.      glLoadIdentity();
  11.  
  12.      glTranslatef( 0.0,  0.0, 1.0);
  13.  
  14.  
  15.   glBegin(GL_POLYGON);
  16.  
  17.       glColor3f(1,0,0);                // alle weiteren Vertice werden rot gezeichnet
  18.       glVertex3f(0.0, 0.0, 0.0);
  19.       glColor3f(0,1,0);                // alle weiteren Verticen werden grün gezeichnet
  20.       glVertex3f( 0.0, 1.0, 0.0);
  21.       glColor3f(0,0,1);                // alle weiteren Verticen werden blau gezeichnet
  22.       glVertex3f( 1.0, 1.0, 0.0);
  23.  
  24.   glEnd();
  25.  
  26.   glutSwapBuffers();
  27.      
  28. }   
  29.      
  30. int main(int argc, char** argv) {
  31.    
  32.     glutInit(&argc,argv);
  33.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  34.     glutInitWindowSize(800, 600);
  35.     glutCreateWindow("Dreieck");
  36.     glutDisplayFunc(display);
  37.     glutMainLoop();
  38. }


// edit Lossy: CodeTags hinzugefügt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jul 05, 2007 20:52 
Offline
DGL Member

Registriert: So Jan 23, 2005 13:21
Beiträge: 46
Wohnort: Vietnam
Code:
  1.  glTranslatef( 0.0, 0.0, -2.0);


Bin mir zwar nicht sicher, aber ich glaub, dass is der fehler.

Das koordinatensystem is nähmlich so: Bild
Du bewegst in meinem Fall jetzt das Objekt um 2Einheiten nach hinten.

_________________
"As the enemy went to heaven,
we stayed in hell!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 06, 2007 08:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Entweder liegt es daran, was ISAS geschrieben hat, dass du nach vorne verschiebst, anstatt nach hinten,
oder du hast als Projectionsmatrix den Ortho-Modus gewählt. Der ermöglicht, wie der Name schon sagt, orthogonale Projektion, was heißt, dass die Größe immer gleich ist unabhängig vom Z-Wert.

Andere Frage: siehst du überhaupt dein Dreieck? Kann es mir eigentlich nicht vorstellen, es sei denn du hast eine eigenartige Projektionsmatrix. Ich kenn mich aber auch nicht so gut mit glut aus, da (fast) nie benutzt.

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 06, 2007 08:35 
Offline
DGL Member

Registriert: Do Jul 05, 2007 19:57
Beiträge: 3
Also an dem Problem, was ISAS beschrieben hat, liegt es nicht, denn es ist völlig Schnuppe wie ich die z-Koordinate verändere, mein Dreieck sieht immer gleich aus und verschiebt sich nur in der x-y-Ebene (wenn mann die x- y- Koordinaten der Translation ändert).
Doofe Frage: Brauche ich denn überhaupt die Projektionsmatrix? Mein Dreieck kann ich so wie der Quellcode ist, sehen und habe eben nur das Problem mit der z-Koordinate...

Vielleicht noch irgendwelche anderen Ideen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 06, 2007 08:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Wie sieht denn deine Initialisierung von OpenGL aus? Eine Projectionsmatrix hast du eigentlich immer.
Was hast du denn für Near- und Far-Clipping Werte?
Hast du das Programm mal ohne glut ausprobiert? Es gibt hier nämlich diverse Meinungen über glut (größtenteils schlechte...) :wink:

//EDIT:
Habe mal nach glut-Initialisierung gegoogelt:
Schreibe mal noch folgendes bei der Initialisierung dazu:
Code:
  1. glutReshapeFunc(resize);


Dann eine neue Function (setzt u.a. die Projections-Matrix):
Code:
  1. void resize(int w, int h) {
  2.   glViewPort(0, 0, w, h);
  3.   glMatrixMode(GL_PROJECTION);
  4.   glLoadIdentity;
  5.   gluPerspective(45, w/h, 1, 100); // die letzten beiden Werte sind die Clipping Werte
  6.   glMatrixMode(GL_MODELVIEW);
  7. }


Jetzt musst du allerdings ISAS Anmerkung beachten!

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 06, 2007 09:55 
Offline
DGL Member

Registriert: Do Jul 05, 2007 19:57
Beiträge: 3
Super, vielen Dank! Jetzt funktioniert es =) und ich kann das Dreieck weiter in den Raum schieben. Aber warum kann ich gar nix mehr sehen wenn die z-Koordinate der Translation >= 0 ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 06, 2007 10:01 
Offline
DGL Member

Registriert: So Jan 23, 2005 13:21
Beiträge: 46
Wohnort: Vietnam
Weil das Objekt dann sozusagen hinter dir ist...

Muss jetzt aufpassn, dass ich nix falsches sage, aber (falls doch, lösch ich das wieder ;) ):

Code:
  1. gluPerspective(45, w/h, 1, 100); // die letzten beiden Werte sind die Clipping Werte


Die Werte 1 und 100 sagen, dass du nur all Objekte zeichnen lässt, die genau die Entfernung im Bereich 1-100 haben.
Sprich: Alles, was näher als 1 liegt, wird nicht gezeichnet und alles was weiter als 100 entfernt ist, wird auch nicht mehr gezeichnet.

_________________
"As the enemy went to heaven,
we stayed in hell!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 12:46 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Hallo Allerseits.
Ich bin (wie der Titel der Rubrik schon sagt) Einsteiger in OpenGL-Delphi und habe exact das gleiche Problem (bearbeite die Tutorials).
Ich habe in der Formcreate Methode geschrieben: translatef(x,y,z)
Ich weiss nicht, ob das richtig ist, doch wenn das in der onIdle Methode steht, würde es doch bestimmt immer wiederholt werden, also würde man sich dauerhaft bewegen (oder die Welt sich).

Wie auch immer, es klappt nicht. Lasse ich translate weg und verändere die Punkte des Dreiecks auf der z-Achse, wird das Dreieck ebenfalls nicht gezeichnet.

Normales Dreieck:
Code:
  1. glBegin(GL_TRIANGLES);
  2.     glVertex3f(-1,-1, 0);
  3.     glVertex3f(+1,-1, 0);
  4.     glVertex3f(0, 1, 0);
  5.  glEnd;


Verschobenes Dreieck:
Code:
  1. glBegin(GL_TRIANGLES);
  2.     glVertex3f(-1,-1, -2);
  3.     glVertex3f(+1,-1, -2);
  4.     glVertex3f(0, 1, -2);
  5.  glEnd;


Anmerkung: Bei -1 für z wird das Dreieck noch gezeichnet, aber nicht Verschoben bzw. mit dem mit z = 0 überein. Wenn ich die Skalierung mit glScalef ändere (glScalef(0.5,0.5,0.5)) zeichnet Delphi das Dreieck (unverändert, jedoch natürlich kleiner durch andere Skalierung) auch bei größeren z-Werten.

Ich hoffe, ich bin da nicht zu detailliert geworden (muss bestimmt langweilig für manche sein, soetwas durchzulesen), da das Problem ja schon von geschildert wurde, jedoch mir die Lösung nicht klar wurde (von glut steht bei mir nix, nur gluPerspective mit
Code:
  1. const
  2.   NearClipping = 1;
  3.   FarClipping  = 1000;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 13:08 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
glTranslatef wird durch glLoadIdentity rückgängig gemacht.

Bist du dir sicher, dass du in gluPerspective und nicht im Orthomodus bist?
Bist du auch in dem Modelview?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 13:40 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Zitat:
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity;


Liegt hier der Fehler? Far/NearClipping wie oben.

Edit: Schreibt man genannten Quelltext in die Render Methode oder FormCreat oder wo rein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 13:49 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Code:
  1. glMatrixMode(GL_PROJECTION);
  2. glLoadIdentity;
  3. glMatrixMode(GL_MODELVIEW);
  4. glLoadIdentity;

gehört in den Renderer.
Was ich nur nicht verstehe weshalb du ein Dreieck mit der Tiefe 0 sehen kannst. Normal sollte da nichts sein.

Schau dir mal das VCL-Template an.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 14:01 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Nochmal ganz neu:

Meine Render Methode für 2 Farbige Dreiecke:

Code:
  1. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  2.  
  3. glMatrixMode(GL_PROJECTION);
  4. glLoadIdentity;
  5. gluPerspective(0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  6. glMatrixMode(GL_MODELVIEW);
  7. glLoadIdentity;
  8.  
  9.  
  10.  
  11. glScalef(0.5,0.5,-0.5);
  12.   glPushMatrix();
  13.   glBegin(GL_TRIANGLES);
  14.     glColor3f(1, 0, 0); glVertex3f(0,-1, 0);
  15.     glColor3f(0, 0, 1); glVertex3f(+1,-1, 0);
  16.     glColor3f(0, 1, 0); glVertex3f(0.5, 1, 0);
  17.   glEnd;
  18.   glPopMatrix();
  19.  
  20.   glPushMatrix();
  21.   glBegin(GL_TRIANGLES);
  22.   glColor3f(1, 0, 0); glVertex3f(-1,-1, 0);
  23.   glColor3f(0, 0, 1); glVertex3f( 0,-1, 0);
  24.   glColor3f(0, 1, 0); glVertex3f( -0.5, 1, 0);
  25.   glEnd;
  26.   glPopMatrix();
  27.  
  28.   SwapBuffers(DC);


Wie man sieht steht da
Code:
  1.  gluPerspective(0, ClientWidth/ClientHeight, NearClipping, FarClipping);


Schreibe ich
Code:
  1.  gluPerspective(45, ClientWidth/ClientHeight, NearClipping, FarClipping);

Sehe ich keine Dreiecke. Der Winkel
Zitat:
gibt das Betrachtungsfeld (FOV) in Grad, entlang der Y-Achse, an.


Gucke ich also bei 0° direkt auf den Boden und sehe meine Dreiecke da liegen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 14:46 
Offline
DGL Member

Registriert: Di Sep 04, 2007 14:49
Beiträge: 14
Okay hat sich erledigt, irgentwie funktioniert es nun.
Weiss nicht warum, tut mir leid wenn ich wessen Zeit verschwendet habe.


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


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