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

Aktuelle Zeit: Mi Jul 16, 2025 23:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Freie Bewegung in 3D
BeitragVerfasst: Do Mai 06, 2004 18:20 
Offline
DGL Member

Registriert: Mo Apr 05, 2004 19:51
Beiträge: 105
Hallo!

Ich habe eine Frage die auf Anhieb simpel aussieht, bei der Umsetzung dann aber doch wesentlich komplizierter ist als erwartet. Ich hätte gerne eine User/Kamera-Steuerung mit der man sich völlig frei im Raum bewegen kann und zwar im Stile eines Flugsimulators bzw. Descent. Also völlig freie Drehung um alle drei Achsen; Vorwärts- und Seitwärtsbewegung in die Richtung in die man schaut. Das Problem ist, dass sich in jedem Schritt alle drei Drehwinkel (also um x-, y- und z-Achse) ändern können und da sehe ich dann vor lauter sin's und cos's nicht mehr was ich mache. :?
Solange man den Benutzer in der Bewegung auf eine Ebene beschränkt ist ja noch alles ganz einfach, aber wenn man davon ausgeht dass man irgendwie schräg in der Luft hängt, dann um die eigene Achse rotiert und nach oben "fliegt", wird's chaotisch...

Eine Idee wäre, alles über Matrizen zu machen, aber dann kommt man in das Problem dass bei jeder Usereingabe die Matrix mit einer neuen Matrix multipliziert werden muss was dann mit der Dauer mit Sicherheit zu sehr unschönen Effekten führt (Verzerrung?).

Hat jemand schon einmal so etwas programmiert und kann es zur Verfügung stellen? Oder hat jemand einen heissen Tipp wie man so etwas am geschicktesten anstellt?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 06, 2004 18:36 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Quaternionen verwenden - oder doch auf Matrizen zurückgreifen und diese alle paar Frames zu normalisieren und die Achsen normal aufeinander stellen, damit diese nicht degenerieren:

Code:
  1. // ensures that rotation axii in a matrix are orthogonal and have unit length
  2. procedure MatrixOrtho(var M: TMatrix);
  3.  
  4.   var
  5.     xa,
  6.     ya  : TVec;
  7.  
  8.   begin
  9.     xa := VectorCross(TVec(Addr(M.c20)^), TVec(Addr(M.c10)^));
  10.     ya := VectorCross(TVec(Addr(M.c00)^), TVec(Addr(M.c20)^));
  11.     if (xa.x*M.c00 + xa.y*M.c01 + xa.z*M.c02) < 0.0 then begin
  12.       xa.x := - xa.x;
  13.       xa.y := - xa.y;
  14.       xa.z := - xa.z;
  15.     end;
  16.     if (ya.x*M.c10 + ya.y*M.c11 + ya.z*M.c12) < 0.0 then begin
  17.       ya.x := - ya.x;
  18.       ya.y := - ya.y;
  19.       ya.z := - ya.z;
  20.     end;
  21.     M.c00 := xa.x;
  22.     M.c01 := xa.y;
  23.     M.c02 := xa.z;
  24.     M.c10 := ya.x;
  25.     M.c11 := ya.y;
  26.     M.c12 := ya.z;
  27.     VectorNormalize(TVec(Addr(M.c00)^));
  28.     VectorNormalize(TVec(Addr(M.c10)^));
  29.     VectorNormalize(TVec(Addr(M.c20)^));
  30.   end;

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 06, 2004 19:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Quaternionen sind hier die eleganteste Art die Orientierung zu speichern, weil sie die 3 Achsenvektoren sehr kompakt speichern. Wenn man sich z.B. nach rechts oder links dreht, dreht man sich nicht um die normale Achse sondern um den Achsenvektor, den man als oben definiert hat. Bei den anderen Rotationen ist es ähnlich.

So kann man Quaternionen erstellen:

Ein Quaternion q=(x,y,z,w) erstellt man aus einer Achse a und einem Drehwinkel w folgendermaßen:

q=(a.x*sin(w/2),a.y*sin(w/2),a.z*sin(w/2),cos(w/2))

Zwei Quaternionen q1,q2 multipliziert man folgendermaßen:

q3=q1*q2=
(q1.w*q2.w-q1.x*q2.x-q1.y*q2.y-q1.z*q2.z,
q1.w*q2.x+q1.x*q2.w+q1.y*q2.z-q1.z*q2.y,
q1.w*q2.y+q1.y*q2.w+q1.z*q2.x-q1.x*q2.z,
q1.w*q2.z+q1.z*q2.w+q1.x*q2.y-q1.y*q2.x)

Für das Rendern konvertiert man das Quaternion dann in eine Matrix in OpenGL Reihenfolge:

(1-2*(q.y*q.y+q.z*q.z),2*(q.x*q.y-q.z*q.w),2*(q.x*q.z+q.y*q.w),0,2*(q.x*q.y+q.z*q.w),1-2*(q.x*q.x+q.z*q.z),2*(q.y*q.z-q.x*q.w),0,2*(q.x*q.z-q.y*q.w),2*(q.y*q.z+q.x*q.w),1-2*(q.x*q.x+q.y*q.y),0,0,0,0,0)


Eine sehr viel einfachere Möglichkeit ist, direkt die OpenGL Matrizen zu benutzen und die Matrix nicht bei jedem Frame neuzusetzen, sondern bei Bewegungen immer nur mit glRotate zu drehen und mit glTranslate zu verschieben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 06, 2004 19:59 
Offline
DGL Member

Registriert: Mo Apr 05, 2004 19:51
Beiträge: 105
Vielen Dank für die Antworten, das hilft mir schon deutlich weiter.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 07, 2004 07:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Schau mal bei den Tutorials vorbei. Hab mal was zu dem Thema verfasst...

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Majestic-12 [Bot] 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]