Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi OpenGL Kamera Problem - Drehung (https://www.delphipraxis.net/54076-opengl-kamera-problem-drehung.html)

Neutral General 27. Sep 2005 15:27


OpenGL Kamera Problem - Drehung
 
Ich glaube Kamera-Probleme mit OpenGl sind nicht so selten :mrgreen:
Also. Ich habe ne kleine, texturierte Ebene gebaut. Man kann sich auch bewegen und so und auch mit der Maus die Kamera drehen. NUR : Das Problem ist das man sich (scheinbar) nicht um seine eigene Axe dreht sondern um einen bestimmten Punkt kreist. Wie kann man sich "richtig" drehen ?

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if x < 50 then begin
  mauspos := 1; // = Integer
 end
 else
 if x > Form1.ClientWidth -50 then begin
  MausPos := 2;
 end
 else MausPos := 0;
end;
Delphi-Quellcode:
procedure Render;
begin
...
if Mauspos = 1 then begin
  Grad := Grad - (0.5 * timefactor); // Timefactor : Double = 20/40;
 end;
 if Mauspos = 2 then begin
  Grad := Grad + (0.5 * timefactor);
 end;
glrotated(Grad,0,1,0);
...
end;
Naja ich gestehe das ich die Techniken aus nem Tutorial habe aber viel anders gehts eh nicht...
und verstanden hab ichs auch ;)

Sidorion 27. Sep 2005 15:53

Re: OpenGL Kamera Problem - Drehung
 
Der Trick besteht darin, dass IMMER um den aktuellen Koordinatenursprung gedreht wird. Du musst also vor dem Drehen dafür sorgen, dass der Koordinatenursprung mit der Kameraposition übereinstimmt (mit glTranslatef), dann drehen, dann die Verschiebung rückgängig machen (wieder glTranslatef).

Neutral General 27. Sep 2005 15:54

Re: OpenGL Kamera Problem - Drehung
 
Ja sowas hab ich mir auch gedacht, das ich dann die Koordinaten ändern muss und danach zurücksetzten und so nur ich wusste nicht wohin ich translaten soll.. :(
Und ich weiß es immernoch nicht :mrgreen:

Speedmaster 27. Sep 2005 16:03

Re: OpenGL Kamera Problem - Drehung
 
Warum drehst du nicht im GL_Projection Modus? Ich empfehle dir übrigens eher da zu fragen: www.delphigl.com

Neutral General 27. Sep 2005 16:55

Re: OpenGL Kamera Problem - Drehung
 
ok thx ich werds ma probieren bzw fragen :)

Mr_T 1. Okt 2005 10:24

Re: OpenGL Kamera Problem - Drehung
 
Also in der Regel steht die Kamera ja immer im Uhrsprung ... deshalb muss auch um den Uhrspung gedreht werden, wenn eine brauchbare Kameradrehung hinbekommen will.
Das Ergebniss: man muss immer als erstes alle rotate-befehle ausführen, die irgendwie zu der Kamera gehören und dann zu dem Punkt, wo die Kamera stehen soll translaten (die Kamera bewegt sich ja an sich nicht, sondern die Objekte vor die Kamera) ...
Macht man es andersrum, also erst translaten und dann rotieren, so rotiren alle ab dann gezeichneten Objekte um den Punkt drum zu du dem Translated wurde ... ganz simpel alles an sich :)

Neutral General 1. Okt 2005 16:06

Re: OpenGL Kamera Problem - Drehung
 
Delphi-Quellcode:
 if Mauspos = 1 then begin
  Grad := Grad - (0.3* timefactor);
 end;
 if Mauspos = 2 then begin
  Grad := Grad + (0.3* timefactor);
 end;

 if GetAsyncKeystate(Ord('W')) <> 0 then begin
   PosX := PosX + sin(degtorad(Grad)) * 0.1 * Timefactor;
   PosZ := PosZ - cos(degtorad(Grad)) * 0.1 * Timefactor;
 end
 else
 if GetAsyncKeystate(Ord('S')) <> 0 then begin
   PosX := PosX - sin(degtorad(Grad)) * 0.1 * Timefactor;
   PosZ := PosZ + cos(degtorad(Grad)) * 0.1 * Timefactor;
 end;

 glTranslated(PosX,0,PosZ);
 glrotated(Grad,0,1,0);
