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

C# Discussion :

Affichage de graphes 3D


Sujet :

C#

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut Affichage de graphes 3D
    Bonjour,

    je cherche à afficher des graphes représentant des trajectoires d'objets mobiles dans l'espace 3D, dans une application Windows Forms.
    Je ne veux pas afficher de modèle 3D de mes objets mais simplement les courbes représentant leurs trajectoires (je possède ces données de trajectoires dans des tableaux de double): comme dans cet exemple.

    J'ai regardé du côté de WPF avec ViewPort3D, avec cela je peux par exemple afficher un modèle 3D d'un objet (j'ai testé un exemple avec un cube) mais je ne comprends pas comment afficher une simple ligne et non un objet 3D.
    J'ai vu également l'outil ILNumerics mais je ne vois pas de version gratuite et cela me semble surdimensionné par rapport à ce que je veux faire.

    L'idéal serait de pouvoir également manipuler la scène 3D (zoom / rotation) à la souris et même d'ajouter un slider type "lecteur média" permettant d'animer le tracé des trajectoires au cours du temps.

    Pouvez-vous me conseiller des outils adaptés pour ce besoin?
    Merci d'avance!

  2. #2
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Personne?

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    La primitive "line 3d" n'existe pas en WPF (un manque de WPF)!!!

    Par exemple pour dessiner la "cage ou squelette" d'un Mesh ,il existe un outil "ad hoc" de Microsoft Team désigné par "3DTools" qui simule la ligne 3D !!!...
    Inconvénient majeur :sous un certain angle ,la "ligne" disparait ,car c'est en fait une surface sans épaisseur...
    Pour rappel une surface est un Mesh constituée de triangles adjacents formant grid...La "ligne" citée disparait car c'est simplement un vulgaire rectangle fait de 2 triangles adjacents dont les sommets ont tous une profondeur constante et égale....

    lien Codeplex pour 3DTools:
    https://www.google.fr/url?sa=t&rct=j...37132246,d.d2s

    Il est préférable d'utiliser un outil adapté comme SharpGL(OpenGL Managed) ou SharpDX (Directx Managed)....
    voici un code pour SharpGL qui dispose d'un Control droppable pour WPF( ou Winform) qui dessine :
    - les axes (primitive Axies)
    - une "spirale 3D" y compris ses points
    - une sphere qui est animé dont la trajectore est la "spirale"...

    1/code behind .cs du class GeometryGenerator qui cree les "vertex" ou points de la spirale:
    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
     
    using System;
    using SharpGL.SceneGraph;
     
    namespace WpfCourbe3D
    {
        public static class GeometryGenerator
        {
            public static Vertex[] GenerateGeometry(uint numberOfVertices)
            {
                var vertices = new Vertex[numberOfVertices];
     
                for (int i = 0; i < vertices.Length ; i++)
                {
                    double t = 0.1 * i;
                    vertices[i].X =(float)( Math.Exp(-t / 30) * Math.Cos(t));
                    vertices[i].Z = (float)(Math.Exp(-t / 30) * Math.Sin(t));
                    vertices[i].Y = (float)t;
                    vertices[i].Normalize();
                }
                //  Return the vertices.
                return vertices;
            }
        }
    }
    1/code behind .cs du Form WPF :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    using System;
    using System.Windows;
    using System.Windows.Controls;
    //references
    using SharpGL;
    using SharpGL.Enumerations;
    using SharpGL.SceneGraph;//vertex 
    using SharpGL.SceneGraph.Core;//rendermode
    using SharpGL.SceneGraph.Primitives;// axies,cube,grid,polygon
    using SharpGL.SceneGraph.Quadrics;// sphere
     
    namespace WpfCourbe3D
    {
        /// <summary>
        /// Logique d'interaction pour MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private Axies axies = new Axies();
            private Vertex[] vertices = null;
            private uint NumberOfVertices = 300;
            private Sphere solid = new Sphere();
            private double radius = 0.05;
            private int anim = -1;
            private bool flag = true;
            public MainWindow()
            {
                InitializeComponent();
            }
     
            private void openGLControl1_OpenGLInitialized(object sender, OpenGLEventArgs args)
            {
                //  Get the OpenGL object.
                OpenGL gl = openGLControl1.OpenGL;
     
                //  vertices.
                vertices = GeometryGenerator.GenerateGeometry(NumberOfVertices);
     
                //  Thickness Point.
                args.OpenGL.PointSize(3.0f);
     
                //  Create Sphere
                CreateSphere(gl, solid, radius);
     
            }
     
            private void openGLControl1_OpenGLDraw(object sender, OpenGLEventArgs args)
            { 
                //  Get the OpenGL instance that's been passed to us.
                OpenGL gl = args.OpenGL;
     
                //  Clear the color and depth buffers.
                gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
     
                //  Reset the modelview matrix.
                gl.LoadIdentity();
                gl.LookAt(3.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
     
                //  Move the geometry into a fairly central position.
                gl.Translate(0.0f, 0.0f, 0.0f);
                gl.Rotate(0.0f, 30.0f, 0.0f);
     
                //Render axies
                axies.Render(gl, RenderMode.Design);
     
                gl.Scale(2.5f, 1.0f, 2.5f);
                RenderVertices(args.OpenGL);
     
     
     
     
                if (flag)
                    anim++;
                else
                    anim--;
                if (anim > vertices.Length - 1)
                {
                    anim = vertices.Length - 1;
                    flag = false;
                }
                if (anim < 0)
                {
                    anim = 0;
                    flag = true;
                };
                gl.Translate(vertices[anim].X, vertices[anim].Y, vertices[anim].Z);
                gl.Scale(0.5f, 0.5f, 0.5f);
                RenderSphere(gl, solid);
     
                //  Flush OpenGL.
     
                gl.Flush();
     
     
            }
            //render vertices
            private void RenderVertices(OpenGL gl)
            {
                gl.Color(1.0f, 0.0f, 0.0f);
                gl.Begin(OpenGL.GL_POINTS);
                for (uint i = 0; i < vertices.Length; i++)
                {
                    gl.Vertex(vertices[i]);
                }
                gl.End();
                gl.Color(0.0f, 1f, 0.5f);
                gl.Begin(OpenGL.GL_LINE_STRIP);
                for (uint i = 0; i < vertices.Length; i++)
                {
                    gl.Vertex(vertices[i]);
     
                }
                gl.End();
     
            }
            //render sphere
            private void RenderSphere(OpenGL gl, Sphere solid)
            {
                gl.Color(0.0f, 0.0f, 1.0f);
                solid.Render(gl, RenderMode.Design);
     
     
            }
            //initialisation sphere
            private void CreateSphere(OpenGL gl, Sphere sph, double rad)
            {
                sph.CreateInContext(gl);
                sph.Stacks = 20;
                sph.Slices = 20;
                sph.QuadricDrawStyle = DrawStyle.Fill;
                sph.Radius = rad;
     
            }
        }
    }

    simplistic code xaml:
    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
     
     
    <Window  x:Class="WpfCourbe3D.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:my="clr-namespace:SharpGL.WPF;assembly=SharpGL.WPF"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <my:OpenGLControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                              Name="openGLControl1" 
                              RenderContextType="DIBSection" FrameRate="20" DrawFPS="True"
                              OpenGLInitialized="openGLControl1_OpenGLInitialized"
                              OpenGLDraw="openGLControl1_OpenGLDraw"
                               />
        </Grid>
    </Window>
    lien code Codeplex pour SharpGL :

    https://www.google.fr/url?sa=t&rct=j...37132246,d.d2s
    bon code....

  4. #4
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Super!
    Merci beaucoup, cela correspond tout à fait à ce que je cherche.

    Pour info pour ceux comme moi qui ne sont pas habitués au Framework .NET, voici, après quelques recherches comment j'ai intégré cet exemple à mon projet WinForms déjà existant (sous VS Express 2012):

    - Dans PROJET/Ajouter une référence, ajouter les toutes les *.dll téléchargées
    - Pour ajouter le contrôle "OpenGLControl" dans le designer, ouvrir la Windows Form dans laquelle vous voulez afficher le dessin SharpGL et faites clic droit dans la boîte à outils/"Choisir les éléments..."
    - Ajouter manuellement avec le bouton "parcourir...", la dll "SharpGL.WinForms.dll"
    - Le contrôle "OpenGLControl" est maintenant disponible dans la boîte à outils.
    - Une fois le contrôle ajouté à la fenêtre, double-cliquer dans les propriété du contrôle (onglet "Evenement") sur les évènements "OpenGLDraw" et "OpenGLInitialized"
    - Cela crée automatiquement les méthodes "openGLcontrol1_OpenGLInitialized(objet sender, EventArgs e)" et "openGLcontrol1_OpenGLDraw(objet sender, RenderEventArgs e)" qu'il faut donc faire correspondre avec le code fourni par MABROUKI (j'ai du faire un léger changement dans la méthode draw qui prend en argument non pas OpenGLEventArgs mais RenderEventsArgs, en changeant la ligne "OpenGL gl = args.OpenGL" en "OpenGL gl = openGLControl1.OpenGL").

    Merci encore!

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

Discussions similaires

  1. Problème affichage des graphes
    Par jescob03 dans le forum iReport
    Réponses: 0
    Dernier message: 17/11/2008, 17h01
  2. Problème de dimension pour affichage sur graph
    Par Marc29 dans le forum LabVIEW
    Réponses: 4
    Dernier message: 17/06/2008, 10h55
  3. Problème d'affichage des graphes avec Tomcat
    Par _Janu_ dans le forum BIRT
    Réponses: 11
    Dernier message: 20/09/2006, 15h30
  4. [Artichow] Erreur lors de l'affichage du graph
    Par ouldfella dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/04/2006, 17h31
  5. Affichage de graphe
    Par pc.bertineau dans le forum MFC
    Réponses: 2
    Dernier message: 27/05/2005, 16h10

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