Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   [OpenGl] Anfängerfrage - Rechteck bewegen (https://www.delphipraxis.net/159700-%5Bopengl%5D-anfaengerfrage-rechteck-bewegen.html)

SunSet 8. Apr 2011 15:31

[OpenGl] Anfängerfrage - Rechteck bewegen
 
Hallo,
ist ja schon fast peinlich aber ich bekomme es einfach nicht hin ein Rechteck per Pfeiltasten zu bewegen. Also ich habe ein ganz einfaches Rechteck gezeichnet:
Delphi-Quellcode:
Glbegin(gl_quads);
 gltexcoord2f(0,0);
 glVertex3f( 2 , -1.9, -5);
 gltexcoord2f(0,1);
 glVertex3f( 1 , -1.9, -5);
 gltexcoord2f(1,1);
 glVertex3f( 1 , -2, -5);
 gltexcoord2f(1,0);
 glVertex3f( 2 , -2, -5);
glend;
Soweit ist das ja kein problem, das Bewegen habe ich wie folgt versucht zu realisieren:
Delphi-Quellcode:
if Ord(Key) = vk_left then begin
 Glbegin(gl_quads);
  gltranslate(-1,0,0);
 glend;
end;
Das ganze steht natürlich im FormKeyDown-Ereignis, klappt aber nicht. Ich hab einiges dazu gelesen und mir ist aufgefallen das gltranslate vor dem zeichnen aufgerufen werden muss, nur ich möchte das Rechteck ja per Pfeiltasten bewegen. Muss ich das Rechteck dann bei jedem Tastendruck neuzeichnen und bewegen oder wie? Ich hoffe ihr versteht wo mein Problem liegt und könnt mir helfen, da ich in Sachen OpenGl noch ein echter Anfänger bin :)

bigben37 8. Apr 2011 15:39

AW: [OpenGl] Anfängerfrage - Rechteck bewegen
 
Hallo SunSet,

das Problem besteht darin, dass das OpenGL Koordinatensystem mit all seinen Transformationen am Anfang jedes Renderns auf seinen Ursprungszustand gesetzt wird. Also verschiebst du bei deinem Klick das Rechteck immer um die gleiche Strecke.
Deshalb nimmst du am besten eine Variable, in der du die Strecke zum verschieben speicherst, diese dann beim Key Event veränderst und dann das Koordinatensystem transformierst und schließlich das Quad zeichnest.

Noch eine Anmerkung: Das Transformieren vor glBegin aufrufen:
Delphi-Quellcode:
procedure Render;
begin
  //Initialisieren ...

  glTranslated(dx, 0, 0); //dx immer im OnKey ändern

  glBegin(GL_QUADS);
  //hier jetzt dein quad
end;

SunSet 8. Apr 2011 15:48

AW: [OpenGl] Anfängerfrage - Rechteck bewegen
 
Danke, klappt :) Nur sieht das ganze ziemlich verzerrt aus wenn ich es bewege, woran liegt das?
DoubleBuffered ist auf true, wobei ich eher denke das es am Timer liegt oder?

bigben37 8. Apr 2011 17:14

AW: [OpenGl] Anfängerfrage - Rechteck bewegen
 
Wenn du im OnKeyDown den Wert der Verschiebung einfach so veränderst, kann es sein dass zwischen 2x rendern unterschiedlich viele mal das Event aufgerufen wird. Deshalb würd ich im OnKeyDown einen boolean setzen, die festhält, dass die taste gedrückt wurde. In deinem Timer überprüfst du dann, ob die variable gesetzt worden ist. Wenn ja, dann die zu verschiebende Strecke ändern und den boolean wieder auf false setzen, damit sich das Quad nur wieder bewegt, wenn der boolean von dem keydown geändert wird.
Falls das jetzt zu kompliziert formuliert war^^:
Delphi-Quellcode:
var
  MoveLeft: Boolean;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_LEFT then
    MoveLeft := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if MoveLeft then
  begin
    dx := dx - 5;
    MoveLeft := false;
  end;
end;

SunSet 8. Apr 2011 17:29

AW: [OpenGl] Anfängerfrage - Rechteck bewegen
 
Ne, haste gut erklärt. Da hast du auch vollkommen Recht, ist ja logisch. :thumb:
Vielen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.

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