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

Aktuelle Zeit: Di Jul 08, 2025 00:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kamera Steuerung
BeitragVerfasst: So Apr 30, 2006 12:36 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
Hallo,

ich weiß, dass dieses Thema schon oft behandelt wurde, aber ich habe immer noch ein Problem mit meiner Kamera.

Ich kann mich mit den Pfeiltasten im Raum bewegen und mich mit der Maus umsehen. Dazu rufe ich erst glrotate und dann gltranslate auf. Das bewirkt, dass ich mich zwar um die eigene Achse drehe, aber immer in Richtung der Koordinatenachsen laufe. Wie kann ich mich also wenn ich beispielsweise "links" wirklich nach links bewegen, und nicht entlang der x-Achse?

Hier ein ausschnitt:
Code:
  1.  
  2. procedure TfrmMain.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  3.   Y: Integer);
  4. begin
  5.   glmatrixmode(gl_modelview);
  6.   glloadidentity;
  7.  
  8.     inc(rotate_y,(x-x_alt)); //rotate_x, rotate_y sind glob. Variablen vom Typ integer
  9.  
  10.     inc(rotate_x,(y-y_alt));
  11.  
  12.   glrotatef(-rotate_x*0.1,-1,0,0);
  13.   glrotatef(-rotate_y*0.1,0,-1,0);
  14.   gltranslatef(position_x,position_y,position_z);
  15.  
  16.   x_alt:=x;
  17.   y_alt:=y;
  18. .
  19. .
  20. .
  21. end;
  22.  
  23. procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  24.   Shift: TShiftState);
  25. var
  26.   v,a,b:tvector;
  27. begin
  28.   glmatrixmode(gl_modelview);
  29.   glloadidentity;
  30.  
  31.   if key=vk_escape then application.Terminate
  32.   else if key=vk_left then
  33.     begin
  34.     position_x:=position_x+0.2;
  35.     end
  36.   else if key=vk_right then
  37.     begin
  38.     position_x:=position_x-0.2;
  39.     end
  40.   else if key=vk_up then
  41.     begin
  42.     position_z:=position_z+0.2;
  43.     end
  44.   else if key=vk_down then
  45.     begin
  46.     position_z:=position_z-0.2;
  47.     end;
  48.  
  49.   glrotatef(-rotate_x*0.1,-1,0,0);
  50.   glrotatef(-rotate_y*0.1,0,-1,0);
  51.   gltranslatef(position_x,position_y,position_z);
  52. end;
  53.  



Danke,
-steve


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 12:42 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Such im Forum mal nach: CAD_Template
Das wurde genau zu diesem Zweck gepostet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 30, 2006 19:12 
Offline
DGL Member

Registriert: Sa Apr 29, 2006 12:26
Beiträge: 15
jo, vielen Dank, ich hab's hinbekommen :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 14, 2007 15:36 
Offline
DGL Member

Registriert: So Jan 07, 2007 19:22
Beiträge: 5
Kann nochmal jemand sagen, wie das geht? Hab nämlich im Moment dasselbe Problem und finde hier im Forum nur 3 Threads (darunter der hier und die anderen 2 erwähnen nur das Wort einmal) und in der wiki und auf der Hauptseite finde ich garnichts... :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 14, 2007 15:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
nehmen wir an du willst dich 0.5 nach vorn bewegen das sieht on dich gedreht zu haben so aus ( 0, 0, 0.5 )
und wenn du dich gedreht hast rechnest du diesen vektor einfach so um das er in die richtung zeigt in die du dich gedreht hast

strecke=0.5

z=cos(rotation)*strecke
x=sin(rotation)*strecke

so habs ich es zumindest immer gemacht
das geht solange nur die rotation um Y möglich ist bzw. sich nur dies rotation auf die bewegungsrichtung auswirkt für alles andere solltest du dir das mal anschaun.

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 14, 2007 17:11 
Offline
DGL Member

Registriert: So Jan 07, 2007 19:22
Beiträge: 5
Hab das Tutorial jetzt mal durchgearbeitet, aber leider funktioniert das immer noch nicht so, wie ich das möchte :-\
Das ist im Moment mein Quelltext:
Code:
  1.  
  2. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  3.   Shift: TShiftState);
  4. begin
  5.   keys[key] := true;
  6.  
  7.   UpdateMovement;
  8.  
  9.   if keys[VK_UP] then
  10.     begin
  11.       RotateX:= RotateX-0.8; //Drehung um die x-Achse
  12.       if RotateX > 360 then RotateX:= RotateX-360;
  13.     end;
  14.  
  15.   if keys[VK_DOWN] then
  16.     begin
  17.       RotateX:= RotateX+0.8; //Drehung um die x-Achse
  18.       if RotateX > 360 then RotateX:= RotateX-360;
  19.     end;
  20.  
  21.   if keys[VK_RIGHT] then
  22.     begin
  23.       RotateY:= RotateY+0.8; //Drehung um die y-Achse
  24.       if RotateX > 360 then RotateX:= RotateX-360;
  25.     end;
  26.  
  27.   if keys[VK_LEFT] then
  28.     begin
  29.       RotateY:= RotateY-0.8; //Drehung um die y-Achse
  30.       if RotateX > 360 then RotateX:= RotateX-360;
  31.     end;
  32. end;

