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

Aktuelle Zeit: Di Mai 21, 2024 22:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Cameramovement
BeitragVerfasst: Sa Mär 01, 2008 15:47 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi,
ich habe seit einer Weile wieder mal Zeit zum Programmieren und habe so nach und nach meine Todoliste im Projekt abgearbeitet.

Tja und nun stehe ich wiedermal vor meinem Prob, dass ich schon seit nem guten Jahr habe, immer wieder in Angriff nehme und dann aus Verzweiflung doch wieder fallen lasse...
Ich versuche es also wiedereinmal:

Meine Camera besitzt zwei Pfade:
Ein Pfad bezeichnet die Bewegung der Camera.
Der zweite Pfad bezeichnet, wolang die Camera schaut.

Beide Pfade besitzen eine Geschwindigkeit und sind durch eine Kette von Vektoren gekennzeichnet.
Wenn ich die Applikation nun starte, soll die Kamera sich auf dem MovePath bewegen (Translation) und immer auf den richtigen Punkt im LookPath schauen (Rotation).

Die Bewegung funktioniert einwandfrei, nur sobald ich den LookPath einschalte, dreht sich die Kamera wild in irgendwelche Richtungen.
Hier mal der Quellcode:

Code:
  1. procedure TSE_Camera.Update;
  2. var distance, nX, nY,
  3.     r, delta, phi: Single;
  4.     v1: TGLVectorf3;                        
  5. begin
  6.   case fMoveMode of
  7.     mmFree:
  8.     begin
  9.           // nothing
  10.     end;
  11.  
  12.     mmPath:
  13.     begin
  14.       distance := MMSpeed * Renderer.CurTime/1000;
  15.       if distance > MovePath.PathLength then
  16.       begin
  17.         fMoveMode := mmFree;
  18.         fLookMode := lmFree;
  19.       end;
  20.       Translation := MovePath.GetPos(distance);
  21.     end;
  22.  
  23.     mmAttachedToObject:
  24.     begin
  25.  
  26.     end;
  27.  
  28.     mmCircleAroundObject:
  29.     begin
  30.  
  31.     end;
  32.   end;
  33.  
  34.   case fLookMode of
  35.     lmFree:
  36.     begin
  37.           // nothing
  38.     end;
  39.  
  40.     lmPath:
  41.     begin
  42.       distance := LMSpeed * Renderer.CurTime/1000;
  43.       v1 := SubtractVector(LookPath.GetPos(distance),Translation);
  44.       WriteLn(floattostr(v1[0])+' '+floattostr(v1[1])+' '+floattostr(v1[2]));
  45.  
  46.  
  47. //// HIER hab ich mal Kugelkoordinaten versucht, ging aber im Grunde auch nicht /////
  48. {
  49.       r := LengthofVector(v1);
  50.       phi := arctan(v1[X]/v1[Z]);
  51.       delta := arccos(v1[Y]/r);
  52.  
  53.       if v1[Z]=0 then phi := sign(v1[X])*PI/2
  54.       else if v1[Z] < 0 then
  55.       begin
  56.         if v1[X] < 0 then phi := phi - PI
  57.         else phi := phi + PI;
  58.       end;
  59.         Rotation[Y] := phi/DEG2RAD;
  60.         Rotation[X] := delta/DEG2RAD;
  61. }
  62. /// ENDE Kugelkoordinaten
  63.      
  64.  
  65.       nX := DotProductVector(v1,Unite(v1[X],0,v1[Z])) / (LengthOfVector(v1)*LengthOfVector(Unite(v1[X],0,v1[Z])));
  66.       nY := DotProductVector(v1,Unite(0,v1[Y],v1[Z])) / (LengthOfVector(v1)*LengthOfVector(Unite(0,v1[Y],v1[Z])));
  67.  
  68.       nX := Arccos(nX)/DEG2RAD;
  69.       nY := Arccos(nY)/DEG2RAD;      
  70.  
  71.  
  72.           Rotation[X] :=   nX;
  73.  
  74.           Rotation[Y] :=   nY;
  75.     end;
  76.  
  77.     lmAsObject:
  78.     begin
  79.  
  80.     end;
  81.  
  82.     lmAtObject:
  83.     begin
  84.  
  85.     end;
  86.   end;
  87.   Frustum.Calculate;
  88. end;



Wie man im Quellcode sieht, habe ichs auch schonmal ueber Kugelkoordinaten mit hilfe eines Tuts versucht, aber das hat nicht so funktioniert, wie ich das gern gehabt hätte.
Die andere Methode hab ich mir selbst mit meinem spärlichen Wissen über Vektoren zusammengeschußtert.

