IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Problème d'annimation 3D


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 140
    Billets dans le blog
    5
    Par défaut Problème d'annimation 3D
    Bonjour à tous

    Sur une TForm , j'ai créé une petite vue 3D dans laquelle je déplace après appuis sur un bouton une sphère. Le problème c'est que dès que j'appuie sur le bouton ma vue 3D disparait

    Un peu de code
    La procédure de déplacement qui déplace la sphère bras jusqu'à la position posi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    procedure TForm1.GotoPosi(posi: TPosition3D; duree: Single);
    var
      aniX: TFloatAnimation;
      aniY: TFloatAnimation;
      aniZ: TFloatAnimation;
    begin
      begin
        aniX := TFloatAnimation.Create(bras);
        aniX.PropertyName := 'Position.X';
        aniX.StartValue := bras.Position.X;
        aniX.StopValue := posi.X;
        aniX.Loop := false;
        aniX.AutoReverse := false;
        aniX.Duration := duree;
        aniX.Parent := bras;
        aniX.Start;
        aniY := TFloatAnimation.Create(bras);
        aniY.PropertyName := 'Position.Y';
        aniY.StartValue := bras.Position.Y;
        aniY.StopValue := posi.Y;
        aniY.Loop := false;
        aniY.AutoReverse := false;
        aniY.Duration := duree;
        aniY.Parent := bras;
        aniY.Start;
        aniZ := TFloatAnimation.Create(bras);
        aniZ.PropertyName := 'Position.Z';
        aniZ.StartValue := bras.Position.Z;
        aniZ.StopValue := posi.Z;
        aniZ.Loop := false;
        aniZ.AutoReverse := false;
        aniZ.Duration := duree;
        aniZ.Parent := bras;
        aniZ.Start;
      end;
    end;
    et le code de mon OnClick
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.BtnGoToHublotClick(Sender: TObject);
     
    begin
      if (bras.Position.X <> posiHublot.Position.X) or (bras.Position.Y <> posiHublot.Position.Y) or
        (bras.Position.Z <> posiHublot.Position.Z) then
        GotoPosi(posiHublot.Position, 5);
    end;
    Lorsque je fait exécuter le code j'ai ce message un peu curieux dans la fenêtre des messages
    D3D11: Removing Device.
    Processus moprg.exe (16512)
    Sortie du Thread: ID du thread:13736 Processus moprg.exe (16512)

    Une idée????

  2. #2
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 140
    Billets dans le blog
    5
    Par défaut
    Au final je pense avoir trouvé.
    Dans mon projet j'ai une unité qui a cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    initialization
     
    FMX.Types.GlobalUseGPUCanvas := true;
    et manifestement ça met le bazar.
    Même si mon problème est résolu si quelqu'un a une explication je suis preneur.

  3. #3
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    J'eusse plutôt fait comme ceci (Delphi XE10 Tokyo) en passant les FloatAnim en global:

    FMX.Types.GlobalUseGPUCanvas semble sans effet que ce soit à true ou à false

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    var
      Form1: TForm1;
      aniX: TFloatAnimation;
      aniY: TFloatAnimation;
      aniZ: TFloatAnimation;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      GotoPosi(posiHublot1.Position, 2);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      GotoPosi(posiHublot2.Position, 3);
    end;
     
    procedure TForm1.GotoPosi(posi: TPosition3D; duree: Single);
     
    begin
      if not Assigned(aniX) then
      begin
        aniX := TFloatAnimation.Create(Bras);
        aniX.Parent := Bras;
        aniY := TFloatAnimation.Create(Bras);
        aniY.Parent := Bras;
        aniZ := TFloatAnimation.Create(Bras);
        aniZ.Parent := Bras;
      end;
      aniX.PropertyName := 'Position.X';
      aniX.StartValue := Bras.Position.X;
      aniX.StopValue := posi.X;
      aniX.Loop := false;
      aniX.AutoReverse := false;
      aniX.Duration := duree;
      aniX.Start;
      aniY.PropertyName := 'Position.Y';
      aniY.StartValue := Bras.Position.Y;
      aniY.StopValue := posi.Y;
      aniY.Loop := false;
      aniY.AutoReverse := false;
      aniY.Duration := duree;
      aniY.Start;
      aniZ.PropertyName := 'Position.Z';
      aniZ.StartValue := Bras.Position.Z;
      aniZ.StopValue := posi.Z;
      aniZ.Loop := false;
      aniZ.AutoReverse := false;
      aniZ.Duration := duree;
      aniZ.Start;
    end;

  4. #4
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 140
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    FMX.Types.GlobalUseGPUCanvas semble sans effet que ce soit à true ou à false
    Chez moi qui suis en version 10.3 aussi ça a des effets très néfastes. Même sans activer les animations rien que le fait de déplacer la fenêtre provoque ce phénomène.

    Sinon je vais essayer le code que tu as fourni

  5. #5
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Dans l'exemple que tu as proposé tu recrées des floatAnim à chaque fois que tu passe dans la procédure donc tu superposes les floatAnim avec de possibles effet de bord. D'autre part le Owner de create devrait être Le TForm

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    686
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 686
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Le paramètre FMX.Types.GlobalUseGPUCanvas a bien un effet. Il permet d'utiliser ou non le canevas GPU. Il est activé par défaut sur mobile mais pas sous Windows (et n'est pas pris en charge sous macOS).
    Pour que cela ait un effet, il faut le placer dans le code du projet avant l'instruction Application.Initialize;. En utilisant le canevas GPU, on peut s'attendre à ce que les performances soient meilleures (et c'est le cas ) mais il peut y avoir des petits défauts d'affichage. J'ai fait un petit programme d'exemple, avec un cube, des lumières, des animations, un TText et un TGloweffect.

    Le cube est subdivisé en 500 en largeur, hauteur, profondeur afin d'augmenter le nombre de polygones à afficher. En effet, pour constater une différence sur les performances, il faut que la scène 3D soit un peu chargée (le cube par défaut n'a que 2 triangles par face soit 12 triangles, là on passe à 500x500x2 = 500 000 triangles par face soit 3 000 000 de triangles).
    TestGlobalUseGPUCanvas.zip

    Sur mon PC portable (sans carte 3D dédiée), en plein écran (1920x1080), avec dans le source du projet FMX.Types.GlobalUseGPUCanvas à false, le programme tourne à 28 images par seconde sans défaut.
    En mettant FMX.Types.GlobalUseGPUCanvas à true, je passe à 36 images par seconde mais il y a un défaut : le TText n'apparaît pas en entier (le début et la fin du texte sont tronqués). Du moins sous Windows, je n'ai pas testé sur Android.

    Dans la documentation, il est indiqué que
    En supplément du rendu des graphiques, le canevas GPU utilise une technologie de rendu de texte anti-alias en nuances de gris. le canevas GPU utilise une technologie de rendu de texte anti-alias en nuances de gris.
    Serait-ce cet anti-alias qui provoque le défaut du TText ?
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 140
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    D'autre part le Owner de create devrait être Le TForm
    Là j'ai du mal à comprendre pourquoi. Vu que ces floatanim sont pour ma TSphère bras.

  8. #8
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    Là j'ai du mal à comprendre pourquoi. Vu que ces floatanim sont pour ma TSphère bras.
    Normalement le "Owner" (propriétaire) est le responsable entre autres de la destruction des objets dont il est propriétaire. Le "parent" lui est le contrôleur du composant. Quand tu renseigne PropertyName tu indique une propriété de l'objet parent. Le parent est impliqué de le comportement des objets enfants. Les deux rôles sont donc à priori différents bien que comme l'a indiqué Paul récemment le "Parent" joue parfois le rôle de "Owner". Sois rassuré, j'ai longtemps confondu "Parent" et "Owner". Je reste à ta disposition pour détailler plus si besoin.

  9. #9
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 140
    Billets dans le blog
    5
    Par défaut
    Ok je comprends mieux. Par contre dans le code que tu as donné tu as mis bras comme Owner

  10. #10
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Gouyon Voir le message
    Ok je comprends mieux. Par contre dans le code que tu as donné tu as mis bras comme Owner
    J'avais repris ton exemple mais c'est mieux logiquement parlant de mettre la fiche comme Owner

  11. #11
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 543
    Billets dans le blog
    10
    Par défaut
    Pour terminer tu peux placer les TFloatAnimation en phase de conception. La position dans l'arbre dans le fenêtre "structure" définit le parent et tu n'as plus besoin de "create"

    Nom : Annotation 2020-06-08 113353.png
Affichages : 197
Taille : 21,0 Ko

  12. #12
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 140
    Billets dans le blog
    5
    Par défaut
    Effectivement je n'y avais pas pensé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  2. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  3. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  4. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo