Tutorial: Verwenden von Kameras in einer FireMonkey 3D-Anwendung

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FireMonkey-Tutorials


In diesem Tutorial wird gezeigt, wie Kameras in einer einfachen FireMonkey 3D-Anwendung verwendet werden. Es wird erläutert, wie mit TCamera-Objekten die Perspektive einer Szene und die Projektion der Objekte in der Szene definiert wird.

Erstellen einer FireMonkey 3D-Anwendung

Für die Verwendung von TCamera-Objekten müssen Sie eine FireMonkey-3D-Anwendung erstellen. Führen Sie dazu die folgenden Schritte aus:

  1. Datei > Neu > Geräteübrgreifende Anwendung - Delphi > Geräteübergreifende 3D-Anwendung.
  2. Doppelklicken Sie zum Öffnen des FireMonkey-Formular-Designers in der Projektverwaltung auf die Unit .pas, und klicken Sie dann auf das Register Design am unteren Rand des Quelltext-Editors.

Hinzufügen und Anpassen von Komponenten

  1. Fügen Sie aus der Tool-Palette die folgenden FireMonkey-3D-Komponenten hinzu (durch Eingabe des Komponentennamens in das Feld Suchen und Drücken der Eingabe-Taste): 3 TCamera-Objekte, 2 TCube-Objekte und 2 TLight-Objekte.
    • Die TCube-Objekte sind 3D-Objekte, die durch verschiedene Kameras gesehen werden.
    • Mit den TCamera-Objekten wird die Position definiert, von der aus die 3D-Objekte betrachtet werden.
    • Die TLight-Objekte wirken sich auf die Beleuchtung der 3D-Objekte abhängig von der Position der Kamera aus.
  2. Um die Kamera von Form1 zur Laufzeit ändern zu können, setzen Sie im Objektinspektor die Eigenschaft UsingDesignCamera von Form1 auf False.
  3. Der Steuerbereich:
    Um die Änderungen der Szenenperspektive und -projektion abhängig von der Position der Kameras und des Drehwinkels beobachten zu können, erstellen Sie einen Steuerbereich, mit dem die Eigenschaften der TCamera-Objekte geändert werden können.
    1. Führen Sie die Anleitung im Tutorial Erstellen einer 2D-Benutzeroberfläche in einer 3D-Anwendung aus, um einen 2D-Steuerbereich zu erstellen.
    2. Fügen Sie der hinzugefügten 2D-Oberfläche 3 TGroupBox-Objekte hinzu.
    3. Setzen Sie die Eigenschaft Text des ersten TGroupBox-Objekts auf Camera, und fügen Sie 3 TRadioButton-Objekte (Camera1, Camera2 und Camera3) hinzu.
    4. Setzen Sie die Eigenschaft Text des zweiten TGroupBox-Objekts auf Position, und fügen Sie 3 TTrackBar-Objekte (X-, Y- und Z-Koordinaten) hinzu.
    5. Setzen Sie die Text-Eigenschaft des dritten TGroupBox-Objekts auf RotationAngle, und fügen Sie 3 TTrackBar-Objekte (X-, Y- und Z-Ebenen) hinzu.
    6. Um die Werte der TTrackBar-Objekte anzuzeigen, fügen Sie den Gruppenfeldern Position und RotationAngle ein TLabel-Objekt hinzu.

Nach Hinzufügen der Komponenten sollte Ihr Formular etwa folgendermaßen aussehen:

Designwindow.png

Schreiben von Code zum Anpassen der Kameras

1. Fügen Sie in den private-Abschnitt der Formulardeklaration die Variable FIsChangingCamera und die Prozedur RB_Use_CameraChange wie folgt hinzu:
  // Delphi code for the form class declaration
private
  { Private declarations }
  FIsChangingCamera : boolean;
  procedure RB_Use_CameraChange(Sender:TObject);
// C++ code for the form class declaration
private:  // User declarations
  bool FIsChangingCamera;
  void RB_Use_CameraChange(TObject *Sender);

Die boolesche private-Instanzvariable FIsChangingCamera teilt dem Programm mit, dass die Kameraeigenschaften durch eine Schaltflächenklick-Ereignisbehandlungsroutine aktualisiert werden, damit die Ereignisbehandlungsroutinen der Schieberegler nicht versuchen, zur selben Zeit eine Kamera zu aktualisieren.

Die Prozedur RB_Use_CameraChange ermöglicht die Bereitstellung einer Methode zum Ändern der Kameraeigenschaften für alle drei Kameras. Die Implementierung der Methode RB_Use_CameraChange:

// Delphi code for the RB_Use_CameraChange method implementation
procedure TForm23.RB_Use_CameraChange(Sender: TObject);
begin
  FIsChangingCamera := true;
  try
     Form23.Camera := Sender as TCamera;
     TrackBar1.Value := Camera.Position.X;
     TrackBar2.Value := Camera.Position.Y;
     TrackBar3.Value := Camera.Position.Z;
  finally
     FIsChangingCamera := false;
  end;