Beide funktionieren wie gesagt nicht richtig. Ich wäre äußerst dankbar fuer einen Lösungsansatz - dabei ist es mir gleich, ob es sich um Lösung für eine der beiden oben genannten Ansätz oder einen völlig neuen handelt.

Bitte - ich kann die hilfe echt brauchen :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 01, 2008 22:42 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
hast du dir mal die Funktion gluLookAt angesehen?

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 03, 2008 15:58 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Jap hab ich, hatte ich auch schon, is ja auch im grunde eine sehr einfache lösung.

Das problem, was ich damit jedes mal hatte, war, dass ich meine Kamera logischerweise auch manuell, also von einem Pfad losgelöst, sich bewegen lassen können will. Ich klicke also irgendwo mit der Maus, halte die Taste gedrueckt und drehe mich. Da muesste ich permanent einen neuen Punkt im Raum ausrechnen, auf den ich gucke und das alles nur aus den X und Y Koordinaten auf die ich die Maus ziehe.

Da müsste ich ja irgendwie mit eine Projekt/Unprojektfunktion arbeiten, aber ich weiss partout nicht, wie ich auf diesen neuen Lookat punkt kommen soll..

Danke schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 03, 2008 16:48 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Na das ist doch der Kummer kleinster. Du hast nen Kamerapunkt und ne Blickrichtung. Danach ist der Center punkt Positionsvektor+Richtungsvektor. Die Länge der Richtung spielt hierbei keine Rolle.

_________________
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: Di Mär 04, 2008 12:26 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
das ist es ja. ich habe keine blickrichtung ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 04, 2008 13:10 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
wieso? die ergibt sich doch aus der Mausbewegung. Aktueller Punkt-MouseDown Punkt=Blickrichtung.

_________________
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: Di Mär 04, 2008 13:25 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
ja aber ich bewege die maus nach links/rechts und oben/unten also habe ich lediglich einen X und einen Y wert. ich habe keinen 3 dimensionalen wert, dann waer das ja alles einfach. aber ich muss jetz praktisch mit diesem x und y wert eine richtung errechnen und das ist eben ziemlich schwer


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 04, 2008 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
glRotate reicht da vollkommen.

Ich benutze sowas hier:

Code:
  1. procedure TForm1.SetCamera(Translate: Boolean);
  2. begin
  3.   glRotatef(XRot, 1, 0, 0);
  4.   glRotatef(YRot, 0, 1, 0);
  5.   glRotatef(ZRot, 0, 0, 1);
  6.   if Translate then
  7.     glTranslatef(-Position[0], -Position[1], -Position[2]);
  8. end;
  9.  


Wobei ZRot meist auf 0 ist.

Die Rotationswerte werden im OnMouseMove Event aus der Differenz der Mausposition zwischen diesem und dem letzten Frame errechnet.

Wenn ich mich nun z.B. per WASD im Raum bewege. Wird ein Vector zusammengesetzt z.B. für Vorwärts

Code:
  1. Richtung := Vector(0,0,-1);

bzw. jede Komponente einzeln, damit man mehrere Tasten gleichzeitig drücken kann.
Code:
  1. Richtung.Z := -1;


Anschliessend mit Vector-drehenden Funktionen um die gleichen Rotationswerte gedreht und inklusive timebased-movement auf die aktuelle Position addiert.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 05, 2008 12:44 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
ja so hatte ich das auch irgendwann schonmal, aberr ich will ja jetz glulookat verwenden, da will ich jetz nich wieder rotates und translates dazwischen haun. Ich möchte im Grunde nur wissen, wie ich auf den neuen Centerpoint komme.

Meine Theorie ist ja, dass ich den Richtungsvektor zwischen eye und dem alten center ausrechne, und dann um die x und y achse drehe, denn winkel bekomme ich ja, ueber die mausbewegung. Nur weiss ich eben nicht, wie genau ich diese Drehung eines Vektors um einen Winkle realisiere.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 05, 2008 12:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Hallo,
hier hab ich ein paar Funktionen, mit denen du einen beliebigen Vektor um die X-, Y-, oder Z-Achse drehen kannst.
Außerdem kannst du mit der ersten Funktion einen Vektor um einen beliebigen anderen Vektor drehen.
Alpha ist der Winkel in Grad.

