Tutoriel : Comment utiliser les caméras dans une application FireMonkey 3D
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.
Sommaire
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 :
- Sélectionnez Fichier > Nouveau > Application multi-périphérique - Delphi > Application 3D.
- 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
- 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)
- 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.
- 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.
- 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.
- Dans la surface 2D ajoutée, ajoutez 3 objets TGroupBox.
- Définissez la propriété text du premier objet TGroupBox sur Camera, et ajoutez 3 objets TRadioButton (Camera1, Camera2 et Camera3).
- Définissez la propriété text du second objet TGroupBox sur Position, et ajoutez 3 objets TTrackBar (coordonnées X, Y et Z).
- Définissez la propriété text du troisième objet TGroupBox sur RotationAngle, et ajoutez 3 objets TTrackBar (plans X, Y et Z).
- 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 :
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.
Voir aussi
- FireMonkey 3D
- Application 3D multi-périphérique
- FMX.Controls3D.TCamera
- Création d'une interface 2D dans une application 3D (tutoriel FireMonkey 3D)
Exemples
- Exemple FireMonkey 3D Arrows
- Exemple FireMonkey First App3D
- Exemple FireMonkey Planets
- Exemple FireMonkey Cameras Textures 3D