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

OpenGL Discussion :

Utilisation d'OpenGL plus moderne avec .NET


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut Utilisation d'OpenGL plus moderne avec .NET
    Bonjour à tous,

    Je continue à developer un logiciel de CAO / FAO commencé en 2011
    Il est codé avec VB.NET, avec quelques parties en C#

    Pour l'affichage en 3D et aussi en 2D, j'utilise Open GL avec la DLL OpenTK version 1.0.278.44921

    Je me dis que ça doit être obsolète...

    Surtout que j'utilise une méthode assez ancienne (qui devait correspondre au début d'Open GL), à savoir qu'à chaque affichage j'envoie toutes les données

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
                        GL.Begin(BeginMode.Triangles)
                        For j = 0 To STL_ListeT.Count - 1
                            STL_ListeT_Current = STL_ListeT.Item(j)
                            STL_ListeColor3_Current = STL_ListeColor3.Item(j)
                            n = STL_ListeT_Current.Count \ 12
                            For i = 0 To n - 1
                                GL.Color3(STL_ListeColor3_Current.Item(i))
                                k = 12 * i
                                GL.Normal3(STL_ListeT_Current.Item(k), STL_ListeT_Current.Item(k + 1), STL_ListeT_Current.Item(k + 2))
                                GL.Vertex3(STL_ListeT_Current.Item(k + 3) + dtx3D, STL_ListeT_Current(k + 4) + dty3D, STL_ListeT_Current.Item(k + 5) + dtz3D)
                                GL.Vertex3(STL_ListeT_Current.Item(k + 6) + dtx3D, STL_ListeT_Current.Item(k + 7) + dty3D, STL_ListeT_Current.Item(k + 8) + dtz3D)
                                GL.Vertex3(STL_ListeT_Current.Item(k + 9) + dtx3D, STL_ListeT_Current.Item(k + 10) + dty3D, STL_ListeT_Current.Item(k + 11) + dtz3D)
                            Next
                        Next
                        GL.End()

    Curieusement ça reste assez rapide, ça ne commence à perdre en fluidité que lorsque la pièce compte plus de 200.000 triangles et ça devient pénible voir inutilisable au delà de 1.000.000 de triangles

    Une fois l'objet affiché, avec la souris :
    - je ne fait que bouger le point de vue (ou l'éclairage)
    - parfois je modifie, j'ajoute ou je retire juste quelques éléments

    Il serait plus pertinent, lors des mouvements de pièces à la souris au lieu de tout renvoyer à chaque fois, de pouvoir réutiliser les données dans la carte graphique et de changer seulement la position de la caméra et de l'éclairage.

    Ca serait bien, si c'est possible, de pouvoir modifier, supprimer ou ajouter des elements en laissant des autres dans la carte graphique. Mais si j'arrive déjà à ne pas renvoyer toutes les données à chaque affichage ça sera très bien.

    J'utilise les objets suivants avec Open GL :
    - Lines
    - LineStrip
    - LineLoop
    - Quads
    - QuadStrip
    - Triangles
    - TriangleStrip
    - TriangleFan

    Si besoin je peux me passer des Quads, des TriangleStrip et TriangleFan pour n'utiliser que des triangles.
    En revanche, j'ai besoin d'afficher des lignes, ça serait une grosse galère de créer des cylindres de petit diamètre à la place.

    J'utilise aussi la transparence, ce façon modérée mais nécessaire (une surface plane au dessus de la pièce, pour visualiser un plan de coupe ou un niveau)

    J'ai des fenêtres comportant plusieurs zones OpenGL que mon programme affiche en même temps (typiquement : vue en 3D, vue de dessus en 2D, et vue en coupe en 2D), ça aussi c'est nécessaire

    EDIT : j'ai aussi besoin de pouvoir afficher les triangles 'à l'envers', avec une couleur dédiée, dans un mode d'affichage de mon programme (pour vérifier la présence de surfaces orientées dans le mauvais sens)

    Enfin, si on pouvait afficher quelques textes de façon simple ça serait super mais c'est un détail.

    Ne m'étant pas intéressé au sujet depuis des années, je ne sais pas trop ce qu'il en est...
    Vous me conseillez quoi ?
    Je ne cherche pas la toute dernière version ; simplement une méthode plus optimale, on va dire un compromis moins obsolète
    Comme dit au début, c'est un logiciel fait en .NET, le logiciel doit tourner sous Windows 7 et suivants.
    Un compatibilité avec Windows XP serait un plus mais je peux m'en passer (NB : il y a souvent des ordinateurs anciens associés aux machines d'usinage, car la mécanique n'évolue pas aussi vite que l'informatique)

    A bientôt

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Je te conseille d'utiliser au moins OpenGL 3 , vu que oui ta méthode est obsolète et super lente.
    (Et OpenGL 3 est le bon compromis, vu que de nos jours ,c'est plus Vulkan qui devrait être conseillé et OpenGL 4 est obsolète et complexe ).

  3. #3
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Je te conseille d'utiliser au moins OpenGL 3 , vu que oui ta méthode est obsolète et super lente.
    (Et OpenGL 3 est le bon compromis, vu que de nos jours ,c'est plus Vulkan qui devrait être conseillé et OpenGL 4 est obsolète et complexe ).
    Merci pour ta réponse

    J'ai quelques questions :
    - est-ce que toutes les fonctions que j'utilisent ont un équivalent sous OpenGL3 (je pense aux objets qui ne sont pas des triangles, et à la 2D ; mon usage d'OpenGL est assez différent des besoins liés à l'animation ou aux jeux vidéo) ?
    - dois-je mettre à jour ma DLL OpenTK et/ou utiliser autre chose pour travailler avec OpenGL3 sous .NET ?
    - est-ce possible, pour faciliter la "migration" et la mise au point, d'utiliser dans le même projet OpenGL3 tout en conservant l'ancien code OpenGL1 (quitte à faire deux fenêtres séparées) ?

    A bientôt

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Citation Envoyé par electroremy Voir le message
    - est-ce que toutes les fonctions que j'utilisent ont un équivalent sous OpenGL3 (je pense aux objets qui ne sont pas des triangles, et à la 2D ; mon usage d'OpenGL est assez différent des besoins liés à l'animation ou aux jeux vidéo) ?
    Je n'ai pas trop compris parce que faire des objet ou de la 2D , ça se fait dans du JV , mais bon OpenGL3 possède plus de chose que OpenGL1 , et sans vouloir d’offenser , le jeux vidéo ou l'animation utilisera des fonctions avancé ,comparé à toi qui semble vraiment faire une utilisation très basique de la lib.

    Citation Envoyé par electroremy Voir le message
    - dois-je mettre à jour ma DLL OpenTK et/ou utiliser autre chose pour travailler avec OpenGL3 sous .NET ?
    Jamais utilisé OpenTK/.Net, mais normalement pas besoin de changer.


    Citation Envoyé par electroremy Voir le message
    Merci pour ta réponse
    - est-ce possible, pour faciliter la "migration" et la mise au point, d'utiliser dans le même projet OpenGL3 tout en conservant l'ancien code OpenGL1 (quitte à faire deux fenêtres séparées) ?
    Les deux codes peuvent fonctionner ensemble (conseiller de faire de façon séparé ) ,c'est sur OpenGL ES où les fonction OpenGL1 n'existe plus.

    ah bien sur GLU ne doit plus être utilisé.
    (et on peut s'en passer sur OpenGL 1 aussi même pour de la 3D)

  5. #5
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    et sans vouloir d’offenser , le jeux vidéo ou l'animation utilisera des fonctions avancé ,comparé à toi qui semble vraiment faire une utilisation très basique de la lib.
    Oui tout à fait tu as raison :-)

    Le besoin est plus simple... et il est même parfois antagoniste.
    Dans un jeu ou une animation, on souhaite avoir la plus belle image le plus efficacement possible, y compris en "trichant" mais en faisant en sorte que les défauts ne soient pas remarqués par l'œil du joueur ou du spectateur.

    En revanche, en CAO / FAO on veut quelque chose de fidèle, pas au sens esthétique mais géométrique ; et s'il y a des défauts (typiquement des triangles mal raccordés, par exemple dans une pièce 3D qui n'est pas "étanche" alors qu'elle le devrait) on veut qu'ils soient bien visibles, pour vérifier si une pièce est bien ou mal modélisée.

    Voici quelques copies d'écran, ce sera plus parlant.

    Les pièces sont usinées ou imprimées dans la même matière, donc la vraie pièce a une couleur uniforme ; mais dans mon programme je "colorise" certaines parties de la pièce pour bien les différencier et identifier plus facilement les difficultés d'usinage et/ou les erreurs de modélisation. Certaines formes "auxiliaires" sont dessinées en plus comme des parcours d'outils, des axes de perçage, des hauteurs... le but étant de vérifier que certaines choses "invisibles" sur la pièce finale sont bien présentes et au bon endroit.

    Voici la fenêtre de visu avec une vue 2D correspondant à une image BMP lue et convertie en vectoriel, avant et après lissage :

    Nom : 01_Visu2D_BMP.jpg
Affichages : 129
Taille : 112,5 Ko

    Nom : 02_Visu2D_Poly.jpg
Affichages : 136
Taille : 113,0 Ko

    Voici la fenêtre de visu avec une vue 2D à gauche et une vue 3D à droite, on voit la pièce "en fausse couleurs" avec les perçages dessinés sous forme de cercle en 2D, et les axes de perçage sur la vue 3D. On navigue dans chaque vue de façon indépendante.

    Nom : 03_Visu2D_3D_DetectionPercages.jpg
Affichages : 132
Taille : 273,4 Ko

    Voici la fenêtre de visu avec uniquement la vue 3D

    Nom : 04_Visu_3D.jpg
Affichages : 134
Taille : 255,7 Ko

    Voici la fenêtre de visu avec une vue 2D à gauche et une vue 3D à droite pour la saisie de la position des brides, qui se fait à la souris uniquement sur la vue 2D. On peut naviguer dans la vue 2D et 3D indépendament. Quand une bride est déplacée sur la vue 2D, on la voit bouger en même temps sur la vue 3D. Les hachures sur la vue 2D correspondent à la direction du sens du fil du bois. On utilise un peu de transparence avec des rectangles au dessus des brides qui représente une hauteur de fixation

    Nom : 05_Visu2D_3D_PositionBrides.jpg
Affichages : 133
Taille : 351,4 Ko

    Voici la fenêtre de visu avec une vue 2D à gauche et une vue 3D à droite pour la visualisation des phases d'usinage. Le jaune (en 2D, et en transparence sur la vue 3D) représente la surface à usiner, les traits en vert sur la vue 2D représentent les parcours d'outils ; la zone noire est la zone effectivement usinée.

    Nom : 06_Visu2D_3D_PhaseUsinage.jpg
Affichages : 145
Taille : 526,1 Ko

    Voici la fenêtre de visu avec deux vue 2D à gauche (vue de dessus et vue en coupe) et une vue 3D à droite pour la visualisation de la simulation d'usinage. Les 3 vues permettent de bien visualiser un parcours de la fraise (polyline fermée). On navigue dans la vue 3D de façon indépendante, mais les deux vues 2D sont liées car elles partagent l'axe X (si je bouge une des vues 2D, le mouvement de l'axe X est fait dans l'autre vue)

    Nom : 07_Visu2D_2D_3D_SimulationUsinage.jpg
Affichages : 130
Taille : 397,5 Ko

    Voici la fenêtre de visu avec uniquement la vue 3D d'une pièce en "vraie 3D" (et pas seulement en 2.5D) :

    Nom : 08_Visu_3D_STL.jpg
Affichages : 133
Taille : 146,4 Ko

    Voici la fenêtre de visu avec uniquement la vue 3D d'une pièce en "vraie 3D" en mode "debug", c'est à dire avec la face externe de chaque triangle en vert et la face interne en rouge (j'ai zoomé pour "rentrer" dans une pièce et voir l'intérieur) :

    Nom : 09_Visu_3D_STL_Debug.jpg
Affichages : 130
Taille : 117,9 Ko

    Pour résumer c'est moche mais "parlant" du point de vue mécanique.

    Aurais-tu un tutoriel particulier à me recommander sur Open GL3 (en français ou en anglais) ?

  6. #6
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Jolie projet en tout cas

    sur DVP , il y'a un tutoriel là dessus :
    https://opengl.developpez.com/tutori...engl-tutorial/

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par electroremy Voir le message
    s'il y a des défauts (typiquement des triangles mal raccordés, par exemple dans une pièce 3D qui n'est pas "étanche" alors qu'elle le devrait) on veut qu'ils soient bien visibles, pour vérifier si une pièce est bien ou mal modélisée.
    Tu sais, dans un jeu, si un model a un problème, on va pas les corriger avec un algo mais le renvoyer à l'artiste.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 530
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 530
    Par défaut
    Citation Envoyé par electroremy Voir le message
    Vous me conseillez quoi ?
    Comme Kannagi je n'arrive pas trop bien à saisir le problème.
    Si le projet consiste à afficher des lignes, des listes de triangles bref des objets 3d éclairés et affichés en 3d avec les transformations classiques bref ce que fait Open GL pas besoin je pense d'avoir recours à des API plus perfectionnées.
    Le plus important c'est que le projet soit vraiment fonctionnel c'est pas comme pour un projet de jeu où contrairement à un outil de CAO, dans un jeu le rendu final à l'écran ça compte beaucoup.
    Par contre ça semble être un beau projet

  9. #9
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Merci pour vos réponses

    Dans un premier temps je vais essayer de faire de l'OpenGL 3 avec ma lib OpenTK actuelle ; la lib est plus récente que la date de sortie d'OpenGL3, et je retrouve dans l'objet GL d'OpenTK les fonctions liées aux shaders donc à priori c'est bon.

    En effet, j'en avais un peu bavé pour intégrer OpenTK et avoir une fenêtre avec plusieurs zones d'affichage OpenGL indépendantes, tout en gérant la souris et le clavier de façon cohérente, et sans avoir des affichages redondants à cause d'évènements multiples
    Du coup si j'y parvient de cette façon je n'aurais pas à remettre en cause mon IHM ça sera plus simple.

    Sinon, je passerais à une version plus récente d'OpenTK, il devrait y avoir un nombre de changements limité.

    Il faudra y passer un certain temps car il y a une rupture entre OpenGL1 et OpenGL3.
    Je commencerais par la visu 3D "vraie 3D", c'est là où j'ai le plus de triangles et en même temps où le code est le plus simple (juste une liste de triangles, pas d'édition)
    Ca permettra d'évaluer le gain en vitesse

    Mon projet est une sorte de petit Open Scad maison, avec des fonctions un peu particulières correspondant exactement à ce que j'ai besoin de faire.
    A l'origine il servait à faire de l'usinage 2.5D à partir d'une image quelquonque.
    Puis je l'ai amélioré avec une partie génération vectorielle directe en plus de l'image.
    Lorsque j'ai acquis une imprimante 3D, j'ai ajouté un export en STL pour imprimer en 3D ces pièces 2.5D, puis, créé un petit module de fonctions à part pour faire mes pièces en "vraie 3D".

    Dernièrement, je me suis amusé à faire des lithophanies.
    Le principe d'une lithophanie c'est de fabriquer une pièce fine avec une épaisseur variable en fonction du niveau de gris d'une image, pour obtenir des logos ou des photos "lumineuses"
    Je peux visualiser le résultat en 3D normale ou avec les couleurs d'origine.
    Ca génère un grand nombre de triangle... d'où me besoin de faire quelque chose de plus rapide que OpenGL1

    Voici quelques copies d'écran et photo :

    L'image de départ, mon image de profil (en basse résolution, exprès pour bien voir les triangles) :

    Nom : 01_ImageDepart.jpg
Affichages : 149
Taille : 99,9 Ko

    Le résultat après traitement :

    Nom : 02_Litho.jpg
Affichages : 117
Taille : 140,6 Ko

    La pièce avec l'image en "haute résolution" :

    Nom : 07_Litho3D.jpg
Affichages : 121
Taille : 128,0 Ko

    Nom : 08_Litho3D.jpg
Affichages : 125
Taille : 110,8 Ko

    Une photo de l'impression 3D en ABS blanc :

    Nom : 09_Impression.JPG
Affichages : 120
Taille : 232,9 Ko

    Voilà ce que ça donne avec un éclairage arrière, par transparence :

    Nom : 12_Resultat.JPG
Affichages : 117
Taille : 282,8 Ko

    Nom : 13_Resultat.JPG
Affichages : 119
Taille : 272,5 Ko

    On voit que c'est mieux avec la gravure côté visible et l'éclairage côté lisse, donc j'aurais du imprimer la pièce à l'endroit et pas en miroir.

    On peut aussi faire une lithophanie cylindrique, voici une petite lampe de chevet imprimée en 3D selon ce principe, les filetages et taraudages ont été imprimés en 3D, les seules pièces mécaniques non imprimées en 3D sont 3 vis M6 pour fixer le support des rubans à led dans le socle :

    Nom : DSC08622.JPG
Affichages : 127
Taille : 391,0 Ko

    Nom : DSC08651.JPG
Affichages : 123
Taille : 383,9 Ko

    Nom : DSC08661.JPG
Affichages : 151
Taille : 317,5 Ko

    A bientôt

Discussions similaires

  1. utiliser un callback C++ natif avec du code .NET (en C#)
    Par nicolasflasque dans le forum C++/CLI
    Réponses: 3
    Dernier message: 28/11/2008, 11h58
  2. xp_cmdshell utilisation avec net use
    Par lazzeroni dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/01/2007, 16h22
  3. Dessiner des objets plus complexes avec OpenGL
    Par Premium dans le forum OpenGL
    Réponses: 18
    Dernier message: 21/11/2006, 17h55
  4. [VB.NET]Utilisation de la molette souris avec un Panel
    Par Mayamok dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/09/2006, 15h38

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