Delphi-PRAXiS

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)

Neutral General 2. Okt 2005 11:43

Re: OpenGL Kamera Problem - Drehung
 
Bitte achte auf meine Delphi Version -.-

Mr_T 2. Okt 2005 12:22

Re: OpenGL Kamera Problem - Drehung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Öhm ... ja, so ein altes Delphi habe ich aber leider nicht :(
Lässt sich der Source denn nicht kompilieren? Ich habe nun einfach mal die EXE dazu angehängt, denn siehste ja, was für eine Kamerasteurung in dem Programm realisiert wurde und den PAS-Source solltest du dir ansehen können mit dem Delphi 3 ... denn der Source funktioniert so einwandfrei, also erst rotieren, denn translaten ;)

Neutral General 2. Okt 2005 12:51

Re: OpenGL Kamera Problem - Drehung
 
Delphi-Quellcode:
procedure Render;
begin
 glClear(GL_COLOR_BUFFER_Bit or GL_DEPTH_BUFFER_BIT);
 glLoadIdentity;
 glpushname(0);

 glrotated(25,0.5,0,0);
 glrotated(180,0.0,1.0,0.0); // Hier setze ich die Position wo die kamera startet.. und genau das ist das problem -.-
 gltranslated(-5,-0.2,0.0);  // wenn ich das weglasse gehts -.-

 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);
Siehe Quelltext... :wall:
Danke nochmal für alles ;)
Aber wo setze ich jetzt die Anfangsposition ?

Mr_T 3. Okt 2005 00:07

Re: OpenGL Kamera Problem - Drehung
 
Also wenn du für dein Spiel oder was das werden soll eine Startposition machen würdest, denn würde es Sinn machen PosX, PosY und rotate beim respawn neu zu setzen bzw. in kleinen Demos (mach ich auch immer so) in OnCreate ... ist am einfachsten und spart ogl-Befehle, die nur Renderpower kosten ;)

Phobeus 3. Okt 2005 12:53

Re: OpenGL Kamera Problem - Drehung
 
Da höre ich wieder das böse Wort mit Shooter. Junge, lass die Finger vom "richtigen 3D Raum" und lasse nicht alle Achsen um 360° rotieren. Das spart eine Menge Mathematik und erleichtert gerade dem Einsteiger eine Menge Frust.
Ansonsten gibt es sicherlich langfristig bessere Möglichkeiten, aber ich werfe hier einfach einmal glulookat in den Raum, dass vielleicht für den Anfang leichter zu verwenden ist, um eine Kamera auszurichten. Dieses direkt nach dem glLoadIdentity aufgerufen, wird so aussehen, wie eine Kamera, die im Raum plaziert wird.

Neutral General 3. Okt 2005 14:33

Re: OpenGL Kamera Problem - Drehung
 
Ach ich muss eh mal sehen. Wahrscheinlich wird das Projekt eh an irgendwas scheitern... Jetzt nicht an der Kamera aber nachher vielleicht an den Kollisionen oder an 3D-Modellen die ich verzweifelt versuchen werde mit irgendwelchen Tutorials einzubinden :mrgreen:
Naja hauptsache ich hab ein bisschen gelernt ... ;)

Ach ja.. glulookat hab ich auch schon probiert... Ich kapier zwar glaube ich wofür die Parameter sind aber meine Kamera guckt trotzdem immer schief xD


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.

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