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

Aktuelle Zeit: Di Mai 21, 2024 11:28

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Camerarotation: Vektoren aus Winkeln
BeitragVerfasst: Fr Okt 19, 2007 07:39 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi, ich habe vor kurzem mein Cameramovement auf gluLookat umgestellt. Vorher hab ich das ueber ein Translate und zwei Rotates je eines um die x- und eins um die y-Achse gemacht, jetzt nutz ich halt die GluLookat.

Position hab ich ja, Normalenvektor hab ich auch, jetz brauch ich nur noch den Lookatvektor. Den errechne ich aus der Position und den beiden rotationsvektoren, mit der folgenden Rechnung:

Code:
  1.     Rotation[0] := Rotation[0] - YRel/10;
  2.     Rotation[1] := Rotation[1] - XRel/10;
  3.    Rot[0] := cos(Rotation[1]*DEG2RAD);
  4.    Rot[1] := sin(Rotation[0]*DEG2RAD);
  5.    Rot[2] := cos(Rotation[0]*DEG2RAD)+sin(Rotation[1]*DEG2RAD);
  6.  
  7.    Rot := Addvector(Rot, Translation);


Die Rotation an sich funktioniert ganz gut, nur irgendwie dreht er sich auf eine sehr obskure Weise, sobald ich direkt unter mich gucke, also mit etwa mit einem LookAtVector von (0,-1,0)


Laesst sich irgendwie nich so leicht beschreiben, ich hoff mal, ihr wisst, was ich mein.

Vllt hat da ja auch wer ne ahnung, wie man den LookAtVector fuer gluLookAt ausrechnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 08:57 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Dieses seltsame Verhalten liegt an Deinem Up-Vektor. Die Kamera sieht ja in richtung eye->center. und wo 'oben' ist, bestimmt up. Wenn jetzt eye->center winkelmäßig nahe an up liegt (delta phi <<1), verhaut er sich. Wenn Du 'nach unten' oder 'nach oben' schauen willst, musst Du up nachziehen. Das gleiche gilt für Loopings und so.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 21, 2007 13:12 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Würde es ausreichen den Upvektor als Normalenvektor aus Position und Eye zu errechnen? Würd mir soauf anhieb einfallen, oder muss man da einen erheblichen Mehraufwand betreiben?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 22, 2007 11:15 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Du musst erst aus dem alten Up und eye->center das Kreuzprodukt bilden für einen Hilfsvektor. Diesen kehrst Du dann um(Richtungsmäßig) und berechnest daraus und eye->center den neuen up (wieder kreuzprodukt). Umdrehen musst du den Hilfsvektor, da sich sonst der Upvektor umdreht und das würde dann zu lustigen Anzeigeeffekten führen.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Okt 24, 2007 08:16 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also ich habe letztlich doch wieder von gluLookAt abgelassen und bin wieder bei Rotate und Translate... es ist ein dauerndes Hin und Her

Eigentlich wollte ich auf Matrizen gehen, aber ich bekomm es nimmer hin.... keine Ahnung, warum das bei mir nich mehr geht, zumal ich mal ne funktionierende Version hatte.

Nun bin ich jedenfalls bei Translate und Rotate, weil man das gut nachvollziehen kann.

Hier ist erstmal das Projekt: Camera.zip

Ich hab an meine Camera mal eine Pfadverfolgung angebunden. Die Camera soll sich also auf den folgenden Punkten bewegen:
Code:
  1.   pfad.AddPoint(Unite(-1,1,1));
  2.   pfad.AddPoint(Unite(1,1,1));
  3.   pfad.AddPoint(Unite(1,1,-1));
  4.   pfad.AddPoint(Unite(-1,1,-1));


Sie bewegt sich also auf einem Quadrat um den Nullpunkt (0,0,0) und dreht sich dabei immer so weiter, dass die Camera direkt auf den Nullpunkt schaut.


Wenn ihr euch die Demo anseht, werdet ihr zwei Probleme feststellen:

Das ding flackert ziemlich; warum weiss ich nicht.

Sobald es einen Winkel von -45° etwa ueberschreitet, verändert sich der Punkt, auf den die Camera gerichtet ist, das heisst, sie schaut nicht mehr in den Nullpunkt, sondern auf irgendeinen Punkt um die (0,0,-1) oder sowas.



Ich sitz schon ne ganze weile dran und hab keine Ahnung, warums nicht geht.
Meine Updatefunktion der Camera fuer die Pfad berechnung lautet wie folgt:

Code:
  1. procedure TSE_Camera.Update;
  2. var distance, nX, nY: Single;
  3.     v1: TGLVectorf3;
  4. begin
  5.   case fMoveMode of
  6.     mmFree:
  7.     begin
  8.           // nothing
  9.     end;
  10.  
  11.     mmPath:
  12.     begin
  13.       distance := MMSpeed * Renderer.CurTime/1000;
  14.       if distance > MovePath.PathLength then
  15.       begin
  16.         fMoveMode := mmFree;
  17.         fLookMode := lmFree;
  18.       end;
  19.       Translation := MovePath.GetPos(distance);
  20.     end;
  21.  
  22.     mmAttachedToObject:
  23.     begin
  24.  
  25.     end;
  26.  
  27.     mmCircleAroundObject:
  28.     begin
  29.  
  30.     end;
  31.   end;
  32.  
  33.   case fLookMode of
  34.     lmFree:
  35.     begin
  36.           // nothing
  37.     end;
  38.  
  39.     lmPath:
  40.     begin
  41.       distance := LMSpeed * Renderer.CurTime/1000;
  42.       v1 := SubtractVector(LookPath.GetPos(distance),Translation);
  43.  
  44.       nX := DotProductVector(v1,Unite(v1[0],0,v1[2])) / (LengthOfVector(v1)*LengthOfVector(Unite(v1[0],0,v1[2])));
  45.       nY := DotProductVector(v1,Unite(0,v1[1],v1[2])) / (LengthOfVector(v1)*LengthOfVector(Unite(0,v1[1],v1[2])));
  46.  
  47.       nX := Arccos(nX)/DEG2RAD;
  48.       nY := Arccos(nY)/DEG2RAD;
  49.  
  50. //      WriteLn(floattostr(v1[0])+' '+floattostr(v1[1])+' '+floattostr(v1[2]));
  51.  
  52.  //     if IsNan(nX)=FALSE then
  53.  //     begin
  54.         if Translation[1] < LookPath.GetPos(distance)[1] then
  55.           Rotation[0] :=   nX
  56.         else
  57.           Rotation[0] := - nX;
  58.  //     end;
  59. //      if IsNan(nY)=FALSE then
  60. //      begin
  61.         if Translation[0] > LookPath.GetPos(distance)[0] then
  62.           Rotation[1] :=   nY
  63.         else
  64.           Rotation[1] := - nY;
  65.  
  66.       WriteLn(floattostr(Rotation[0])+' '+floattostr(Rotation[1])+' '+floattostr(Rotation[2]));
  67. //      end;  }


Ich steig nimmer durch, wo nun der mathematische oder logische fehler ist, vllt findet ihn ja einer von euch

danke schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 14, 2007 09:24 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ja also ich habe mich in einigen Foren (DSDT und Delphiforum) sowie bei diversen Tuts schlau gemahct und hab meine Camerarotation versucht, auf Kugelkoordinaten umzubauen. Soweit so gut. Das folgende Tutorial beschreibt es im Grunde recht gut: http://mo.mathematik.uni-stuttgart.de/i ... ussage441/

allerdings funktioniert es partout nicht so, wie ich das gern haette. meine rotation sieht jetzt folgendermaßen aus:
Code:
  1.  
  2. var
  3.     distance, r, delta, phi: Single;
  4.     v1: TGLVectorf3;
  5.     begin
  6.        // bestimmung des momentanen Punktes auf dem Pfad
  7.       distance := LMSpeed * Renderer.CurTime/1000;
  8.       // differenzvektor zwischen Blickpunkt (Lookpath.getpos) und Position (translation)
  9.       v1 := SubtractVector(LookPath.GetPos(distance),Translation);
  10.  
  11.       r := LengthofVector(v1);
  12.       phi := arctan(v1[Y]/v1[X]);
  13.       delta := arccos(v1[Z]/r);
  14.  
  15.       if v1[X]=0 then phi := sign(v1[Y])*PI/2
  16.       else if v1[X] < 0 then
  17.       begin
  18.         if v1[Y] < 0 then phi := phi - PI
  19.         else phi := phi + PI;
  20.       end;
  21.  
  22.         Rotation[Y] := phi/DEG2RAD;
  23.         Rotation[X] := delta/DEG2RAD;


Ich hoffe, die mathematisch etwas Versierteren können mir helfen, ich bin der Verzweiflung sehr nahe.. danke schonmal


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.033s | 19 Queries | GZIP : On ]