end;
// C++ code for the RB_Use_CameraChange method implementation
void TForm23::RB_Use_CameraChange(TObject *Sender)
{
  FIsChangingCamera = True;
  try {
    Form23->Camera = dynamic_cast<TCamera*>(Sender);
    TrackBar_PositionX->Value = Form23->Camera->Position->X;
    TrackBar_PositionY->Value = Form23->Camera->Position->Y;
    TrackBar_PositionZ->Value = Form23->Camera->Position->Z;
  }
  __finally {
    FIsChangingCamera = False;
  }
}
2. Als Nächstes müssen Sie den Code für die Zuweisung der Eigenschaften der Kameras zu den Werten der TTrackBar- und TRadioButton-Objekte schreiben.
  { The Delphi implementation for changing the coordinates of the camera position }
  procedure TForm23.RB_Use_Camera1Click(Sender: TObject);
  begin
    RB_Use_CameraChange(Camera1);
  end;

  procedure TForm23.RB_Use_Camera2Click(Sender: TObject);
  begin
    RB_Use_CameraChange(Camera2);
  end;

  procedure TForm23.RB_Use_Camera3Click(Sender: TObject);
  begin
    RB_Use_CameraChange(Camera3);
  end;

  { The Delphi implementation for changing the coordinates of the camera position }
  procedure TForm23.TrackBar_PositionChange(Sender: TObject);
  begin
    if not FIsChangingCamera then
    begin
      TForm23.Camera.Position.X := TrackBar_PositionX.Value;
      TForm23.Camera.Position.Y := TrackBar_PositionY.Value;
      TForm23.Camera.Position.Z := TrackBar_PositionZ.Value;
    end;
    { Updating the displayed values of the coordinates }
    Label_Position.Text := Format('X: %d, Y: %d, Z: %d',
      [Round(TForm23.Camera.Position.X), Round(TForm23.Camera.Position.Y),
      Round(TForm23.Camera.Position.Z)]);
  end;

  { The Delphi implementation for changing the rotation angle of the camera }
  procedure TForm23.TrackBar_RotationAngleChange(Sender: TObject);
  begin
    if not FIsChangingCamera then
    begin
      TForm23.Camera.RotationAngle.X := TrackBar_RotationAngleX.Value;
      TForm23.Camera.RotationAngle.Y := TrackBar_RotationAngleY.Value;
      TForm23.Camera.RotationAngle.Z := TrackBar_RotationAngleZ.Value;
    end;
    { Updating the displayed values of the coordinates }
    Label_RotationAngle.Text := Format('X: %d, Y: %d, Z: %d', 
      [Round(TForm23.Camera.RotationAngle.X), [Round(TForm23.Camera.RotationAngle.Y),
      Round(TForm23.Camera.RotationAngle.Z)]);
    end;
  end;
// C++ code for choosing the camera
void __fastcall TForm23::RadioButton1Click(TObject *Sender)
{
   RB_Use_CameraChange(Camera1);
}
//----------------------------------------------------------
void __fastcall TForm23::RadioButton2Click(TObject *Sender)
{
   RB_Use_CameraChange(Camera2);
}
//----------------------------------------------------------
void __fastcall TForm23::RadioButton3Click(TObject *Sender)
{
   RB_Use_CameraChange(Camera3);
}

// C++ code for changing the coordinates of the camera position
void __fastcall TForm23::TrackBar_PositionChange(TObject *Sender)
{
  if (!Form23->FIsChangingCamera) {
    Form23->Camera->Position->X = TrackBar_PositionX->Value;
    Form23->Camera->Position->Y = TrackBar_PositionY->Value;
    Form23->Camera->Position->Z = TrackBar_PositionZ->Value;
  }
  // Update the displayed values of the coordinates
  TVarRec vr[] = {
    round(Form23->Camera->Position->X),
    round(Form23->Camera->Position->Y),
    round(Form23->Camera->Position->Z)
  };
  PositionLabel->Text = Format("X: %d, Y: %d, Z: %d",vr,3);
}

// C++ code for changing the rotation angle of the camera
void __fastcall Form23::TrackBar_RotationAngleChange(
      TObject *Sender)
{
  if (!Form23->FIsChangingCamera) {
    Form23->Camera->RotationAngle->X =
      TrackBar_RotationAngleX->Value;
    Form23->Camera->RotationAngle->Y =
      TrackBar_RotationAngleY->Value;
    Form23->Camera->RotationAngle->Z =
      TrackBar_RotationAngleZ->Value;
  }
  // Update the displayed values of the coordinates
  TVarRec vr[] = {
    round(Form23->Camera->RotationAngle->X),
    round(Form23->Camera->RotationAngle->Y),
    round(Form23->Camera->RotationAngle->Z)
  };
  RotationLabel->Text = Format("X: %d, Y: %d, Z: %d",vr,3);
}

Setzen Sie vor dem Ausführen der Anwendung die Eigenschaft Camera des Formulars auf Camera2. Damit wird Camera2 als Standardperspektive festgelegt. Sie können dies nach Ausführen des Projekts durch Ändern der Kamera und ihrer Eigenschaften über den erstellten Steuerbereich ändern.

Ausführen der Anwendung

Führen Sie das Projekt aus. Das Hauptfenster des Projekts wird angezeigt. Die Kamera, von der aus die Objekte betrachtet werden, ist Camera2. Ändern Sie die Kamera, die Position der Kamera oder ihren Drehwinkel. Die Objekte werden von einer neuen Perspektive aus betrachtet. Beachten Sie, wie die TLight-Objekte sich auf die Beleuchtung der 3D-Objekte abhängig von der Position der Kamera auswirken.

Camera2.png

Siehe auch

Beispiele