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

Aktuelle Zeit: So Jul 13, 2025 22:23

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Lost in Space. Bewegen im 3D-Raum.
BeitragVerfasst: Mo Okt 10, 2005 23:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo Kollegen,

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?
Code:
  1.  
  2. procedure UpdateRotation(RotAxis: Integer; Ang: Single);
  3. var TmpMat  : TMatrix4f;
  4. begin
  5.   Ang := DegToRad(Ang);
  6.  
  7.   if RotAxis = ROTATE_LOCAL_X then
  8.   begin
  9.     TmpMat := CreateRotationMatrix(LocalX, Ang);
  10.     LocalY := VectorTransform(LocalY, TmpMat);
  11.     LocalZ := VectorTransform(LocalZ, TmpMat);
  12.     ObjMat := MatrixMultiply(ObjMat, TmpMat);
  13.   end else
  14.  
  15.   if RotAxis = ROTATE_LOCAL_Y then
  16.   begin
  17.     TmpMat := CreateRotationMatrix(LocalY, Ang);
  18.     LocalX := VectorTransform(LocalX, TmpMat);
  19.     LocalZ := VectorTransform(LocalZ, TmpMat);
  20.     ObjMat := MatrixMultiply(ObjMat, TmpMat);
  21.   end else
  22.  
  23.   if RotAxis = ROTATE_LOCAL_Z then
  24.   begin
  25.     TmpMat := CreateRotationMatrix(LocalZ, Ang);
  26.     LocalX := VectorTransform(LocalX, TmpMat);
  27.     LocalY := VectorTransform(LocalY, TmpMat);
  28.     ObjMat := MatrixMultiply(ObjMat, TmpMat);
  29.   end;
  30. end;
  31.  


Die Umsetzung aller Eingaben müßte dann so aussehen, dass \"updaterotation\" auf alle Achsen agewendet wird:
Code:
  1.  
  2.   if Keys[VK_UP] then Direction := -1 else
  3.      if Keys[VK_DOWN] then Direction := 1 else
  4.         Direction:=0;
  5.   updaterotation(1,TURN_SPEED*Direction);
  6.  
  7.   if Keys[VK_Left] then Direction := -1 else
  8.     if Keys[VK_right] then Direction := 1 else
  9.         Direction:=0;
  10.   updaterotation(2,TURN_SPEED*Direction);
  11.  
  12.   if Keys[VK_DELETE] then Direction := 1 else
  13.      if Keys[VK_NEXT] then Direction := -1 else
  14.         Direction:=0;
  15.   updaterotation(3,TURN_SPEED*Direction);



Durch die Gegend schippern tu ich, weil ich mich in Richtung des Richtungsvektors bewege:
Code:
  1.   PosVect[0] := PosVect[0] + LocalZ[0]*SPEED;
  2.   PosVect[1] := PosVect[1] + LocalZ[1]*SPEED;
  3.   PosVect[2] := PosVect[2] + LocalZ[2]*SPEED;
  4.  

Wenn ich hier ein Minus statt Plus verwende (das war dann nur noch dumpfes Probieren) wird es auch nicht richtig.

Ich bin wie immer für jeden Hinweis dankbar,
DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 11, 2005 18:34 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Okt 11, 2005 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo,

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:
  1.   glMultMatrixf(@ObjMat);
  2.   glTranslate( Posvect[0],Posvect[1],Posvect[2]);
  3.   glPushMatrix;
  4.   //Zeichnen aller Objekte relativ zur Schiffsposition
  5.   glTranslate( 10-Posvect[0],10-Posvect[1],10-Posvect[2]);
  6.   gluSphere(SphereQuadratic, 2,5, 20);
  7.   glPopMatrix;
  8.   glPushMatrix;
  9.   glTranslate( 5-Posvect[0],5-Posvect[1],5-Posvect[2]);
  10.   gluSphere(SphereQuadratic, 4,5, 20);
  11. // ...
  12.  

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 09:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich dachte eins der beiden Tutorials befasst sich mit einer beweglichen Kamera? <o.Ô>

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 12, 2005 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hi,

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 16, 2005 19:51 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Hallo zusammen,

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:
  1. procedure glDraw;
  2. var  vorn, oben:TVector3f;
  3. begin
  4.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  5.   glLoadIdentity();
  6.  
  7.   glMultMatrixf(@ObjMat);
  8.  
  9.   vorn:=VectorAdd(PosVect,MoveVec);  //  Bewegungs- und Sichtvektor  //
  10.   oben:=VectorAdd(PosVect,UpVec);    //  Vektor nach oben            //
  11.  
  12.   //  gluLookAt schaut immer auf den Punkt Länge 1 vor mir,
  13.   //  von der Schiffsposition aus und mit dem Upvektor nach oben
  14.   gluLookAt( PosVect[0], PosVect[1], PosVect[2],
  15.              vorn[0],    vorn[1],    vorn[2],
  16.              oben[0],    oben[1],    oben[2]
  17.              );
  18.  
  19.   DrawCoordSys;          //  Zeichnet das Raster des Koordinatensystems, damit ich weiß ob und wie sich das Objekt bewegt.  //
  20.   DrawMoveVec;           //  Zeichnet von der Postion vor mir nach oben, links und rechts. Damit      //
  21.   glFlush();             //  kontrolliere ich, ob ich nach vorne schaue                               //
  22. end;
  23.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 16, 2005 21:23 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 06:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Magellan hat geschrieben:
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 :idea: 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:
  1.   glPushMatrix;
  2.   glMultMatrixf(@ObjMat);
  3.   glPopMatrix;
dann haut das alles hin. Ich kann mich frei im Raum bewegen. Meine Kamera schaut immer nach vorn. Die Welt ist schön. :lol:
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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 07:30 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Sep 23, 2005 20:31
Beiträge: 212
Wohnort: Sachsen/ Vogtland
Wobei es bestimmt am richtigsten wäre, "glMultMatrixf(@ObjMat);" in "Updatemovement" auszuführen, dann kann ich mir das Getrickse in glDraw sparen.

DNA

_________________
Heute code ich, morgen debug ich, und übermorgen caste ich die Königin auf int.
http://www.2ndmoon.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 17, 2005 10:18 
Offline
Guitar Hero
Benutzeravatar

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


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


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 14 Queries | GZIP : On ]