Kamera (1): Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
 
K (Gebrauch der Funktionen:: Artikel mit Pascal Tags formatiert)
Zeile 47: Zeile 47:
  
 
FxRot und FyRot müssen mit 0 initialisiert werden.
 
FxRot und FyRot müssen mit 0 initialisiert werden.
 
+
<pascal>
<b>procedure</b> TExample.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
+
procedure TExample.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 
+
begin
<b>begin</b>
 
 
   //das Ziehen der Szene kann nur bei gedrückter Maustaste passieren
 
   //das Ziehen der Szene kann nur bei gedrückter Maustaste passieren
  <b>if not</b> (FRightMousePressed or FLeftMousePressed) <b>then exit</b>;
+
  if not (FRightMousePressed or FLeftMousePressed) then exit;
  
 
   //ausrechenen um wieviel der Mauszeiger bewegt wurde
 
   //ausrechenen um wieviel der Mauszeiger bewegt wurde
Zeile 66: Zeile 65:
 
   FyStart := Y;
 
   FyStart := Y;
  
   <b>if</b> FRightMousePressed <b>then</b>
+
   if FRightMousePressed then
   <b>begin</b>
+
   begin
     <b>if</b> FxRot <> 0 <b>then</b> FCamera.RotateCamera (FxRot, 0, 0);
+
     if FxRot <> 0 then FCamera.RotateCamera (FxRot, 0, 0);
     <b>if</b> FyRot <> 0 <b>then</b> FCamera.RotateObject (0, FyRot, 0);
+
     if FyRot <> 0 then FCamera.RotateObject (0, FyRot, 0);
 +
  end;
 +
  if FLeftMousePressed then
 +
  begin
 +
    if FxRot <> 0 then FCamera.TranslateCamera (FxRot, 0, 0);
 +
    if FyRot <> 0 then FCamera.TranslateCamera (0, FyRot, 0);
 
   end;
 
   end;
  <b>if</b> FLeftMousePressed <b>then</b>
 
  <b>begin</b>
 
    <b>if</b> FxRot <> 0 <b>then</b> FCamera.TranslateCamera (FxRot, 0, 0);
 
    <b>if</b> FyRot <> 0 <b>then</b> FCamera.TranslateCamera (0, FyRot, 0);
 
  <b>end</b>;
 
 
   Paint;
 
   Paint;
  
 
   FxRot := 0;
 
   FxRot := 0;
 
   FyRot := 0;
 
   FyRot := 0;
<b>end</b>;
+
end;
 
+
</pascal>
 
Dieses Beispiel ist vereinfacht dargestellt und es kann sein, dass man
 
Dieses Beispiel ist vereinfacht dargestellt und es kann sein, dass man
 
daran noch etwas herumspielen muss. Ich habe noch das Mausrad eingesetzt
 
daran noch etwas herumspielen muss. Ich habe noch das Mausrad eingesetzt

Version vom 15. Oktober 2005, 14:50 Uhr

Danke

Nachdem ich viel Zeit damit verbracht habe eine funktionierende Kamera zu bauen und es nun endlich geschafft habe, wollte ich diese Funktionalität auch anderen zur Verfügung stellen. Da mir schon viel geholfen wurde, kann ich so einen Teil meiner "Schuld" zurück zahlen.

Meine Kamera

Die folgend beschriebene Kamera kann sich um alle drei Achsen drehen und sich in allen ebenen bewegen. Der Drehpunkt um den sich die Kamera dreht wird mit dem Aufruf der Prozedur PositionCamera festgelegt. Sollte man diesen Dreh- punkt benötigen (z.B. zum anzeigen eines Koordinatenkreuzes, ...) so kann man auf die property PointOfRotation zugreifen (read only).

Die Kamera kann bis zu zehn Positionen speichern und auch wieder herstellen. (SavePosition, RestorePosition)

Die Kamera kann sich selber zu jeder Zeit unter Beibehaltung der aktuellen Position senkrecht zur Welt ausrichten. (Adjust)

Um sicher zu sein, dass auch alle nötigen Definitionen und Funktionen zur Verfügung stehen habe ich einfach mal einen Großteil meiner Funktionssammlung beigefügt (OpenGLUtil.pas). Diese Funktionen/Prozeduren werden so oder in leicht abgeänderter Form wohl bei jedem OpenGL Programmierer existieren.

Sollte es noch irgendwelche Fragen zu diesem Modul geben so stehe ich gerne zur Verfügung.

Gebrauch der Funktionen:

1. PositionCamera mit Vektoren für Position, Blickrichtung und Ausrichtung aufrufen. Die Blickrichtung gibt auch gleichzeitig den Drehpunkt der Szene an um den dann mit RotateCamera gedreht werden kann.

2. Aufruf der Funktionen RotateCamera und TranslateCamera um die Ausrichtung/Lage der Kamera zu verändern. z.B.:

FRightMousePressed, FLeftMousePressed, FxDelta, FyDelta, FxStart, FyStart, FxRot und FyRot sind als var im aktuellen Modul definiert.

FRightMousePressed und FLeftMousePressed müssen in der Prozedur MouseDown/MouseUp gesetzt werden.

FxRot und FyRot müssen mit 0 initialisiert werden.

procedure TExample.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
   //das Ziehen der Szene kann nur bei gedrückter Maustaste passieren
  if not (FRightMousePressed or FLeftMousePressed) then exit;

   //ausrechenen um wieviel der Mauszeiger bewegt wurde
   FxDelta := FxStart-X;
   FyDelta := FyStart-Y;

   //Rotation anpassen, damit es nicht zu schnell wird
   FxRot := FxRot - FyDelta/20;
   Fyrot := FyRot - FxDelta/20;

   //das nächste mal ist das hier unser startpunkt:
   FxStart := X;
   FyStart := Y;

   if FRightMousePressed then
   begin
     if FxRot <> 0 then FCamera.RotateCamera (FxRot, 0, 0);
     if FyRot <> 0 then FCamera.RotateObject (0, FyRot, 0);
   end;
   if FLeftMousePressed then
   begin
     if FxRot <> 0 then FCamera.TranslateCamera (FxRot, 0, 0);
     if FyRot <> 0 then FCamera.TranslateCamera (0, FyRot, 0);
   end;
   Paint;

   FxRot := 0;
   FyRot := 0;
end;

Dieses Beispiel ist vereinfacht dargestellt und es kann sein, dass man daran noch etwas herumspielen muss. Ich habe noch das Mausrad eingesetzt um in den Bildschirm hinein- oder aus ihm herauszuzoomen (TranslateCamera(0,0,?)). Durch modifizieren der Geschwindigkeit (+/-) für die einzelnen Achsen, die an die Prozeduren TranslateCamera und RotateCamera übergeben werden kann man entweder die Szene oder die Kamera bewegen.

3.

Szene zeichnen:

Lichteigenschaften setzen Materialeigenschaften setzen halt die üblichen Vorbereitungen treffen

FCamera.Apply

Szene zeichnen

Swapbuffers...

usw.