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

DirectX Discussion :

[DX9][C#]Rotation de la scene non fluide


Sujet :

DirectX

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 66
    Points
    66
    Par défaut [DX9][C#]Rotation de la scene non fluide
    Je souhaite faire tourner à vitesse constante une scene 3D autour de l'axe des Y.L'affichage de la scene doit se faire dans une pictureBox.
    Dans la fiche est placé un boutton sur lequel un click doit doubler la vitesse de rotation.

    J'ai pris comme base de mon projet les 2 Tutoriels de FunkyData: » Programmation de DirectX en C# .

    J'ai placé sur la fiche une PictureBox et remplacé dans la ligne



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    device = new Device(0, DeviceType.Hardware, 
     
    this,CreateFlags.HardwareVertexProcessing, presentParams);
    this par this.pictureBox1,

    le rendu de la scene s’effectue dans la pictureBox1.

    J'ai ajouté un boutton . Cela fonctionne toujours.

    J'ai ajouté des objets à la scene . Cela fonctionne toujours.

    Je souhaite faire tourner ma scene sur elle-même. Alors j’ajoute les lignes suivantes avant l’affichage des éléments de la scene:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    angle = vitesse*Environment.TickCount / 1000.0F;
    // vitesse=1 au départ
    device.Transform.World =  Matrix.RotationY(angle);
    Cela pose un problème : la scene ne s’affiche que lorsque le pointeur de la souris passe sur le boutton(envoi d’un événement paint à ce moment).

    j'ai modifié la boucle de rendu :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Form1()
            {
                InitializeComponent();
                InitializeGraphics();
                CreateTriangle();
        //Evènement pour la boucle de rendu
                this.Paint += new PaintEventHandler(this.Render);
            }J’ai compléter le code précédent
    avec cette ligne


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i=0; i < 10000; i++)
                this.Paint += new PaintEventHandler(this.Render);
    Puis j'ai ajouté une fonction de gestion du click du boutton:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void button1_Click(object sender, EventArgs e)
            {
                vitesse = vitesse + vitesse;
            }
    La scene tourne et la vitesse de rotation double quand on click sur le boutton.


    Mais cela fonctionne mal. En particulier il y a un gros retard (plusieurs secondes) entre le click et l’accélération.

    Je cherche donc une nouvelle fonction Form1() . Toute proposition sera le bien venue.



    J’espére ne pas avoir été trop long…

    Merci d’avance.

  2. #2
    Membre confirmé
    Avatar de funkydata
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 515
    Points : 504
    Points
    504
    Par défaut
    Premièrement je vois pas trop l'interêt de cette ligne (de la boucle en fait) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int i=0; i < 10000; i++)
                this.Paint += new PaintEventHandler(this.Render);
    Ensuite plutôt que d'utiliser l'évènement "paint" pourquoi ne pas utiliser ta propre fonction de mise à jour de l'affichage ? Si tu veux effectivement gérer une vitesse de rotation constante il faut à mon sens que ce soit toi qui gère l'affichage et pas un évènement Windows...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par funkydata
    Ensuite plutôt que d'utiliser l'évènement "paint" pourquoi ne pas utiliser ta propre fonction de mise à jour de l'affichage ? Si tu veux effectivement gérer une vitesse de rotation constante il faut à mon sens que ce soit toi qui gère l'affichage et pas un évènement Windows...
    C’est un voie que j’avais déjà explorée en voulant ajouter une fonction main à la class Form1.
    Ce qui m’avait donné le message : « impossible deux points d’entrée… »
    Tes conseils avisés m’ont relancé dans cette direction . En m’inspirant d’exemples glanés sur la toile, j’ai obtenu la solution suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Form1()
            {
                InitializeComponent();
                InitializeGraphics();
                Show();
                while (Created)
                {
                    MaScene();
                    Application.DoEvents();
                }
               //DisposeGraphics();          
     
            }

    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
       private void MaScene()
            {
     
                device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Azure, 1.0F, 0);
     
                device.BeginScene();
                angle = vitesse * Environment.TickCount / 1000.0F;
                device.Transform.World = Matrix.RotationY(angle);
     
                //affichage de mes objets…
     
                device.EndScene();
                device.Present();
     
            }
    Cette solution n'est certainement pas la meilleure mais j’obtiens le résultat cherché.

    Reste un petit bug : quand je ferme la fenêtre j’obtiens le message

    Impossible d'accéder à un objet supprimé.
    Nom de l'objet : 'Form1'.

    A la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Run(new Form1());
    Je n'ai pas encore trop cherché le pourquoi mais mon projet c'est bien débloqué.

    Merci du conseil!

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

Discussions similaires

  1. Affichage non fluide Windows 7
    Par santacrus dans le forum Windows 7
    Réponses: 1
    Dernier message: 22/11/2009, 15h32
  2. [.Net]Application non fluide : threads?
    Par Finality dans le forum Windows Forms
    Réponses: 10
    Dernier message: 22/12/2007, 21h47
  3. [DX9][C#] Cacher les arretes non visibles
    Par lancer83 dans le forum DirectX
    Réponses: 3
    Dernier message: 19/08/2006, 16h58
  4. tetris 3d: rotation scene + souris
    Par timZeR0 dans le forum GLUT
    Réponses: 17
    Dernier message: 02/06/2006, 21h37
  5. rotation autour d'un objet scene OpenGL
    Par hysah dans le forum OpenGL
    Réponses: 1
    Dernier message: 01/05/2006, 17h31

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