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

Aktuelle Zeit: Sa Jul 12, 2025 22:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: CameraBewegung
BeitragVerfasst: So Aug 26, 2007 02:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab ein paar kleinere mathe probleme.. :)

Ich möchte gern meine Kamera bewegen via gluLookAt.. also habe ich 3 Vektoren: CameraPosition, CameraBlickpunkt und CameraUpVector.

Jetzt will ich gern, mit den Pfeiltasten die Kamera bewegen, aber nur Pan'en, also wenn ich rechts drücke soll die kamera seitlich nach rechts fahren, wenn ich hoch drück soll sie nach oben fahren (nicht nach vorne!) etc.. :)
Sprich, ich muß hierfür einfach CameraPosition und CameraBlickpunkt gleichermaßen verschieben, und da ist das problem.. wie sieht die formel dafür aus?

Die andere bewegung die noch möglich sein muß, um den Blickpunkt herumrotieren via Mausbewegung.. da muß ich ja nur die CameraPosition ändern, aber auch hier hab ich keinen schimmer wie ich das ausrechne :(

(bzw einen schimmer schon, und in der theorie ist es auch simpel... einfach die Position mit dem Up- und RightVektor der Kamera multiplizieren.. aber ich weiß z.B. nicht wie ich an den Right-Vektor rankomme, also wie da die formel aussieht)..


Hilfee~ :)

Aya~~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 09:04 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also beim Seitlich bzw hoch verschieben würde ich folgendermaßen rangehen:
Code:
  1. CamPosVec, CamLookAtVec, CamNormalVec: TGLVector;
  2.  
  3.  
  4. [Achtung Pseudocode]
  5. procedure Form1.OnMouseDown(Key:Word);
  6. var MoveVec:TGLVector;
  7. const MOVESTEP = 0.1;
  8. begin
  9.   MoveVector = MakeVector(0,0,0);
  10.   if Key = SDLK_Right then MoveVector[0] := MOVESTEP;
  11.   if Key = SDLK_Left then MoveVector[0] := -MOVESTEP;
  12.   if Key = SDLK_Up then MoveVector[1] := MOVESTEP;
  13.   if Key = SDLK_Down then MoveVector[1] := -MOVESTEP;
  14.  
  15.   CamPosVec := AddVector(CamPosVec, MoveVector;
  16.   CamLookAtVec := AddVector(CamLookAtVec, MoveVector);
  17. end;
  18.  


So im Grunde müsste die Bewegung ohne Drehung gehen, wenn ich micht nicht völlig irre. Änderst du nur den Positionsvector der Camera, dann bewegst du dich zwar, dein Blick bleibt aber an einem Punkt haften, du drehst also "Den Kopf". Bewegt sich der Blickpunkt um die Gleiche Richtung mit, wie die Kamera selber, dann dreht sich die Kamera nicht.

Die Kamera um einen Punkt zu rotieren ist schon etwas schwerer, und es kann sein, dass ich bei Sin und COs jetz blödsinn schreib \";)\"
Code:
  1. [Achtung Pseudocode]
  2. procedure Form1.OnMouseMove([kenn hier die genaue Parameterliste grad nich auswendig, also pseudo:]RelX,RelY:Word;);
  3. var MoveVec:TGLVector;
  4.       Distance: Single;
  5. const ROTATESTEP = 0.1;
  6. begin
  7.   Distance := LengthOfVector(SubtractVector(CamLookAtVec, CamPosVec));
  8.   if RelX < 0 then // Maus wurde nach links bewegt
  9.   begin
  10.     MoveVec[0] := -Cos(Deg2Rad(ROTATESTEP))*Distance;
  11.     MoveVec[1] := 0;
  12.     MoveVec[2] := Sin(Deg2Rad(ROTATESTEP))*Distance;
  13.   end
  14.   else // Maus wurde nach rechts bewegt
  15.   begin
  16.     MoveVec[0] := Cos(Deg2Rad(ROTATESTEP))*Distance;
  17.     MoveVec[1] := 0;
  18.     MoveVec[2] := Sin(Deg2Rad(ROTATESTEP))*Distance;
  19.   end;
  20.  
  21.   CamPosVec := AddVector(CamPosVec, MoveVector);
  22. end;
  23.  


Man könnte die STelle mit Deg2Rad(ROTATESTEP) natuerlich noch optimieren, aber es geht ja eher um das WIE, wobei ich mir selber nicht vollends sicher bin ^^ hab bisher noch nich viel mit der Funktion gearbeitet und jetzt eher mal meine Ideen geschrieben.

Achja. Die Beispiele sind beide fuer einen NormalenVector der Form (0,n,0) geschrieben, das heisst deine Camera steht immer aufrecht. Das ist im Grunde die Regel und wird selten anders gemacht, aber für denn Fall, dass du deine Camera um die Z-Achse drehen willst, musst du den Normalenvector ändern und dann wird die Ganze Rechnung hier noch ne gute Ecke komplizierter, denn dann kann man den Normalenvector nicht mehr raus lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 26, 2007 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi~

das klappt leider so nicht ganz.. :(

Im grunde genommen möchte ich eine kamera bewegung wie in einem 3D Modeler (z.B. Maya)... irgendwer noch ne idee?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 27, 2007 01:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
http://de.wikipedia.org/wiki/Polarkoordinaten
Aus einem Projekt in C:
Code:
  1.  
  2. #ifndef DEG2RAD
  3. #define DEG2RAD(x) ((x)/180.0*M_PI)
  4. #endif
  5. ...
  6.  
  7.     camPos[0] = r * sin(DEG2RAD(theta)) * cos(DEG2RAD(phi)) + centerPos[0];
  8.     camPos[2] = r * sin(DEG2RAD(theta)) * sin(DEG2RAD(phi)) + centerPos[2];
  9.     camPos[1] = r * cos (DEG2RAD(theta)) + centerPos[1];
  10.  

Beim Kamerasetzen:
Code:
  1.  
  2.     gluLookAt(camPos[0], camPos[1], camPos[2], /* Auge */
  3.                 centerPos[0], centerPos[1], centerPos[2], /* Zentrum */
  4.                 0.0, 1.0, 0.0); /* Upvektor */
  5.  


Mit dem Upvektor musst du aufpassen:
Zitat:
The UP vector must not be parallel to the line of sight from the eye point to the reference point.

Aber damit erzähl ich dir wohl nichts neues.
Ich hatte in dem Projekt die Kamera begrenzt gehabt, dass der Fall nie eintreten kann,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 27, 2007 08:02 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Guck Dir mal meine Antworten hier an. vielleicht hilft's Dir.

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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