Nach einiger Zeit des probierens finde leider keine Lösung und möchte nochmal um Hilfe betteln. Ich probiere mich am Mathe-Tutorial2. Doch irgendwie schaut mein Sichtvektor "nach hinten". Deutlich wird das, wenn man die Richtung ändert. Kippt man das Schiff um die X-Achse nach vorn und bewegt sich nun, ändert sich zwar die Ansicht korrekt, allerdings bewegt sich das schiff nach "oben". Halt so als ob man hinten rausschaut. Richtig wild wird es , wenn man komplett quer in den Raum stellt und sich dann bewegt. Scheinbar sind alle Achsen betroffen.
Ich finde keine Erklärung dafür, denn eigentlich hätte ich gedacht, dass mein Sichtvektor in Richtung des Bewegungsvektors zeigt.
Da ich das Tutorial leider zusammenhangslos und im Ganzen ein wenig unverständlich finde (wahrscheinlich weil ich den roten Faden nicht finden kann), wollte ich mal nachfragen ob folgende Prozeduren korrekt sind:
Die Funktion "updaterotation" im Tutorial habe ch so verstanden, dass sie nur für die X-Achse gilt. Ist das dann die komplette Prozedur?
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Schau’ mal in unsere Filesektion! Dort gibt’s die Beispiele zum Tutorial. Sie heißen "Object Move Tutorial" und "Object Rotation Tutorial". Wenn du die bereits angeschaut hast, weiß ich leider nicht genau, was du willst, denn der Code den du gepostet hast ist doch Code aus dem Tutorial.
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
hmm das die Files zum Tutorial auch verfügbar sind hab ich bisher übersehen. Prima *patsch*. Naja, mal verliert man und mal gewinnen die anderen. :-/ Ich hatte mir alles aus dem Tutorial zusammen gebastelt. Daher kam mir das Tut auch so unkomplett vor. Naja, next.
Im Tut zeigt eine fixe Kamera auf das Objekt, welches man quer durch den Raum bewegen kann. Wie stelle ich es nun an, dass sich die Kamera auf dem Objekt befindet? (also Kamera=Objekt)
Code:
glMultMatrixf(@ObjMat);
glTranslate( Posvect[0],Posvect[1],Posvect[2]);
glPushMatrix;
//Zeichnen aller Objekte relativ zur Schiffsposition
hätte ich jetzt gedacht. Aber es fehlt ja noch neben der Translation auf die Kameraposition noch die Drehung auf die Kameraposition bevor ich anfange alle Objekte relativ zur Kameraposition zu zeichnen. Wie muß ich die Drehung umsetzen?
Dank und Gruß,
DNA
_________________ Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de
Die beiden mathematischen nicht, aber ein "Grundlagen"-Tutorial von Delphic beschäftigt sich damit wie ich grade herausgefunden habe. Das werde ich mir als nächstes vornehmen. Dank.
_________________ Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de
also entweder falle ich auf 'nen ganz dummen Fehler rein, oder ich bin zu deppert für das ganze. Ich hab die beiden Mathe-Tutorials durchgenommen und Teile der Quellen verwendet um mein eigenes (sehr übersichtliches) Grundgerüst für die Simulation zu schreiben. Ich hab auch das von Flash erwähnte Kamera Tutorial von Nico durchgelesen aber ich bekomms irgendwie nich gebacken. Irgendwas mache ich wahrscheinlich mit glulookat falsch (wobei man dabei auch nix falsch machen kann (denke ich)). Die beiden Mathe-Tutorials nutzen ja eine fixe Kamera, erkkären aber gut, wie die freie Bewegung des Objektes im Raum über die Objektmatrix erfolgt. Das funktioniert auch prima. Wenn man die Werte des Positions- und Richtungsvektors betrachtet sieht das korrekt aus.
Das Kamera-Tutorial hingegen hat ja gleich nen Haufen Ballast dabei (Joystick, Texturierung, Planetenklassen), was es auch ein wenig unübersichtlicher macht.
Daher versuche ich es erstmal mit glulookat auf meinem Postitionsvektor, schauend ich Richtung meines Bewegungsvektors und ausgerichtet mit dem UpVektor.
Da alle Funktionen die Standardfunktionen aus den Tutorials sind, hier nur die glDraw().
Code:
procedure glDraw;
var vorn, oben:TVector3f;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMultMatrixf(@ObjMat);
vorn:=VectorAdd(PosVect,MoveVec);// Bewegungs- und Sichtvektor //
oben:=VectorAdd(PosVect,UpVec);// Vektor nach oben //
// gluLookAt schaut immer auf den Punkt Länge 1 vor mir,
// von der Schiffsposition aus und mit dem Upvektor nach oben
gluLookAt( PosVect[0], PosVect[1], PosVect[2],
vorn[0], vorn[1], vorn[2],
oben[0], oben[1], oben[2]
);
DrawCoordSys;// Zeichnet das Raster des Koordinatensystems, damit ich weiß ob und wie sich das Objekt bewegt. //
DrawMoveVec;// Zeichnet von der Postion vor mir nach oben, links und rechts. Damit //
glFlush();// kontrolliere ich, ob ich nach vorne schaue //
end;
Für den Fall, dass der Fehler woanders liegt, habe ich den Quelltext angehängt.
Wie immer bin ich für jeden Hinweis dankbar.
Grüße, DNA
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Also ich habe mir den Code noch nicht angesehen aber einige Dinge sind mir aufgefallen:
GluLookAt verlangt als Upvektor einen Vektor der Länge 1. Einen Punkt über der Kamera zu berechnen und diesen als UpVector zu übergeben kann zu Fehlern führen. Übergib daher statt „oben“ besser gleich den UpVector und stelle sicher, dass seine Länge 1 ist und er auch senkrecht auf dem Viewvektor steht. Wobei das IMHO nicht zwingend notwendig ist.
Außerdem macht es aus meiner Sicht keinen Sinn mit glMultMatrix eine Kameramatrix zu setzen nur um diese im nächsten Aufruf mit gluLookAt zu überschreiben.
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
GluLookAt verlangt als Upvektor einen Vektor der Länge 1. Einen Punkt über der Kamera zu berechnen und diesen als UpVector zu übergeben kann zu Fehlern führen. Übergib daher statt „oben“ besser gleich den UpVector und stelle sicher, dass seine Länge 1 ist und er auch senkrecht auf dem Viewvektor steht.
Das habe ich angepasst. Hat aber nix gebracht.
Magellan hat geschrieben:
Außerdem macht es aus meiner Sicht keinen Sinn mit glMultMatrix eine Kameramatrix zu setzen nur um diese im nächsten Aufruf mit gluLookAt zu überschreiben.
Ist auch richtig. Allerdings wird "ObjMat" für die Bewegung meines Objektes verwendet. Die Daten die dabei rauskommen (neue Position, der neue Bewegungsvektor und der Upvektor wird dann zum Positionieren der Kamera verwendet. Beide Sachen (also Objekt und Kamera) sind aber nicht zwingend das selbe.
Aber Du hast mich auf die Lösung gebracht MultMat hat scheinbar schon lokale Position verändert und nicht nur die neue Position meines Objektes ausgerechnet (ich muß das nochmal nachlesen). Wenn ich nun die alte Matrix sichere
Code:
glPushMatrix;
glMultMatrixf(@ObjMat);
glPopMatrix;
dann haut das alles hin. Ich kann mich frei im Raum bewegen. Meine Kamera schaut immer nach vorn. Die Welt ist schön. Anbei nochmal der Quelltext und die Exe falls es jemanden interessiert.
Steuerung: Hoch, runter, links, rechts mit Cursor. Rollen mit Entf und PgDown, Geschindigkeit ändern mit 'A' und 'Y'. Stop mit 'S'.
Danke Magellan für den entscheidenden Tip.
Grüße, DNA
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de
Zuletzt geändert von DNA am Mo Okt 17, 2005 07:32, insgesamt 1-mal geändert.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn du glaubst eine absolut astreine Lösung zu haben, dann kannst du die auch im Wiki veröffentlichen. So wie es Andih mit seinen Kamera-Artikeln gemacht hat: http://wiki.delphigl.com/index.php/Kamera
Das Wiki ist auch für sowas gedacht...nicht nur für Befehlsspezifikationen
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.