![]() |
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) |
Re: OpenGL Kamera Problem - Drehung
Bitte achte auf meine Delphi Version -.-
|
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 ;) |
Re: OpenGL Kamera Problem - Drehung
Delphi-Quellcode:
Siehe Quelltext... :wall:
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); Danke nochmal für alles ;) Aber wo setze ich jetzt die Anfangsposition ? |
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 ;)
|
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 ![]() |
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