Tutoriel : Comment utiliser les caméras dans une application FireMonkey 3D

De RAD Studio
Aller à : navigation, rechercher

Remonter à Tutoriels FireMonkey


Ce tutoriel montre comment utiliser les caméras dans une simple application FireMonkey 3D. Il expliquera comment utiliser les objets TCamera pour définir la perspective de scène et la projection des objets dans la scène.

Création d'une application FireMonkey 3D

Pour utiliser TCamera, vous devez créer une application FireMonkey 3D. Pour ce faire, suivez les étapes ci-après :

  1. Sélectionnez Fichier > Nouveau > Application multi-périphérique - Delphi > Application 3D.
  2. Pour ouvrir le Concepteur de fiches FireMonkey, double-cliquez sur l'unité .pas dans le Gestionnaire de projets, puis cliquez sur l'onglet Conception sur le bord inférieur de l'éditeur de code.

Ajout et ajustement des composants

  1. Depuis la Palette d'outils, ajoutez les composants FireMonkey 3D suivants (en entrant le nom du composant dans le champ Chercher et en appuyant sur la touche Entrée)
    • Les objets TCube sont les objets 3D qui seront vus à travers différentes caméras.
    • Les objets TCamera seront utilisés pour définir la position à partir de laquelle les objets 3D sont vus.
    • Les objets TLight affecteront la lumière des objets 3D, en fonction de la position de la caméra.
  2. Pour être en mesure de changer la caméra de Form1 à l'exécution, définissez dans l'inspecteur d'objets la propriété UsingDesignCamera de Form1 sur False.
  3. Le panneau de contrôle :
    Pour être en mesure d'observer comment la perspective de scène et la projection changent, en fonction de la position des caméras et de l'angle de rotation, créez un panneau de contrôle qui permet de changer les propriétés des objets TCamera.
    1. Suivez les instructions décrites dans le tutoriel Création d'une interface 2D dans une application 3D pour construire un panneau de contrôle 2D.
    2. Dans la surface 2D ajoutée, ajoutez 3 objets TGroupBox.
    3. Définissez la propriété text du premier objet TGroupBox sur Camera, et ajoutez 3 objets TRadioButton (Camera1, Camera2 et Camera3).
    4. Définissez la propriété text du second objet TGroupBox sur Position, et ajoutez 3 objets TTrackBar (coordonnées X, Y et Z).
    5. Définissez la propriété text du troisième objet TGroupBox sur RotationAngle, et ajoutez 3 objets TTrackBar (plans X, Y et Z).
    6. Pour voir les valeurs des objets TTrackBar, ajoutez un objet TLabel dans les zones de groupe Position et RotationAngle.

Après l'ajout des composants, votre onglet Conception doit ressembler à ceci :

Designwindow.png

Ecriture du code pour ajuster les caméras

1. Ajoutez une variable, FIsChangingCamera, et une procédure, RB_Use_CameraChange, à la section private de la déclaration de la fiche, comme suit :
 // 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);

La variable d'instance booléenne privée FIsChangingCamera permet au programme de savoir qu'un gestionnaire d'événements clic de bouton a mis à jour les propriétés de la caméra, afin d'empêcher les gestionnaires d'événements barre de suivi de mettre aussi à jour une caméra en même temps.

La procédure RB_Use_CameraChange vous permet de fournir une méthode de changement des propriétés de la caméra pour les trois caméras. L'implémentation de la méthode 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. Vous devez ensuite écrire le code pour assigner les propriétés des caméras aux valeurs des objets TTrackBar et TRadioButton.
 { 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);
 }

Avant d'exécuter l'application, définissez la propriété Camera de la fiche sur Camera2. Cette action définit Camera2 en tant que perspective par défaut. Vous pouvez la changer après l'exécution du projet en changeant la caméra et ses propriétés à partir du panneau de contrôle créé.

Exécution de l'application

Exécutez le projet. La fenêtre principale du projet est affichée. Observez que la caméra à partir de laquelle les objets sont vus est Camera2. Changez la caméra, la position de la caméra ou son angle de rotation, et observez la nouvelle perspective à partir de laquelle les objets sont vus. Observez comment les objets TLight affectent la lumière de l'objet 3D, en fonction de la position de la caméra.

Camera2.png

Voir aussi

Exemples