Code:
  1. Function VectorRotEVector(const vector, EVector: TVector3f; alpha: Single): TVector3f;
  2. Var DSinAlpha, DCosAlpha: Single;
  3. Begin
  4.   DSinAlpha := DSin(alpha);
  5.   DCosAlpha := DCos(alpha);
  6.  
  7.   Result:= ToVector3f( (DCosAlpha + sqr(EVector[0]) * (1 - DCosAlpha))                      * vector[0]  +  (EVector[0] * EVector[1] * (1 - DCosAlpha) - EVector[2] * DSinAlpha) * vector[1]  +  (EVector[0] * EVector[2] * (1 - DCosAlpha) + EVector[1] * DSinAlpha) * vector[2],
  8.                        (EVector[0] * EVector[1] * (1 - DCosAlpha) + EVector[2] * DSinAlpha) * vector[0]  +  (DCosAlpha + sqr(EVector[1]) * (1 - DCosAlpha))                      * vector[1]  +  (EVector[1] * EVector[2] * (1 - DCosAlpha) - EVector[0] * DSinAlpha) * vector[2],
  9.                        (EVector[0] * EVector[2] * (1 - DCosAlpha) - EVector[1] * DSinAlpha) * vector[0]  +  (EVector[1] * EVector[2] * (1 - DCosAlpha) + EVector[0] * DSinAlpha) * vector[1]  +  (DCosAlpha + sqr(EVector[2]) * (1 - DCosAlpha))                      * vector[2]
  10.                      );
  11. End;
  12.  
  13. Function VectorRotXVector(const vector: TVector3f; alpha: Single): TVector3f;
  14. Begin
  15.   Result := ToVector3f( vector[0],
  16.                         DCos(alpha)*vector[1] - DSin(alpha)*vector[2],
  17.                         DSin(alpha)*vector[1] + DCos(alpha)*vector[2]
  18.                       );
  19. End;
  20.  
  21. Function VectorRotYVector(const vector: TVector3f; alpha: Single): TVector3f;
  22. Begin
  23.   Result := ToVector3f( DCos(alpha)*vector[0] + DSin(alpha)*vector[2],
  24.                         vector[1],
  25.                         -DSin(alpha)*vector[0] + DCos(alpha)*vector[2]
  26.                       );
  27. End;
  28.  
  29. Function VectorRotZVector(const vector: TVector3f; alpha: Single): TVector3f;
  30. Begin
  31.   Result := ToVector3f( DCos(alpha)*vector[0] - DSin(alpha)*vector[1],
  32.                         DSin(alpha)*vector[0] + DCos(alpha)*vector[1],
  33.                         vector[2]
  34.                       );
  35. End;

wo DSin = Sin(DegToRad(angle)) und DCos = Cos(DegToRad(angle))

Ich hoffe das hilft dir!

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 05, 2008 14:19 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Hab auch noch ein paar nette Funktionen für Dich:Damit kannst Du die Kamera um die angegebenen Winkel rotieren lassen. Die Angaben sind die Winkel um die Achsen Z (Rolle) , X (Looping) und Y (Kurve), bezogen auf Kamera.
Code:
  1. Procedure TCamera.Rotate(_dForward,_dRight,_dUp: GLdouble);
  2. Var
  3.   oDirForward: TGLVector;
  4.   oMatForward: TGLMatrix;
  5.   oDirRight: TGLVector;
  6.   oMatRight: TGLMatrix;
  7.   oDirUp: TGLVector;
  8.   oMatUp: TGLMatrix;
  9.   oDirection: TGLVector;
  10. Begin
  11.   oDirection:=VecSub(oCenter,oEye);
  12.   oDirForward:=VecNormalize(oDirection);
  13.   oDirRight:=VecMultX(oDirForward,oUp);
  14.   oDirUp:=VecMultX(oDirRight,oDirForward);
  15.   If _dForward<>0
  16.   Then Begin
  17.     oMatForward:=VecToRotationMatrix(oDirForward,_dForward);
  18.     oDirection:=vecMult(oDirection,oMatForward);
  19.   End;
  20.   If _dRight<>0
  21.   Then Begin
  22.     oMatRight:=VecToRotationMatrix(oDirRight,_dRight);
  23.     oDirection:=vecMult(oDirection,oMatRight);
  24.   End;
  25.   If _dUp<>0
  26.   Then begin
  27.     oMatUp:=VecToRotationMatrix(oDirUp,_dUp);
  28.     oDirection:=vecMult(oDirection,oMatUp);
  29.   End;
  30.   oCenter:=vecAdd(oEye,oDirection);
  31. End;
  32.  