Ich verzweifele... ist das etwa nicht zuerst translated und dann rotated ?? -.-
Bitte zeigt mir wie das geht :cry:
Ich verzweifle -.-

Mr_T 1. Okt 2005 18:51

Re: OpenGL Kamera Problem - Drehung
 
Ja eben ... nur die Kamera sitzt immer im Uhrsprung, deshalb darfst du nicht translaten, sondern musst erst rotieren ;)
Versuchs also mal so:

Delphi-Quellcode:
if Mauspos = 1 then begin
  Grad := Grad - (0.3* timefactor);
end;
if Mauspos = 2 then begin
  Grad := Grad + (0.3* timefactor);
end;

if GetAsyncKeystate(Ord('W')) <> 0 then begin
   PosX := PosX + sin(degtorad(Grad)) * 0.1 * Timefactor;
   PosZ := PosZ - cos(degtorad(Grad)) * 0.1 * Timefactor;
end
else
if GetAsyncKeystate(Ord('S')) <> 0 then begin
   PosX := PosX - sin(degtorad(Grad)) * 0.1 * Timefactor;
   PosZ := PosZ + cos(degtorad(Grad)) * 0.1 * Timefactor;
end;

glrotated(Grad,0,1,0);
glTranslated(PosX,0,PosZ);
Das sollte denn Klappen :)

Neutral General 1. Okt 2005 19:22

Re: OpenGL Kamera Problem - Drehung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Passt auf.. ich glaube so langsam ihr versteht mich nicht xD

Schaut euch das ma an.. Es soll so wie bei nem normalen Ego-Shooter sein..

Mr_T 1. Okt 2005 19:49

Re: OpenGL Kamera Problem - Drehung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Doch doch, das war mir schon vorher klar ;)
Deshalb kannste mir auch ruhig glauben: das sollte so wie ich es sagte Funktionieren an sich mit dme drehen ...
hier mal n Stückchen Source von nem kleinen Demo, das ich selber geschrieben hab

Delphi-Quellcode:
if rdir = 1 then
begin
rot := rot-5*timefactor;
end;

if rdir = 2 then
begin
rot := rot+5*timefactor;
end;

if getasynckeystate(vk_up) <> 0 then
begin
my_x := my_x-0.4*sin(degtorad(rot))*timefactor;
my_y := my_y+0.4*cos(degtorad(rot))*timefactor;
end;

if getasynckeystate(vk_down) <> 0 then
begin
my_x := my_x+0.4*sin(degtorad(rot))*timefactor;
my_y := my_y-0.4*cos(degtorad(rot))*timefactor;
end;

if getasynckeystate(vk_right) <> 0 then
begin
my_x := my_x+0.2*sin(degtorad(rot-90))*timefactor;
my_y := my_y-0.2*cos(degtorad(rot-90))*timefactor;
end;

if getasynckeystate(vk_left) <> 0 then
begin
my_x := my_x+0.2*sin(degtorad(rot+90))*timefactor;
my_y := my_y-0.2*cos(degtorad(rot+90))*timefactor;
end;

...

glrotate(rot,0,1,0);
gltranslate(my_x,-1.1,my_y);
Also genau das gleiche: erstmal rotieren (um den ursprung halt) und dann verschieben .. geht einwandfrei ;)
NUr dmait man mir auch glaubt: der ganze Source und das Programm selber im Anhang ^^ (ist ein Delphi 2005 Personal Source ... lässt sich aber auch mit Delphi 5 kompilieren ... ich denke damit auch mit allen Versionen dazwischen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz