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 :

Lancement de dé (3D)


Sujet :

Composants FMX Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut Lancement de dé (3D)
    Bonjour,

    pour me "détendre", je me lance dans la 3D ou devrais-je écrire 3 dés , une proposition de programme de 421 en Lazarus m'y a incité
    Nom : Capture.PNG
Affichages : 270
Taille : 15,1 Ko

    Questions :
    - Sur l'animation, je ne suis pas sûr de bien m'y prendre (c'est ma première question)

    je joue sur les angles de rotation ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm3.Button1Click(Sender: TObject);
    var i : Integer;
    begin
    FloatAnimationX.StopValue:=Random(360);
    FloatAnimationY.StopValue:=Random(360);
    FloatAnimationZ.StopValue:=Random(360);
    FloatAnimationX.Start;
    end;
     
    procedure TForm3.FloatAnimation1Process(Sender: TObject);
    begin
    FloatAnimationY.Start;
    FloatAnimationZ.Start;
    end;
    Pas forcément le pied, même si ça fonctionne, y aurait-il un truc pour que la rotation se fasse en continu jusqu'à une limite de temps plutôt que de changer les stopvalues ?

    2 - Comment pourrais-je récupérer ensuite, la face/valeur après rotation et/ou comment faire, en quelque sorte, jouer la gravité pour que mon dé ne présente que la face de la valeur ?
    Je présume que pour cela il va me falloir tester les diverses stopvalues, une idée ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    alors les rotations comme ça ne vont pas te permettre d'aller très loin, car c'est un enchainement de 3 rotation selon X Y puis Z (ou dans un autre sens)

    si tu veux pouvoir faire des rotations libres, il faut passer par une matrice de rotation qui va accumuler les transformations.

    ça fait un petit moment que je n'ai pas touché FMX mais voici ce que j'utilise dans mon projet CardBoard

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      TControl3DHelper = class helper for TControl3D
        procedure SetMatrix(const M: TMatrix3D);
      end;
     
    procedure TControl3DHelper.SetMatrix(const M: TMatrix3D);
    begin
      FLocalMatrix := M;
      RecalcAbsolute;
      RebuildRenderingList;
      Repaint;
    end;
    et donc tu pars de la matrice Identique que tu peux bouger comme tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      M: TMatrix3D;
    begin
      M := TMatrix3D.Identity; // à ne faire qu'au début, ou pour réinitialiser les rotations !
     
      // 45° rotation on Y
      M := M * TMatrix3D.CreateRotationY(-45*PI/180);
     
      // 20° rotation on X
      M := M * TMatrix3D.CreateRotationX(-20*PI/180);
     
      MonObjet.SetMatrix(M);
    end;
    ça fait un moment que je veux traduire ceci sous Delphi mais je n'ai toujours pas trouvé le temps de le faire
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    alors les rotations comme ça ne vont pas te permettre d'aller très loin
    on est d'accord, c'est plutôt nul.
    car c'est un enchainement de 3 rotation selon X Y puis Z
    il me semblait qu'il y avait une astuce pour "cumuler" les diverses animations mais les présentations des mercredis de Thierry sont loin et je ne sais pas si les redifs sont encore disponibles.

    si tu veux pouvoir faire des rotations libres, il faut passer par une matrice de rotation qui va accumuler les transformations.
    ça va largement déborder de l'amusement

    Ouah je n'ai pas de telles ambitions, 3 dés classiques pour un 421 me suffiront

    Merci pour les orientations.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    658
    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 : 658
    Points : 3 599
    Points
    3 599
    Billets dans le blog
    2
    Par défaut
    Bonsoir Serge,

    Pour illustrer nos échanges en messages privés, voici une ébauche rapide avec 6 TPlane pour former les 6 faces du dé en leur appliquant à chacun une texture qui régit aux 2 sources de lumières de type "spot" présentes.
    Le bouton lancer permet de lancer le dé et le bouton "Face du haut" indique quelle est la face la plus "haute" une fois l'animation du lancer terminée.
    C'est une ébauche rapide, il faudrait que le dé retombe bien à plat, mieux gérer l'aléatoire...
    Voici l'ébauche : de.zip
    et une capture d'écran :
    Nom : capture.png
Affichages : 226
Taille : 41,2 Ko
    Les ArcDial permettent d'orienter la scène.
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 491
    Points : 2 756
    Points
    2 756
    Billets dans le blog
    10
    Par défaut
    J'avais présenté quelque chose sur le sujet dans une conférence avec Maxime je regarde dans mes archives.
    En attendant un petit exemple (à terminer) sur lequel je travaille à mes heures perdues sur le même type de sujet
    Click ou Click droit sur la face centrale pour faire tourner
    Nom : Capture d’écran 2020-12-04 110534.jpg
Affichages : 229
Taille : 4,4 Ko
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    il me semblait qu'il y avait une astuce pour "cumuler" les diverses animations
    à défaut des vidéos de Thierry, j'ai retrouvé celle de Ray Konopka et quelques autres https://www.youtube.com/c/Embarcader...MX%20Animation

    du coup je me suis monté une petite classe
    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
    56
    57
    58
     
      TAnimationDe = class
        AnimationX : TFloatAnimation;
        AnimationY : TFloatAnimation;
        AnimationZ : TFloatAnimation;
      public
        constructor Create(AOwner: TComponent);
        destructor Destroy;
        procedure AnimationFinish(Sender: TObject);
        procedure Start;
        procedure Stop;
      end;
    ...
    procedure TAnimationDe.AnimationFinish(Sender: TObject);
    begin
    TAnimation(Sender).Enabled:=False;
    end;
     
    constructor TAnimationDe.Create(AOwner: TComponent);
    procedure initAnimation(Animation : TFloatAnimation; Propriete : String);
     begin
      Animation.Parent:=TFMXObject(AOwner);
      Animation.Loop:=True;
      Animation.Duration:=3;
      Animation.StopValue:=360;
      Animation.PropertyName:=Propriete;
      Animation.StartFromCurrent:=True;
      Animation.OnFinish:=AnimationFinish;
     end;
    begin
      AnimationX := TFloatAnimation.Create(AOwner);
      initAnimation(AnimationX,'RotationAngle.X');
      AnimationY := TFloatAnimation.Create(AOwner);
      initAnimation(AnimationY,'RotationAngle.Y');
      AnimationZ := TFloatAnimation.Create(AOwner);
      initAnimation(AnimationZ,'RotationAngle.Z');
    end;
     
    destructor TAnimationDe.Destroy;
    begin
      FreeAndNil(AnimationX);
      FreeAndNil(AnimationY);
      FreeAndNil(AnimationZ);
    end;
     
    procedure TAnimationDe.Start;
    begin
    AnimationX.Enabled:=True;
    AnimationY.Enabled:=True;
    AnimationZ.Enabled:=True;
    end;
     
    procedure TAnimationDe.Stop;
    begin
    AnimationX.Stop;
    AnimationY.Stop;
    AnimationZ.Stop;
    end;
    qui me semble pas trop mal (en tout cas qui fonctionne). Il me semble que cette classe pourrait aussi être un managed record mais
    - les managed records ne sont là que depuis peu, donc dans le cadre d'un petit papier pas accessible pour tous
    - je n'ai encore jamais utilisé et ne sais pas trop comment m'y prendre, une bonne occasion de le faire

    Pour information, j'utilise un TKeyFloatAnimation qui simule le lancé du coup la procédure de "jeté de dé" devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    D1:=TAnimationDe.Create(De3D_1);
    D1.Start;
    FloatKeyAnimation1.Enabled:=True;
    end;
    Bien sûr, cela va évoluer mais je me penche maintenant sur le "retombé de dé" et sur la valeur obtenue
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Salut Serge,

    Citation Envoyé par SergioMaster Voir le message
    à défaut des vidéos de Thierry
    Pour info tout est ici :

    https://www.youtube.com/user/LeDevduJeudi

    Par contre il faut fouiller et trouver la bonne vidéo

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Merci Thierry, content de voir que tu es toujours là. Déjà j'avais mal cherché puisqu'un décalage horaire (en 8 ans pas étonnant) m'avait persuadé qu'il s'agissait des mercredis et non du jeudi.
    Je vais y replonger (avec délices) et surtout enregistrer le lien
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Réponses: 7
    Dernier message: 20/08/2003, 10h33
  2. [Kylix] Erreur au lancement de K3 en open C++
    Par Glouferu dans le forum EDI
    Réponses: 9
    Dernier message: 14/03/2003, 16h27
  3. Réponses: 1
    Dernier message: 13/01/2003, 09h26
  4. [Kylix] PB au lancement
    Par sebounator dans le forum EDI
    Réponses: 3
    Dernier message: 09/01/2003, 12h10
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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