Dann meine UpdateMovement-Procedure:
Code:
  1. procedure TForm1.UpdateMovement;
  2. const RotXAxis : TVector3f=(1, 0, 0);
  3.       RotYAxis : TVector3f=(0, 1, 0);
  4.       RotZAxis : TVector3f=(0, 0, 1);
  5. var direction: real;
  6.     LookVec: TVector4f;
  7. begin
  8.   if keys[ord('W')] then direction:= 1
  9.   else if keys[ord('S')] then direction:= -1
  10.   else exit;
  11.  
  12.   LookVec[0]:= 0;
  13.   LookVec[1]:= 0;  
  14.   LookVec[2]:= 1;
  15.   LookVec[3]:= 0;  // W-Wert wird nicht gebraucht
  16.  
  17.   VectorRotate(LookVec, RotZAxis, -degtorad(RotateZ));
  18.   VectorRotate(LookVec, RotYAxis, -degtorad(RotateY));  // LookVektor drehen
  19.   VectorRotate(LookVec, RotXAxis, -degtorad(RotateX));
  20.  
  21.   PosVect[0]:= PosVect[0]+(LookVec[0]* (direction*0.1));
  22.   PosVect[1]:= PosVect[1]+(LookVec[1]* (direction*0.1));
  23.   PosVect[2]:= PosVect[2]+(LookVec[2]* (direction*0.1));
  24. end;

Hab das im Gegensatz zum Tutorial ein bisschen geändert, bei mir ist nicht LookVec[1]:= 1 sonder LookVec[2]:= 1, damit sich die Kamera nach vorne beweget und ich habe RotateVector zu VectorRotate geändert, weil es das erstere in der geometry.pas iwie nicht gibt :?

Dazu habe ich in der Render-Routine glRotatef vor glTranslatef, damit sich die Kamera um sich selbst dreht.

Trotzdem bewegt sich die Kamera immer noch nur auf der Z-Achse..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 15, 2007 09:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jun 20, 2003 13:59
Beiträge: 134
mir sind grad nur ein paar kleine copy and paste fehler aufgefallen aber daran wirds nicht liegen denk ich
könntest du nochmal ein bisschen mehr code posten ( z.B. deine Rendermethode ) in dem hier sieht soweit alles in ordnung aus

Code:
  1.  
  2. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  3. Shift: TShiftState);
  4. begin
  5. keys[key] := true;
  6.  
  7. UpdateMovement;
  8.  
  9. if keys[VK_UP] then
  10. begin
  11. RotateX:= RotateX-0.8;
  12. if RotateX < 0 then RotateX:= RotateX+360;      //<--HIER
  13. end;
  14.  
  15. if keys[VK_DOWN] then
  16. begin
  17. RotateX:= RotateX+0.8;
  18. if RotateX > 360 then RotateX:= RotateX-360;
  19. end;
  20.  
  21. if keys[VK_RIGHT] then
  22. begin
  23. RotateY:= RotateY+0.8;
  24. if RotateY > 360 then RotateY:= RotateY-360;      //<--HIER
  25. end;
  26.  
  27. if keys[VK_LEFT] then
  28. begin
  29. RotateY:= RotateY-0.8;
  30. if RotateY < 0 then RotateY:= RotateY+360;      //<--UND HIER
  31. end;
  32. end;

_________________
ghost-site.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 16:18 
Offline
DGL Member

Registriert: So Jan 07, 2007 19:22
Beiträge: 5
Ok, hab das jetzt doch anders gemacht, hab sowas ähnliches wie in deinem ersten Beitrag gefunden, wenn man mit ganz einfacher Tirgonometrie arbeitet, also die Strecken einfach mit Winkelfunktionen berechnet! Hab das jetzt so gelöst:
Code:
  1. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  2.   Shift: TShiftState);
  3. begin
  4.   if (ssShift in Shift) and (Key = Ord('W')) then y:=y-0.1
  5.   else if (ssShift in Shift) and (Key = Ord('S')) then y:=y+0.1
  6.   else case key of
  7.     ord('W'): begin
  8.                 Z:= Z + Cos(-angley * (PI / 180)) * (0.1);
  9.                 x:= x + Sin(-angley * (PI / 180)) * (0.1);
  10.               end;
  11.     ord('A'):begin
  12.                Z:= Z - Sin(-angley * (PI / 180)) * (0.1);
  13.                x:= x + Cos(-angley * (PI / 180)) * (0.1);
  14.              end;
  15.     ord('S'): begin
  16.                 Z:= Z - Cos(-angley * (PI / 180)) * (0.1);
  17.                 x:= x - Sin(-angley * (PI / 180)) * (0.1);
  18.               end;
  19.     ord('D'): begin
  20.                Z:= Z + Sin(-angley * (PI / 180)) * (0.1);
  21.                x:=x - Cos(-angley * (PI / 180)) * (0.1);
  22.              end;
  23.     VK_UP: anglex:=anglex+1;
  24.     VK_DOWN: anglex:=anglex-1;
  25.     VK_LEFT: angley:=angley-1;
  26.     VK_RIGHT: angley:=angley+1;
  27.   end;
  28. end;


Ich persönlich find das einfacher, als wenn man das mit dieser UpdateMovement-Routine macht :wink:
Trotzdem danke für deine Hilfe Phoenix!


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


Wer ist online?

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