![]() |
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:
Naja ich gestehe das ich die Techniken aus nem Tutorial habe aber viel anders gehts eh nicht...
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; und verstanden hab ichs auch ;) |
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).
|
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: |
Re: OpenGL Kamera Problem - Drehung
Warum drehst du nicht im GL_Projection Modus? Ich empfehle dir übrigens eher da zu fragen:
![]() |
Re: OpenGL Kamera Problem - Drehung
ok thx ich werds ma probieren bzw fragen :)
|
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 :) |
Re: OpenGL Kamera Problem - Drehung
Delphi-Quellcode:
Ich verzweifele... ist das etwa nicht zuerst translated und dann rotated ?? -.-
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); Bitte zeigt mir wie das geht :cry: Ich verzweifle -.- |
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:
Das sollte denn Klappen :)
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); |
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.. |
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:
Also genau das gleiche: erstmal rotieren (um den ursprung halt) und dann verschieben .. geht einwandfrei ;)
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); 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. |
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