Dies dient der Rotation der Kamera um sich selber. oCenter, oEye und oUp sind Member meiner Kameraklasse und entsprechen den Parametern für gluLookAt
Hierzu noch ein paar Hilfsfunktionen:
Code:
  1.  
  2. //______________________________________________________________________________
  3. Function MakeVector(_dX,_dY,_dz: GLDouble): TGLVector;
  4. Begin
  5.   Result.X:=_dX;
  6.   Result.Y:=_dY;
  7.   Result.Z:=_dZ;
  8. End;
  9. //______________________________________________________________________________
  10. Function ToRad(_dArcDegree: GLdouble): GLdouble;
  11. Begin
  12.   Result:=_dArcDegree / 180 * Pi;
  13. End;
  14. //______________________________________________________________________________
  15. Function ToDeg(_dArcRad: GLdouble): GLdouble;
  16. Begin
  17.   Result:=_dArcRad *180 / Pi;
  18. End;
  19. //______________________________________________________________________________
  20. Function VecAdd(_oSummand1: TGLVector;_oSummand2: TGLVector): TGLVector;
  21. Begin
  22.   Result:=MakeVector(_oSummand1.X+_oSummand2.X,
  23.                      _oSummand1.Y+_oSummand2.Y,
  24.                      _oSummand1.Z+_oSummand2.Z);
  25. End;
  26. //______________________________________________________________________________
  27. Function VecSub(_oMinuend: TGLVector;_oSubtrahend: TGLVector): TGLVector;
  28. Begin
  29.   Result:=MakeVector(_oMinuend.X-_oSubtrahend.X,
  30.                      _oMinuend.Y-_oSubtrahend.Y,
  31.                      _oMinuend.Z-_oSubtrahend.Z);
  32. End;
  33. //______________________________________________________________________________
  34. Function VecScale(_oVector: TGLVector;_dScalar: GLdouble): TGLVector;
  35. Begin
  36.   Result:=MakeVector(_oVector.X*_dScalar,
  37.                      _oVector.Y*_dScalar,
  38.                      _oVector.Z*_dScalar);
  39. End;
  40. //______________________________________________________________________________
  41. Function VecMult(_oVector1: TGLVector;_oVector2: TGLVector): GLdouble;
  42. Begin
  43.    result := _oVector1.X*_oVector2.X+
  44.              _oVector1.Y*_oVector2.Y+
  45.              _oVector1.Z*_oVector2.Z;
  46. End;
  47. //______________________________________________________________________________
  48. Function VecMult(_oVector: TGLVector;_oMatrix: TGLMatrix): TGLVector;
  49. Begin
  50.   Result.X:=_oMatrix.M[0,0]*_oVector.X+
  51.             _oMatrix.M[1,0]*_oVector.Y+
  52.             _oMatrix.M[2,0]*_oVector.Z+
  53.             _oMatrix.M[3,0];
  54.   Result.Y:=_oMatrix.M[0,1]*_oVector.X+
  55.             _oMatrix.M[1,1]*_oVector.Y+
  56.             _oMatrix.M[2,1]*_oVector.Z+
  57.             _oMatrix.M[3,1];
  58.   Result.Z:=_oMatrix.M[0,2]*_oVector.X+
  59.             _oMatrix.M[1,2]*_oVector.Y+
  60.             _oMatrix.M[2,2]*_oVector.Z+
  61.             _oMatrix.M[3,2];
  62. End;
  63. //______________________________________________________________________________
  64. Function VecMultX(_oVector1: TGLVector;_oVector2: TGLVector): TGLVector;
  65. Begin
  66.   Result:=MakeVector(_oVector1.Y*_oVector2.Z - _oVector1.Z*_oVector2.Y,
  67.                      _oVector1.Z*_oVector2.X - _oVector1.X*_oVector2.Z,
  68.                      _oVector1.X*_oVector2.Y - _oVector1.Y*_oVector2.X)
  69. End;
  70. //______________________________________________________________________________
  71. Function VecNormalize(_oVector: TGLVector): TGLVector;
  72. Var
  73.   dLength: GLdouble;
  74. Begin
  75.   dLength:=Magnitude(_oVector);
  76.   If dLength=0 Then dLength:=1;
  77.   Result:=VecScale(_oVector,1/dLength);
  78. End;
  79. //______________________________________________________________________________
  80. Function VecToRotationMatrix(_oAxis: TGLVector;
  81.                              _dRotation: GLDouble): TGLMatrix;
  82. Var
  83.   c: Double;
  84.   s: Double;
  85. Begin
  86.   c:=cos(_dRotation);
  87.   s:=sin(_dRotation);
  88.   Result.M[0,0]:=c + (1-c)*sqr(_oAxis.X);
  89.   Result.M[0,1]:=(1-c)*_oAxis.X*_oAxis.Y + s*_oAxis.Z;
  90.   Result.M[0,2]:=(1-c)*_oAxis.Z*_oAxis.X - s*_oAxis.Y;
  91.   Result.M[0,3]:=0;
  92.  
  93.   Result.M[1,0]:=(1-c)*_oAxis.X*_oAxis.Y - s*_oAxis.Z;
  94.   Result.M[1,1]:=c + (1-c)*sqr(_oAxis.Y);
  95.   Result.M[1,2]:=(1-c)*_oAxis.Y*_oAxis.Z + s*_oAxis.X;
  96.   Result.M[1,3]:=0;
  97.  
  98.   Result.M[2,0]:=(1-c)*_oAxis.Z*_oAxis.X + s*_oAxis.Y;
  99.   Result.M[2,1]:=(1-c)*_oAxis.Y*_oAxis.Z - s*_oAxis.X;
  100.   Result.M[2,2]:=c + (1-c)*sqr(_oAxis.Z);
  101.   Result.M[2,3]:=0;
  102.  
  103.   Result.M[3,0]:=0;
  104.   Result.M[3,1]:=0;
  105.   Result.M[3,2]:=0;
  106.   Result.M[3,3]:=1;
  107. End;
  108.  

