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

Aktuelle Zeit: Fr Jul 18, 2025 21:05

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mathe bzgl. Rotation
BeitragVerfasst: So Feb 29, 2004 13:47 
Offline
DGL Member

Registriert: So Feb 29, 2004 12:59
Beiträge: 2
Hallo,

ich möchte mich völlig frei im Raum bewegen. Dazu habe ich einen Punkt und drei normalisierte Vektoren (Position der Kamera, "X,Y,Z-Achsen-Vektoren" = also die Ausrichtung der Kamera).
Nun möchte ich mich drehen und habe dazu einen Matrix zur freien Rotation um eine beliebige Achse im freien Raum erstellt.
Dann habe ich Matrix für Vektorkomponenten gelöst:
Code:
  1. result.x := -(NCOSDW-1)*xa*x*x-(NCOSDW-1)*x*(ya*y+za*z)+NSINDW*za*y-NSINDW*ya*z+NCOSDW*xa;
  2.  
  3. result.y := x*(-(NCOSDW-1)*xa*y-NSINDW*za)-(NCOSDW-1)*ya*y*y-(NCOSDW-1)*za*y*z+NCOSDW*ya;
  4.  
  5. result.z := x*(NSINDW*ya-(NCOSDW-1)*xa*z)+y*(-(NCOSDW-1)*ya*z-NSINDW*xa)-za*((NCOSDW-1)*z*z-NCOSDW);

Die Sinus- und Cosinus-Winkel sind vorberrechnt. Result ist der neue Vektor; Xa, Ya und Za ist der alte Vektor.
X, Y, Z ist Achse um die gedreht werden soll.

Diese Funktion funktioniert auch, aber die Drehgeschwindigkeit schwankt sehr stark und kommt teilweise zum Stillstand.
Warum haut das nicht hin, die Matrix ist richtig und ich habe sie auch richtig aufgelöst. Was ist falsch oder hat jemand eine bessere Möglichkeit sich frei im Raum zu bewegen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 29, 2004 15:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich wühl mich nur sehr ungern durch solche unübersichtlichen Konstrukte, deshalb poste ich mal wie ich den Freelook/Move-Modus in meinen Demos realisiert habe :

Code:
  1. Position.x := Position.z+TimeFactor*Sin(DegToRad(Direction.y))*Dir;
  2. Position.y := Position.y-TimeFactor*Sin(DegToRad(Direction.x))*Dir;
  3. Position.z := Position.z-TimeFactor*Cos(DegToRad(Direction.y))*Dir;
  4.  

Funzt einwandfrei und auch die Drehgeschwindigkeit macht hier keine Probleme. Bei deiner Sache tippe (definitiv kann ichs nicht sagen) mal auf den Gimbal-Lock, zu dessen Vermeidung man AFAIK Quaternionen zur Repräsentation von Rotationen verwenden muss. Da ich aber auf dem Gebiet kein Experte bin ist das nur ne Vermutung.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 29, 2004 17:28 
Offline
DGL Member

Registriert: So Feb 29, 2004 12:59
Beiträge: 2
Ich habe mir auch gedacht das es irgendwelche Ungenauigkeiten oder Rundungsfehler sein müßten. Die Formel ist schon ganz schon wirr, aber was soll man machen wenn man nicht weiß wie es sonst gehen könnte.
Ich habe gerade mal dein Quelltext ausprobieren wollen, aber ihn nicht ganz verstanden. Was sind welche Variablen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 29, 2004 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich dachte eigentlich die Variablennamen seien aussagekräftig genug, aber trotzdem :
  • Position = 3-Komponentenvektor, Position des Betrachters
  • Direction = 3-Komponentenvektor, Blickwinkel des Spielers
  • Timefactor = Zeitfaktor für Timebased-Movement
  • Dir = Gibt an ob sich der Spieler vorwärts (Dir=1) oder rückwärts (Dir=-1) bewegt

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 29, 2004 18:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es ist zwar nicht die beste Lösung, aber um zu prüfen ob die Matrix richtig ist, kann man auch mit glRotate die Einheitsmatrix um eine Achse rotieren lassen und danach mit glGetDoublev auslesen.
Bei der völlig freien Drehung dreht man sich nicht um die Achsen der Welt sondern um seine eigenen Achsen, falls du das meinst. Man multipliziert dann die Achsenvektoren der Kamera mit der Rotationsmatrix. Die Rotationsmatrix um eine beliebige Achse kann man so berechnen:

Zuerst erstellt man aus der Achse und dem Rotationsvektor ein Quaternion. Nachzulesen auf http://www.gamedev.net/reference/articles/article1691.asp


Code:
  1. quat.x:=Achse.x*sin(winkel/2);
  2. quat.y:=Achse.y*sin(winkel/2);
  3. quat.z:=Achse.z*sin(winkel/2);
  4. quat.w:=cos(winkel/2);

Aus dem Quaternion wird dann die Matrix erstellt:

Code:
  1. Matrix[0]:=1-(2*sqr(quat.y)+2*sqr(quat.z));
  2. Matrix[1]:=2*quat.x*quat.y-2*quat.z*quat.w;
  3. Matrix[2]:=2*quat.x*quat.z+2*quat.y*quat.w;
  4.  
  5. Matrix[4]:=2*quat.x*quat.y+2*quat.z*quat.w;
  6. Matrix[5]:=1-(2*sqr(quat.x)+2*sqr(quat.z));
  7. Matrix[6]:=2*quat.y*quat.z-2*quat.x*quat.w;
  8.  
  9. Matrix[8]:=2*quat.x*quat.z-2*quat.y*quat.w;
  10. Matrix[9]:=2*quat.y*quat.z+2*quat.x*quat.w;
  11. Matrix[10]:=1-(2*sqr(quat.x)+2*sqr(quat.y));

Den Vektor multipliziert man dann so mit der Matrix:

Code:
  1. v_.x:=Matrix[0]*v.x+Matrix[4]*v.y+Matrix[8]*v.z;
  2. v_.y:=Matrix[1]*v.x+Matrix[5]*v.y+Matrix[9]*v.z;
  3. v_.z:=Matrix[2]*v.x+Matrix[6]*v.y+Matrix[10]*v.z;


Falls man wie in den meisten 3D Shooter läuft und nicht z.B. fliegt, reicht die ganz normale Drehung die SoS gezeigt hat aus. Dann braucht man auch keine 3 Achsen sondern nur 2 oder 3 Winkel für die Kamera.
[/url]


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.008s | 15 Queries | GZIP : On ]