Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Hi. Bei mir sind ein paar Fragen aufgetaucht, die ich ganz einfach mal stelle:
1. Meine erste Frage bezieht sich auf die Koordinaten der World Matrix. Im ersten Tutorial steht ja das man theoretisch unendlich klein oder groß darstellen kann. Ich habe es derzeit so verstanden das die Koordinaten der World Matrix fest sind. Diese kleinen Welten erschafft man indem die Koordinaten der Eckpunkte von beispielsweise Dreiecken Werte à la 0.001 haben. Habe ich das so richtig verstanden?
2. Meine zweite Frage bezieht sich auf gluPerspective. Ich hab im Wiki nachgelesen, aber ich kann mir derzeit nicht vorstellen wie dann eine Änderung von fovy oder aspect aussieht bzw. was sie bewirkt. Am besten wäre es vielleicht wenn jemand eine kleine, einfache Skizze oder so was in der Art hätte.
3. Nächste Frage dreht sich um die MatrixModes, mit denen ich noch nicht rumgespielt hab. Was bringen die unterschiedlcihen Modes wie MODELVIEW, TEXTURES und PROJECTION? Kann ich beispielsweise nur in einem der drei Dreiecke/Vierecke/ect. zeichnen oder wie sonst wirken sie sich aus?
4. Ok, nächste Frage dreht( ^_^ ) sich um glRotate* . Ich glaube den Text im Tutorial Nummer 3 nicht so richtig verstanden zu haben. Im Tutorial ist die Rede davon das Objekt zu verschieben? Ich dachte glTranslatef verschiebt das Koordinatensystem(den Urpsrung davon). Wenn es den Urpsrung verschieben würde, wäre es logisch warum sich ein Objekt dessen Mittelpunkt beispielsweise auf der Y-Achse liegt, sich um die eigene Achse dreht und ein Objekt dessen Mittepunkt woanders liegt sich um den angegebenen Punkt auf der Y-Achse dreht. Und, ist es logisch?( = habe ich es richtig verstanden das der Urpsrung des Koordinatensystems verschoben wird)
5. Das oben geschrieben würde bedeuten das ich Objekte nur um die eigene Achse drehen kann, wenn sie ihren Mittelpunkt auf eienr Achse des Koordinatensystems haben(natürlich auf der richtigen... ...schlecht ausgedrückt ... also bei drehungen links/rechts herum muss der Mittelpunkt auf der Y-Achse liegen – das meinte ich ^^)
6. Bisher hat es bei mir keinen (für mich sichtbaren) Unterschied gegeben ob ich einen Parameter bei der Punktangabe sehr hoch( 100 und höher) oder sehr niedrig (1) gewählt hab. Die Rotation sah für mich immer gleich aus. Hab ich den Unterschied einfach nicht bemerkt oder ist es praktisch egal welchen Wert man als Parameter auf einer Achse nimmt?
7. Bei meinen Rotationsversuchen wird das Objekt ab einer Drehung von 90° schwarz. Gehe ich richtig in der Anahme das nur die Vorderseiten von Vierecken, Dreiecken und Co mit Color3f eingefärbt werden?
8. Objekte kann ich nicht am Urpsrung des Koordinatensystems drehen, oder?(also glRotatef(45, 0, 0, 0); )
9. Meine TForm1.FormResize Prozedur springt nie bei einem Haltepunkt an, egal was ich mit meinem Fenster mache. In der Hilfe-Datei hab ich bisher dieseProzedur auch nicht gefunden. Bisher ging ich davon aus das sie sich ähnlich verhält wie TForm1.FormCreate - das sie also aktiviert wird, wenn ich etwas bestimmtes mit dem Formular mache. Aber wie oben bereits gesagt, ich hab sie noch nicht mal in der Hilfe Datei gefunden. Hab ich mich im Bezug auf diese Prozedur geirrt und ich muss sie wie jede andere Prozedur auch "von Hand" aufrufen?
10. Und die (vorerst) letzte Frage: Ich hab noch keinen Befehl im Wiki gefunden, der es einem ermöglichen würde, eine Kugel bzw. einen Kreis zu zeichnen. Gibt’s da einen oder wie sonst zeichnet man eine Kugel/Kreis?
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Hi, ich versuche dann mal die Fragen zu beantworten die ich beantworten kann.
Deathball hat geschrieben:
1. Meine erste Frage bezieht sich auf die Koordinaten der World Matrix. Im ersten Tutorial steht ja das man theoretisch unendlich klein oder groß darstellen kann. Ich habe es derzeit so verstanden das die Koordinaten der World Matrix fest sind. Diese kleinen Welten erschafft man indem die Koordinaten der Eckpunkte von beispielsweise Dreiecken Werte à la 0.001 haben. Habe ich das so richtig verstanden?
Die Koordinaten der Weltmatrix sind fest, aber ob ein z.b eine Kugel mit Radius 1 gross oder klein erscheint legst du fest indem du den Abstand vom Ursprung festsetzt.
Deathball hat geschrieben:
4. Ok, nächste Frage dreht( ^_^ ) sich um glRotate* . Ich glaube den Text im Tutorial Nummer 3 nicht so richtig verstanden zu haben. Im Tutorial ist die Rede davon das Objekt zu verschieben? Ich dachte glTranslatef verschiebt das Koordinatensystem(den Urpsrung davon). Wenn es den Urpsrung verschieben würde, wäre es logisch warum sich ein Objekt dessen Mittelpunkt beispielsweise auf der Y-Achse liegt, sich um die eigene Achse dreht und ein Objekt dessen Mittepunkt woanders liegt sich um den angegebenen Punkt auf der Y-Achse dreht. Und, ist es logisch?( = habe ich es richtig verstanden das der Urpsrung des Koordinatensystems verschoben wird)
Es wird nicht um den Ursprung des Koordinatensystems gedreht sondern um den Punkt auf dem du dich befindest. Dadurch wird der Ursprung verschoben wie du gesagt hast.
Deathball hat geschrieben:
5. Das oben geschrieben würde bedeuten das ich Objekte nur um die eigene Achse drehen kann, wenn sie ihren Mittelpunkt auf eienr Achse des Koordinatensystems haben(natürlich auf der richtigen... ...schlecht ausgedrückt ... also bei drehungen links/rechts herum muss der Mittelpunkt auf der Y-Achse liegen – das meinte ich ^^)
Nein, du bewegst dich einfach per glTranslatef in den Mittelpunkt des Objektes und rotierst dann.
Deathball hat geschrieben:
6. Bisher hat es bei mir keinen (für mich sichtbaren) Unterschied gegeben ob ich einen Parameter bei der Punktangabe sehr hoch( 100 und höher) oder sehr niedrig (1) gewählt hab. Die Rotation sah für mich immer gleich aus. Hab ich den Unterschied einfach nicht bemerkt oder ist es praktisch egal welchen Wert man als Parameter auf einer Achse nimmt?
Was für eine Punktangabe bzw. welcher Befehl? Hier verstehe ich leider Bahnhof.
Deathball hat geschrieben:
7. Bei meinen Rotationsversuchen wird das Objekt ab einer Drehung von 90° schwarz. Gehe ich richtig in der Anahme das nur die Vorderseiten von Vierecken, Dreiecken und Co mit Color3f eingefärbt werden?
Entweder wird das Objekt aus dem sichtbaren Bereich gedreht oder du hast GLCullFace aktiv. Dann wird eine Seite des Objektes nicht gezeichnet. Ansonsten sind immer beide Seiten eingefärbt.
Deathball hat geschrieben:
8. Objekte kann ich nicht am Urpsrung des Koordinatensystems drehen, oder?(also glRotatef(45, 0, 0, 0); )
Musst dich zum Ursprung zurückbewegen und dann kannst du es mit glRotateF rotieren.
Deathball hat geschrieben:
9. Meine TForm1.FormResize Prozedur springt nie bei einem Haltepunkt an, egal was ich mit meinem Fenster mache. In der Hilfe-Datei hab ich bisher dieseProzedur auch nicht gefunden. Bisher ging ich davon aus das sie sich ähnlich verhält wie TForm1.FormCreate - das sie also aktiviert wird, wenn ich etwas bestimmtes mit dem Formular mache. Aber wie oben bereits gesagt, ich hab sie noch nicht mal in der Hilfe Datei gefunden. Hab ich mich im Bezug auf diese Prozedur geirrt und ich muss sie wie jede andere Prozedur auch "von Hand" aufrufen?
Haste du Form1.onResize die Prozedur zugewiesen? Wenn nein, mach es mal
Deathball hat geschrieben:
10. Und die (vorerst) letzte Frage: Ich hab noch keinen Befehl im Wiki gefunden, der es einem ermöglichen würde, eine Kugel bzw. einen Kreis zu zeichnen. Gibt’s da einen oder wie sonst zeichnet man eine Kugel/Kreis?
Kugel gibt es gluSphere. Kreis gibt es nicht, kann man aber leicht selber basteln.
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Danke für die Antworten.
Zitat:
Was für eine Punktangabe bzw. welcher Befehl? Hier verstehe ich leider Bahnhof.
Ok, ich geb zu, war bescheiden formuliert.
Bessere Formulierung: Ich hab ein bisschen mit glRotate rumgespielt. Dabei hat es für mich keinen (sichtbaren) Unterschied gemacht ob ich
Code:
glRotatef(45, 0, 1, 0);
oder
Code:
glRotatef(45, 0, 100, 0);
Die Rotation sah für mich genau gleich aus.
Jetzt würde ich gerne wissen ob das normal ist, oder ob ich nen Knick im Sichtfeld hab bzw. meine Brille mal wieder putzen müsste.
Anzumerken wäre noch das es keine Rotation um die eigene Achse war.
Ach so, und noch ne Frage die mir grad einfällt:
Wenn ich ein Objekt um sich selbst drehen will und es gleichzeitig um einen bestimmten Punkt drehen soll, dann funktioniert das nach meinem derzeitigen Verständnis nicht mit glRotate oder? Denn mit diesem Befehl wird es ja nur gedreht gezeichnet, und es gilt immer die letzten Paramter. Wenn ich also 2 mal glRotate aufrufe, zählt nur das letzte für die Zeichnung des Objekts. Demnach könnte man nicht(zumindest fällt mir keine Lösung ein) ein Objekt um sich selbst und gleichzeitig um einen anderen Punkt rotieren lassen(außer der andere Punkt liegt auf einer anderen Achse wie die Eigenrotation)
Hoffe ich habs geschafft verständlicher zu schreiben ^^° .
Und Sorry nochma wegen den vielen Rechtschreibfehlern, heut is bei mir irgendwie der Wurm drin in puncto Rechtschreibung...
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Deathball hat geschrieben:
Bessere Formulierung: Ich hab ein bisschen mit glRotate rumgespielt. Dabei hat es für mich keinen (sichtbaren) Unterschied gemacht ob ich ...
Habe gerade im Wiki nachgeschaut, du definierst nur den Vektor um den rotiert wird. Und die Länge des Vektors ist dann egal.
Deathball hat geschrieben:
Ach so, und noch ne Frage die mir grad einfällt: Wenn ich ein Objekt um sich selbst drehen will und es gleichzeitig um einen bestimmten Punkt drehen soll, dann funktioniert das nach meinem derzeitigen Verständnis nicht mit glRotate oder? Denn mit diesem Befehl wird es ja nur gedreht gezeichnet, und es gilt immer die letzten Paramter. Wenn ich also 2 mal glRotate aufrufe, zählt nur das letzte für die Zeichnung des Objekts. Demnach könnte man nicht(zumindest fällt mir keine Lösung ein) ein Objekt um sich selbst und gleichzeitig um einen anderen Punkt rotieren lassen(außer der andere Punkt liegt auf einer anderen Achse wie die Eigenrotation)
Doch, es funktioniert! Du startest auf dem bestimmten Punkt, rotierst dann um den Winkel den du drehen willst. Dann bewegst du dich mit glTranslatef um den Abstand auf den Punkt wo dein Objekt steht. Dann rotierst du mit glRotatef um das Objekt selbst.
Registriert: Sa Nov 13, 2004 11:00 Beiträge: 229 Wohnort: Steinhude
zu glrotate ist zu sagen, dass der erste parameter der Winkel ist und der zweite die Achse um die gedreht werden soll.
und die achse (1,0,0) ist identisch mit der achse (100,0,0).
Zitat:
Ach so, und noch ne Frage die mir grad einfällt: Wenn ich ein Objekt um sich selbst drehen will und es gleichzeitig um einen bestimmten Punkt drehen soll, dann funktioniert das nach meinem derzeitigen Verständnis nicht mit glRotate oder? Denn mit diesem Befehl wird es ja nur gedreht gezeichnet, und es gilt immer die letzten Paramter. Wenn ich also 2 mal glRotate aufrufe, zählt nur das letzte für die Zeichnung des Objekts. Demnach könnte man nicht(zumindest fällt mir keine Lösung ein) ein Objekt um sich selbst und gleichzeitig um einen anderen Punkt rotieren lassen(außer der andere Punkt liegt auf einer anderen Achse wie die Eigenrotation)
es zählt nicht nur die letzte rotation, sondern alle. wenn du ein objekt um die eigene achse und einen punkt drehen willst, musst du das objekt im ursprung um die nötigen achsen drehen, es so verschieben, das der entsprechende punkt im ursprung liegt und darum drehen.
Zitat:
3. Nächste Frage dreht sich um die MatrixModes, mit denen ich noch nicht rumgespielt hab. Was bringen die unterschiedlcihen Modes wie MODELVIEW, TEXTURES und PROJECTION? Kann ich beispielsweise nur in einem der drei Dreiecke/Vierecke/ect. zeichnen oder wie sonst wirken sie sich aus?
die unterschiedlichen matrixmodi geben an, auf welche matrix sich darauffolgende Matrixoperationen(gltranslate, glrotate...) beziehen. die modelviewmatrix bezieht sich allgemein auf änderungen des koordinatensystems, die projection auf die perspektivische verzerrung der szene und textures auf veränderungen der texturen
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Deathball hat geschrieben:
1. Meine erste Frage bezieht sich auf die Koordinaten der World Matrix. Im ersten Tutorial steht ja das man theoretisch unendlich klein oder groß darstellen kann. Ich habe es derzeit so verstanden das die Koordinaten der World Matrix fest sind. Diese kleinen Welten erschafft man indem die Koordinaten der Eckpunkte von beispielsweise Dreiecken Werte à la 0.001 haben. Habe ich das so richtig verstanden?
i0n0s hat geschrieben:
Die Koordinaten der Weltmatrix sind fest, aber ob ein z.b eine Kugel mit Radius 1 gross oder klein erscheint legst du fest indem du den Abstand vom Ursprung festsetzt.
Das ist glaub ich nicht die Antwort die er erwartet hat. Zauberwort ist hier "das Verhältnis". Man kann mit OpenGL ein ganzes Universum mit zich gallaxien darstellen oder aber nur eine einzige Zelle, oder sogar nur ein einziges Atom, und in jedem Falle kann man OpenGL an die Grenzen der leistungsfähigkeit treiben, oder auch nicht. Du legst duch die Art der Modelle und wie du dich darinnen bewegst die Größe fest. Du kannst 2 Würfel in 10 OpenGL einheiten entfernung zueinander postieren. Wenn du nun sehr langsam zwischen den Würfeln wanderst (und entgegenfliegende Partikel einblendest) wird der User glauben, er würde unglaublich große distanzen überbrücken. machst du das selbe in recht großer geschwindigkeit, dann glaubt der User die Würfel wären klein, und ständen nahe bei einander. Das verhältnis machts. Was nicht ohne weiteres geht, ist ein Atom und ein Universum im selben maßstab anzuzeigen.
Nochwas wichtiges: Die "Auflösung" von OpenGL ist nach unten beschränkt. (z.B. durch die Genauigkeit der Typen. (single/Double)). Wenn du ein ganzen universum darstellt, heißt das z.B., dass Objekte die Lichtjahre auseinander sind, auf einen Punkt zusammen fallen. Wenn du dich im Atomaren Maßstab bewegst gilt das gleiche dann für Pickometer. (Die Auflösung des Tiefenpuffers ist auch so eine Geschichte...aber das lass ich jetzt mal)
Deathball hat geschrieben:
4. Ok, nächste Frage dreht( ^_^ ) sich um glRotate* . Ich glaube den Text im Tutorial Nummer 3 nicht so richtig verstanden zu haben. Im Tutorial ist die Rede davon das Objekt zu verschieben? Ich dachte glTranslatef verschiebt das Koordinatensystem(den Urpsrung davon). Wenn es den Urpsrung verschieben würde, wäre es logisch warum sich ein Objekt dessen Mittelpunkt beispielsweise auf der Y-Achse liegt, sich um die eigene Achse dreht und ein Objekt dessen Mittepunkt woanders liegt sich um den angegebenen Punkt auf der Y-Achse dreht. Und, ist es logisch?( = habe ich es richtig verstanden das der Urpsrung des Koordinatensystems verschoben wird)
i0n0s hat geschrieben:
Es wird nicht um den Ursprung des Koordinatensystems gedreht sondern um den Punkt auf dem du dich befindest. Dadurch wird der Ursprung verschoben wie du gesagt hast.
Das ist so nicht richtig. Ja es stimmt, dass immer um den Punkt indem sich die Kamera befindet rotiert wird, und ja es stimmt, dass immer um den Koordinatenursprung rotiert wird. Wieso? Weil beide Punkte identisch sind. Die "Kamera" befindet sich immer im Koordinaten ursprung (Außer es wird an der Perspectivmatrix rumgemogelt. Jedenfalls denke ich, dass man da was drehen könnte). Jedenfalls stimmt die behauptung, dass man durch glTranslate z.B. den Ursprung verschiebt, und man dann z.B. auf den ursprünglichen Ursprung gucken kann. Der ist aber nicht mehr der aktuelle Ursprung!
Deathball hat geschrieben:
5. Das oben geschrieben würde bedeuten das ich Objekte nur um die eigene Achse drehen kann, wenn sie ihren Mittelpunkt auf eienr Achse des Koordinatensystems haben(natürlich auf der richtigen... ...schlecht ausgedrückt ... also bei drehungen links/rechts herum muss der Mittelpunkt auf der Y-Achse liegen – das meinte ich ^^)
i0n0s hat geschrieben:
Nein, du bewegst dich einfach per glTranslatef in den Mittelpunkt des Objektes und rotierst dann.
Ionis liegt hier falsch, und Deathball hat recht. Ionis griegt aber ein relativ richtig...siehe oben.
Deathball hat geschrieben:
6. Bisher hat es bei mir keinen (für mich sichtbaren) Unterschied gegeben ob ich einen Parameter bei der Punktangabe sehr hoch( 100 und höher) oder sehr niedrig (1) gewählt hab. Die Rotation sah für mich immer gleich aus. Hab ich den Unterschied einfach nicht bemerkt oder ist es praktisch egal welchen Wert man als Parameter auf einer Achse nimmt?
Wie bereits erwähnt ist parameter 2-4 ein Ortsvektor und keine Punktangabe. (steht auch im Wiki )
Deathball hat geschrieben:
7. Bei meinen Rotationsversuchen wird das Objekt ab einer Drehung von 90° schwarz. Gehe ich richtig in der Anahme das nur die Vorderseiten von Vierecken, Dreiecken und Co mit Color3f eingefärbt werden?
i0n0s hat geschrieben:
Entweder wird das Objekt aus dem sichtbaren Bereich gedreht oder du hast GLCullFace aktiv. Dann wird eine Seite des Objektes nicht gezeichnet. Ansonsten sind immer beide Seiten eingefärbt.
ich schätze hier hat ionis recht mit der vermutung, dass Backfaceculling dazwischen funkt. Einfache möglichkeit das zu prüfen...setz eine andere Hintergrundfarbe.
Deathball hat geschrieben:
8. Objekte kann ich nicht am Urpsrung des Koordinatensystems drehen, oder?(also glRotatef(45, 0, 0, 0); )
i0n0s hat geschrieben:
Musst dich zum Ursprung zurückbewegen und dann kannst du es mit glRotateF rotieren.
glRotatef(xx,0,0,0) sollte eigentlich NIE funktionieren. Wieso? Vektor der Länge 0 und so...
Deathball hat geschrieben:
9. Meine TForm1.FormResize Prozedur springt nie bei einem Haltepunkt an, egal was ich mit meinem Fenster mache. In der Hilfe-Datei hab ich bisher dieseProzedur auch nicht gefunden. Bisher ging ich davon aus das sie sich ähnlich verhält wie TForm1.FormCreate - das sie also aktiviert wird, wenn ich etwas bestimmtes mit dem Formular mache. Aber wie oben bereits gesagt, ich hab sie noch nicht mal in der Hilfe Datei gefunden. Hab ich mich im Bezug auf diese Prozedur geirrt und ich muss sie wie jede andere Prozedur auch "von Hand" aufrufen?
i0n0s hat geschrieben:
Haste du Form1.onResize die Prozedur zugewiesen? Wenn nein, mach es mal
Jo...wie Ionis sagt...das is ein Ereignishandler deines Formulars. Guck da mal nach...
Deathball hat geschrieben:
10. Und die (vorerst) letzte Frage: Ich hab noch keinen Befehl im Wiki gefunden, der es einem ermöglichen würde, eine Kugel bzw. einen Kreis zu zeichnen. Gibt’s da einen oder wie sonst zeichnet man eine Kugel/Kreis?
i0n0s hat geschrieben:
Kugel gibt es gluSphere. Kreis gibt es nicht, kann man aber leicht selber basteln.
So ganz trivial isses net...kleines bisl mathe brauch man...oder eine Wundermaschiene wie google...die hilft da hin und wieder auch weiter
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Danke für die ganzen Antworten. Ihr habt mir wirklich weiter geholfen. Allerdings war das noch lagn nit alles was ich wissen will !!!
Ok, bei der FormResize Methode funktioniert der Haltepunkt jetzt.
Allerdings funktionieren Haltepunkte bei der FormClose bzw. FormDestroy Prozedur nicht. Ist das normal?
Weil ich zuerst dachte ich hätte den selben Fehler gemacht wie bei meiner FormResize-Prozedur, hab ich es auch versucht mit einem Form1.Close bzw. mit einem Form1.Destroy und dann einem Aufruf von meiner TForm1.FormClose-Prozedur zu beheben.
Code:
Form1.Close := FormClose(Sender);
Egal ob ich das Close bei Form1.Close durch Destroy ersetzt hab oder ähnlcihe Versuche: Jedes mal hab ich als Antwort erhalten das die linke Seite nicht zugewiesen werden kann. Ein Weglassen von (Sender) bei dem Prozeduraufruf hat logischerweise einen weiteren Fehler kreiert, der meinte es gäbe zu wenig Parameter. Wenn ich statt "Form1.Close" "Form1.OnClose" schreibe lautet die Fehlermeldung: Inkompatible Typen: 'TCloseEvent' ...
Tja, ist es jetzt normal das Haltepunkte in einer Prozedur die bei Beenden/Schließen des Programms angesprungen werden müssten einfach ignoriert werden?
Weiter gehts: Wenn ich euch(und das Tutorial) richtig verstanden hab, dann löst folgender Code eine Rotation um einen Punkt sowie eine Rotation um die eigene Achse aus:
Code:
[...]
glTranslatef(0, 0, -15);
glRotatef(Punktrotation, 0, 1, 0);
glTranslatef(2, 0, 0);
glRotatef(Achsenrotation, 0, 1, 0);
glColor3f(1, 0, 0);
glBegin(GL_QUADS);
glVertex3f(-1, 0, 0);
glVertex3f(1, 0, 0);
glVertex3f(1, 2, 0);
glVertex3f(-1, 2, 0);
glEnd;
[...]
Natürlich angenommen das Punktrotation und Achsenrotation Variablen sind, die größer(inkrementiert, wenn ich mich recht entsinne) bzw. kleiner(wäre dann dementsprechend dekrementiert) werden.
Ich hab den Code ausprobiert und er scheint zu funktionieren.
Jetzt frage ich mich aber wie ich sage, das ich die anderen Objekte nicht rotiert gezeichnet haben möchte bzw. sie um einen anderen Punkt rotiert gezeichnet haben möchte.
Beispielsweise möchte ein Viereck um die eigene Achse drehen und das andere um einen komplett anderen Punkt rotieren lassen.
Wenn ich zuerst das eine Viereck male und es um die eigene Achse rotieren lasse und dann das andere auch rotiert malen lasse, dann wird sich das zweite Viereck doch nicht nur um sich selbst drehen, sondern auch um das erste Viereck, da ja nicht nur das letzte glRotate sondern alle glRotates zählen. Oder hab ich da irgendwo einen Logikfehler drin?
Was was mir auch bei dem Thema Rotationen aufgefallen ist: Wenn ich ein Viereck um einen Punkt positiv drehe, es sich aber gleichzeitig um die eigene Achse negativ drehen lasse, sieht das imho irgendwie komisch aus. Ist das normal?
Und noch was, was mir aufgefallen ist: Warum bewegt man sich eigentlich erst mit glTranslatef auf der Z-Achse zurück und zeichnet dann? Normalerweise müsste ich dann doch genausoviel sehen, wie wenn ich das glTranslatef einfach weglasse und dann zeichne. Denn der Zeichenstift/der Urpsrung hat sich doch mitbewegt als man sich auf der Z-Achse bewegt hat. Genauso wie wenn ich mich auf der X- oder Y-Achse bewege.
Warum kann ich auf der X- bzw. Y-Achse den Urpsrung verschieben, aber scheinbar auf der Z-Achse nicht? Oder hab ich irgendwo einen Logikfehler drin?
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Deathball hat geschrieben:
Code:
Form1.Close := FormClose(Sender);
Es heisst onClose. Und zwar
Code:
Form1.onClose:=FormClose
ohne Sender, der wird automatisch hinzugefügt. Und Formclose muss so aussehen:
Code:
procedure Form1.FormClose(Sender: TObject; var Action: TCloseAction);
Deathball hat geschrieben:
Jetzt frage ich mich aber wie ich sage, das ich die anderen Objekte nicht rotiert gezeichnet haben möchte bzw. sie um einen anderen Punkt rotiert gezeichnet haben möchte.
Bevor du rotierst speicherst du einfach die Matrix mit glPushMatrix. Mit glPopMatrix stellst du die alte Matrix wieder her und befindest dich an dem Punkt wo du die Matrix gespeichert hast. Du erstellst also das erste Viereck, stellst die Matrix her und erstellst das 2. Viereck genauso wie du das erste erstellt hast. PushMatrix und PopMatrix arbeiten übrigens nach dem LIFO Prinzip. Das was zuletzt gespeichert wurde kommt zuerst wieder raus.
Deathball hat geschrieben:
Oder hab ich da irgendwo einen Logikfehler drin?
Nein, hast du nicht
Deathball hat geschrieben:
Was was mir auch bei dem Thema Rotationen aufgefallen ist: Wenn ich ein Viereck um einen Punkt positiv drehe, es sich aber gleichzeitig um die eigene Achse negativ drehen lasse, sieht das imho irgendwie komisch aus. Ist das normal?
Im Prinzip gibt es keinen Unterschied zwischen positiv und negativ rotieren. Ob ich um -90° oder 270° drehe, es kommt dasselbe raus. Vielleicht einen Codehappen für uns?
Deathball hat geschrieben:
Und noch was, was mir aufgefallen ist: Warum bewegt man sich eigentlich erst mit glTranslatef auf der Z-Achse zurück und zeichnet dann? Normalerweise müsste ich dann doch genausoviel sehen, wie wenn ich das glTranslatef einfach weglasse und dann zeichne. Denn der Zeichenstift/der Urpsrung hat sich doch mitbewegt als man sich auf der Z-Achse bewegt hat. Genauso wie wenn ich mich auf der X- oder Y-Achse bewege. Warum kann ich auf der X- bzw. Y-Achse den Urpsrung verschieben, aber scheinbar auf der Z-Achse nicht? Oder hab ich irgendwo einen Logikfehler drin?
Der Ursprung, der erste Punkt wo du startest bist du, jedenfalls theoretisch. Du musst erst von dir weg bevor du das gezeichnete siehst.
Du bewegst mit gltranslatef oder glrotatef nur den Zeichenstift, aber nicht deinen Sichtpunkt. Hoffe das ich es richtig formuliert habe, wenn nicht ist gleich Flash da
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja das stimmt, mit dem "Stift verschieben". Ich glaube sogar, meine vorhergehenden ausführungen waren nicht ganz korrekt.
Soweit ich das verstanden habe ist folgendes der Fall:
- Die Kamera bleibt (abgesehen von Mogeleien an der Perspektivmatrix) immer am ursprünglichen (nicht den aktuellen!) Koordinatenursprung.
- Verschiebungen und drehungen manipulieren die Welt-Matrix und damit den aktuellen Koordinatenursprung.
- Man zeichnet immer an den Aktuellen(!) Koordinatenursprung (deshalb ist das mit dem Stift so deutbar)
Nochwas zum Rotieren und so allgemein.
Wir haben an der Uni mit dem Szenengraph gearbeitet. Das funktioniert folgendermaßen:
Knoten repräsentieren Objekte
Kanten repräsentieren manipulationen an der Weltmatrix (rotation, skalierung, translation)
Du zeichest alle Objekte bzw. Deren einzelnteile auf die unterste Ebene eines Baumes.
Dann machst du von diesen Knoten eine Kante nach oben (auf die Eltern) und schreibst an die Kante die manipulationen, um die Objekte bezüglich ihren Eltern auszurichten.
Dann machst du das selbe für die Eltern.
Ganz oben an deinem Baum ist dasnn die Komplette Szene.
Wenn du den Baum von oben nach unten durchläufst, machst du immer, wenn sich der Baum aufgabelt ein Pushmatrix. Wenn du aus dem Baum wieder hochkommst, an die stelle machst du Popmatrix, und hast die selbe situation hergestellt, wie als wenn du gerade erst von oben gekommen wärst. Jetzt kannst du die andere Gabelung ablaufen.
Versuch mal deine Szene aufzumalen als solchen Baum...du solltest dann leichter sehen, was du was machen musst.
(Anstatt Push und Pop, kannst du auch die entsprechenden Gegenbewegungen ausführen. Das geht aber nur, wenn du nicht skaliert hast. Da können sonst abweichungen auftreten. Reines Translate und Rotate kann man aber so rückgängig machen. Diese Variante ist schneller als Push/PopMatrix() )
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Erstma wieder danke für die Antworten.
i0n0s hat geschrieben:
Deathball hat geschrieben:
Oder hab ich da irgendwo einen Logikfehler drin?
Nein, hast du nicht
Hör ich doch immer wieder gerne
i0n0s hat geschrieben:
Im Prinzip gibt es keinen Unterschied zwischen positiv und negativ rotieren. Ob ich um -90° oder 270° drehe, es kommt dasselbe raus. Vielleicht einen Codehappen für uns?
Meine Render-Prozedur:
Code:
procedure TForm1.Render;
[...]
glTranslatef(0, 0, -15);
glRotatef(Angle1, 0, 1, 0);
glTranslatef(-6, 0, 0);
glRotatef(Angle2, 0, 1, 0);
glBegin(GL_QUADS);
glVertex3f(-1, 0, 0);
glVertex3f(1, 0, 0);
glVertex3f(1, 3, 0);
glVertex3f(-1, 3, 0);
glEnd;
SwapBuffers(DC);
So, wenn der Timer, der die Variablen Angle1 und Angle2 verändert jetzt so aussieht, dann hab ich (anscheinend) nur eine Punktrotation, die Rotation um die eigene Achse seh ich nit:
Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(Angle1);
dec(Angle2);
end;
Wenn die Prozedur aber so aussieht, dann sind beide Rotationen sichtbar:
Code:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(Angle1);
dec(Angle2, 2);
end;
Allerdings kann es natürlich auch sein, das die Rotation da ist, ich seh sie aber nit...
(*überleg wann ich mir das letzte mal die Brille geputzt hab* )
Hm... *angestrengt überleg*
Mist, jetzt ist mir doch glatt noch ne die andere Frage, die ich noch hatte, entfallen...
wenn sie mir wieder einfällt, editier ich sie hier in meinen Post rein...
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Ist an sich logisch:
Beide werden mit 0 initialisiert.
Die erste Rotation wird durch die zweite ausgeglichen. Dein Körper steht immer gleich zu dir, nur z und x verändern sich.
Lass einfach mal das 2. glRotatef weg.
So sieht eine Punktrotation aus
Dein Körper rotiert aktuell übrigens wie der Mond. Immer mit der selben Seite zur Erde.
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Hast du gerade das *batch* gehört?
Das war meine Hand, mit der ich mir auf die Stirn geschlagen hab. ^^
Oh man, darauf hätte ich mit ein bisschen Logik auch selbst kommen können... ...hab halt vergessen das Objekte die sich um einen Punkt drehen nicht auf den Betrachter ausgerichtet bleiben...
Naja, kann doch jedem mal passieren, oda?
(ich weiß, im unter den Teppich kehren bin ich einsame spitze ^^ )
Danke aber auf alle Fälle für die Hilfe...
Allerdings gibts noch was was ich bisher nicht mit der Forensuche und dem Wiki lösen konnte:
Eine Kugel, die mithilfe von gluSphere erstellt wurde, texturieren.
Mit der Suchfunktion hab ich folgenden Text gefunden:
Zitat:
var Q : PGLUQuadric begin ... glBindTexture(GL_TEXTURE_2D, Tex); gluQuadricTexture(Q, True); <-- aktiviert Texturierung auf Quadrics gluSphere(Q, Radius, Slices, Stacks);
Allerdings komm ich mit dem nicht so ganz klar. Außerdem wäre noch anzumerken das ich einen TextureLoader benutze, nämlich glBitmap.
Ich hab ein bisschen rumgespielt, aber er möchte halt eine "PGLUQuadric Textur".
Die kann ich ihm nicht wirklich liefern, da ich, wenn ich meine Variable vom Typ TglBitmap2d mithilfe von gluNewQuadric in ein Quadric-Objekt werden lassen möchte, dann bekomme ich als Antwort "Zu viele Parameter".
So, wie funktioniert das ganze jetzt?
Falls ich oben irgendwelche Denkfehler drin hab wäre es nett mich drauf hinzuweisen...
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.