Ach ja, ein paar Typen noch:
Code:
  1.   TGLMatrix=Record
  2.     Case Boolean of
  3.       True: (A: Array[0..15] of GLDouble);
  4.       False: (M: Array[0..3,0..3] of GLDouble);
  5.     // ATTENTION OpenGL stores Column-leading
  6.     // first index is Column, second is Row
  7.     // e.g.: 1st col, 3rd row would be [0,2] not [2,0]
  8.   End;
  9.   TGLVector=Record
  10.    Case Integer Of
  11.     0: (X: GLDouble;
  12.         Y: GLDouble;
  13.         Z: GLDouble);
  14.     1: (Width: GLDouble;
  15.         Depth: GLDouble;                                    
  16.         Height: GLDouble);
  17.     2: (Tilt: GLDouble;
  18.         Roll: GLDouble;
  19.         Pan: GLDouble);
  20.   End;
  21.  

_________________
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: Fr Mär 07, 2008 12:42 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
ok mit matrenos funktionen funktioniert es.

Ich habe nur ein Problem noch. Wenn ich mich nach links/rechts drehe, dann drehe ich mich ja immer um die Y-Achse, deswegen kann ich das fest reinprogrammieren.

Wenn ich aber gewissermaßen meinen Kopf nach oben und Unten neige, drehe ich mich um eine Achse, abhaengig von meiner Position udn meiner Blickrichtung.

Hab mir das mal theoretisch ueberlegt:

Die Achse, um die ich mich drehe, ist eine Normale zu meiner Blickrichtung (Center - Eye) und der Y-Achse (0,1,0). Nun muesste ich ja nur um diese Achse Rotieren. Mein Code dazu sieht so aus:

Code:
  1.  
  2.  // subtract vector subtrahiert automatisch den zweiten vom ersten vector
  3. // Rotation um Y -Achse -> funktioniert
  4.      Center := RotateVectorY(SubtractVector(Eye,Center), XRel*DEG2RAD/10);
  5. // rotation um errechnete Achse -> funktioniert nicht, wie sie soll
  6.       Center := RotateVector(SubtractVector(Eye,Center),CrossProductVector(SubtractVector(Eye,Center),Unite(0,1,0)), YRel*DEG2RAD/10);
  7.  
  8.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 10, 2008 16:03 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
hat hier wer der mathematisch etwas versierteren eine idee?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 10, 2008 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Du rotierst immer um Y? Dann bau dir aus "SubtractVector(Eye,Center)" und dem Vektor (0,1,0) über ein Kreuzprodukt die Achse, die "quer" durch deine Kamera geht. Sprich: Die X-Achse im Ortho-modus. Dann kannst du mit 'VecToRotationMatrix' um diese Achse rotieren.

Wenn ich jetzt nich alles total verpeilt habe :D

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 11, 2008 09:35 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Naja im Grunde mache ich ja genau, was du da beschreibst:

Ich baue ein KreuzProdukt aus SubtractVector(Eye,Center) und Unite(0,1,0) => CrossProductVector(SubtractVector(Eye,Center),Unite(0,1,0)
und dann rotiere ich meinen Vektor daherum => Center := RotateVector(SubtractVector(Eye,Center),CrossProductVector(SubtractVector(Eye,Center),Unite(0,1,0)), YRel*DEG2RAD/10); Bei RotateVector ist der erste Vektor der zu rotierende, der zweite ist der Vektor, um den Rotiert wird und der letzte Wert ist der Winkel


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.034s | 17 Queries | GZIP : On ]