Viewer 3D avec WinDev

Viewer 3D avec WinDev - Divers - Programmation

Marsh Posté le 30-01-2014 à 17:35:30    

Bonjour à tous,
 
Je suis étudiant en BTS Informatique et je dois développer une application qui permet la visualisation 3D d'un fichier STL. Cette application doit aussi permettre d'ajouter des libellés à des positions précises dans le repère (x, y, z).
 
J'ai effectué beaucoup de recherches à propos de ça et je n'ai rien trouvé de concluant, mis à part développer un modèle 3D complet sauf que je n'ai que 12 semaines de projet.
 
Au début, j'étais parti pour utiliser OpenGL mais j'ai cru comprendre qu'OpenGL ne pouvait que créer des formes simples (cylindres, cubes, pyramides, ...) et qu'il ne pouvait pas ouvrir un fichier STL pour le convertir en formes simples (ou même l'afficher directement).
 
Ensuite, j'ai cherché s'il existait une bibliothèque pour WinDev qui faisait office de Viewer 3D mais je n'ai absolument rien trouvé.
 
J'ai trouvé des logiciels OpenSource qui permettent la visualisation de fichier STL qui sont codés en C++, peut être y a t-il un moyen d'exporter ces sources (ou une partie) pour les utiliser avec WinDev (à savoir que j'utilise la version 17).
 
Si quelqu'un a une solution ou une direction à suivre pour résoudre mon problème, je suis preneur.
 
Merci d'avance, Jérémy L.

Reply

Marsh Posté le 30-01-2014 à 17:35:30   

Reply

Marsh Posté le 31-01-2014 à 02:57:46    

Salut
 
Je connais pas STL mais si ce que raconte Wikipedia est vrai, c'est seulement un gros tas de triangles declares separement. Si c'est le cas, OpenGL est largement suffisant...  
 
Windev t'es impose?


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 31-01-2014 à 08:33:32    

Salut,
 
Mais dans ce cas comment l'ouvrir avec OpenGL sous WinDev ?
Oui WinDev m'est imposé !

Message cité 1 fois
Message édité par lethgir le 31-01-2014 à 09:01:33
Reply

Marsh Posté le 01-02-2014 à 02:16:37    

J'en sais rien, j'ai jamais utilise OpenGL. Windev non plus mais bon vu que je vois que c'est un IDE on s'en branle, je suppose que tu vas bosser en C++.
 
Bah du coup c'est simple, en C++:
- tu ouvres le fichier
- tu parcours les lignes du fichier
- au fur et a mesure, tu recuperes les coordonnees des 3 points de chaque triangle
- des que t'as un triangle, tu le dessines avec OpenGL (je sais pas faire mais je doute que ca soit complique, et je suppose qu'il y a des millions de tutoriaux sur le net pour OpenGL)
- etc. jusqu'a la fin du fichier.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 01-02-2014 à 12:42:34    

Je sais pas si tu dois tout faire à la main, ou s'il vous ont fourni des outils.
 
En faisant un petit tours sur internet, le format STL (en ASCII) est comme ça :  
 
facet normal ni nj nk
    outer loop
        vertex v1x v1y v1z
        vertex v2x v2y v2z
        vertex v3x v3y v3z
    endloop
endfacet
 
En gros, pour chaque triangle tu as :
Sa normal ( nX, nY,nZ)
Et les 3 sommets.
 
Sache que si tu souhaites utiliser la normal (ça indique l'orientation d'une surface, c'est utilisé pour les lumières), openGL t'imposera d'avoir une normal / sommets.
 
En gros, la structure d'un modèle dans openGL se découpe comme ça :
 
Vertex :  
Position (XYZ)
Normal (XYZ)
etc, etc
 
Face :  
Index[3] <- Les 3 indices des sommets (on admet que tu vas dessiner des triangles)
 
La seule "obligation", c'est d'avoir la position du vertex. Le reste, tout dépend:  
 
Si tu utilise OpenGL 1.X (je te le recommande, il est plus utilisé mais plus facile d'accès), les attributs par sommets sont limités.
Pour chaque sommet, tu peux définir la position, la normal, la couleur et les coordonnées UVs (pour les textures).
 
Bref, donc au final, le but ça va être de pouvoir stocker dans un tableau les sommets, et un autre les indices des triangles et d'utiliser des glBegin/glEnd (encore une fois, c'est déprécié mais si tu dois te manger des shaders + VBO ça va être compliqué :D)
 
Un exemple (pour dessiner un quad)
 

Code :
  1. int main( int arg_c, char* arg_v[] )
  2. {
  3.     //-------------------------------------
  4.     // On initialise la matrix de projection
  5.     // Projection orthographique ( en admettant que ta fenêtre est en 800x600)
  6.     // zNear/zFar à - et + 1000 (cf google pour savoir ce que c'est)
  7.     // Comme glOrtho effectue une multiplication, il faut d'abord charger la matrix d'identité (cf google pour les détails)
  8.     glMatrixMode(GL_PROJECTION);
  9.     glLoadIdentity();
  10.     glOrtho(0,800,600,0,-1000.f,1000.f);
  11.     //-------------------------------------
  12.     //-------------------------------------
  13.     // On initialise la matrice modelview
  14.     // Elle est à la fois la matrice qui est utilisée pour la caméra
  15.     // Et celle utilisée pour les transformations du model (rotation/translation/changement d'échelle)
  16.     // Dans cet exemple, on veut just la matrice d'identité (pas de caméra ou quoi)
  17.     glMatrixMode(GL_MODELVIEW);
  18.     glLoadIdentity();
  19.     //-------------------------------------
  20.     //-------------------------------------
  21.     // Boucle principale  
  22.     while ( IsRunning )
  23.     {
  24.         //-----------------
  25.         // Dessin d'une primitive
  26.         // Dans ce cas, un Quad
  27.         // Tu as GL_TRIANGLE pour les tris
  28.         glBegin (GL_QUAD);
  29.         glNormal3f(0.0f, 0.0f, 1.0f); // Normal :  (0,0,-1)
  30.         glVertex3f(0.0f, 0.0f, 0.0f); // Position : (0,0,0)
  31.         glNormal3f(0.0f, 0.0f, 1.0f); // Normal :  (0,0,-1)
  32.         glVertex3f(128.0f, 0.0f, 0.0f); // Position : (128,0,0)
  33.         glNormal3f(0.0f, 0.0f, 1.0f); // Normal :  (0,0,-1)
  34.         glVertex3f(128.0f, 128.0f, 0.0f); // Position : (128,128,0)
  35.         glNormal3f(0.0f, 0.0f, 1.0f); // Normal :  (0,0,-1)
  36.         glVertex3f(0.0f, 128.0f, 0.0f); // Position : (0,128,0)
  37.         glEnd();
  38.         //-----------------
  39.     }
  40.     //-------------------------------------
  41.    // Ici tu rafraîchis ta fenêtre (tout dépend de l'API)
  42. }


 
Donc, dans ton cas, il faudra stocker les infos du modèle dans deux tableaux (un pour les sommets, l'autre pour les indices des triangles) :
 

Code :
  1. struct GLVertex
  2. {
  3.     float Location[3];
  4.     float Normal[3];
  5.     GLVertex(float x, float y, float z, float nX, float nY, float nZ )
  6.     {
  7.       Location[0] = x;
  8.       Location[1] = y;
  9.       Location[2] = z;
  10.       Normal[0] = nX;
  11.       Normal[1] = nY;
  12.       Normal[2] = nZ;
  13.     }
  14. };
  15. struct GLTriangle
  16. {
  17.    int Indices[3];
  18.    GLTriangle( int Index0, int Index1, int Index2 )
  19.    {
  20.       Indices[0] = Index0;
  21.       Indices[1] = Index1;
  22.       Indices[2] = Index2;
  23.    }
  24. };
  25. int main( int arg_c, char* arg_v[] )
  26. {
  27.     std::vector<GLVertex> Vertices;
  28.     std::vector<GLTriangle> Triangles;
  29.     /*================================
  30.       On veut dessiner un quad (cette fois avec des triangles)
  31.    v0     v1
  32.     +-----+
  33.     |\    |
  34.     | \ t0|
  35.     |  \  |
  36.     | t1\ |
  37.     |    \|
  38.     +-----+  
  39.    v3     v2
  40.     Il faut penser à respecter l'ordre (faut que la primitive se fasse  
  41.     en CW (pour t0 d'abords v0, ensuite v1, et enfin v2 et pas dans l'autre sens)
  42.     Normalement, le format STL doit avoir les sommets dans l'ordre cyclique.
  43.     ================================*/
  44.     //--------------------------------
  45.     // Initialisation des tableaux
  46.     Vertices.push_back( GLVertex(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f) );
  47.     Vertices.push_back( GLVertex(128.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f) );
  48.     Vertices.push_back( GLVertex(128.0f, 128.0f, 0.0f, 0.0f, 0.0f, 1.0f) );
  49.     Vertices.push_back( GLVertex(0.0f, 128.0f, 0.0f, 0.0f, 0.0f, 1.0f) );
  50.     Triangles.push_back( GLTriangle(0,1,2) );
  51.     Triangles.push_back( GLTriangle(0,2,3) );
  52.     //--------------------------------
  53.     //-------------------------------------
  54.     // On initialise la matrix de projection
  55.     // Projection orthographique ( en admettant que ta fenêtre est en 800x600)
  56.     // zNear/zFar à - et + 1000 (cf google pour savoir ce que c'est)
  57.     // Comme glOrtho effectue une multiplication, il faut d'abord charger la matrix d'identité (cf google pour les détails)
  58.     glMatrixMode(GL_PROJECTION);
  59.     glLoadIdentity();
  60.     glOrtho(0,800,600,0,-1000.f,1000.f);
  61.     //-------------------------------------
  62.     //-------------------------------------
  63.     // On initialise la matrice modelview
  64.     // Elle est à la fois la matrice qui est utilisée pour la caméra
  65.     // Et celle utilisée pour les transformations du model (rotation/translation/changement d'échelle)
  66.     // Dans cet exemple, on veut just la matrice d'identité (pas de caméra ou quoi)
  67.     glMatrixMode(GL_MODELVIEW);
  68.     glLoadIdentity();
  69.     //-------------------------------------
  70.     //-------------------------------------
  71.     // Boucle principale  
  72.     while ( IsRunning )
  73.     {
  74.         //-----------------
  75.         // Dessin des tris
  76.         glBegin(GL_TRIANGLES);
  77.         for (size_t i=0; i< Triangles.size(); ++i )
  78.         {
  79.             for ( int j=0;j<3;++j )
  80.             {
  81.                 const GLVertex& Vtx = Vertices[ Triangles[i].Indices[j] ] ;
  82.                 glNormal3f( Vtx.Normal.x, Vtx.Normal.y, Vtx.Normal.z );
  83.                 glVertex3f( Vtx.Location.x, Vtx.Location.y, Vtx.Location.z );
  84.             }
  85.         }
  86.         glEnd();
  87.         //-----------------
  88.         // Ici tu rafraîchis ta fenêtre (tout dépend de l'API)
  89.     }
  90.     //-------------------------------------
  91. }


 
 
Je t'invite à zieuter les tutos sur le web pour la gestion de la camera (avec les gluLookAt et les matrix de projection en perspective ).
Normalement tu as tout ce qu'il faut là, il te reste plus qu'à écrire ta fonction pour charger un fichier STL en stockant dans des tableaux les indices & sommets.
Je te conseille de commencer par laisser tomber la normal ( vu que c'est une normal/faces dans ce format, il faudra calculer par sommets) et à la rigueur dessiner ton modèle en wireframe (glPolygonMode(GL_LINE) avant les glBegin/glEnd, pour repasser en mode "normal" faut faire glPolygonMode(GL_FILL) il me semble).
 
 


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 02-02-2014 à 15:32:05    

lethgir a écrit :

Salut,
 
Mais dans ce cas comment l'ouvrir avec OpenGL sous WinDev ?
Oui WinDev m'est imposé !

Toutes mes condoléances!
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-02-2014 à 17:13:13    

@lasnoufle : WinDev est un IDE qui propose son propre langage (le WLanguage), qui est en fait un langage de programmation entièrement en français.
 
@gilou : Perso, je ne trouve pas que cet IDE soit si horrible que ça, j'aprécie même. Le seul soucis est que je suis débutant (que ce soit en WinDev ou en prog, c'est pas avec mes deux ans de BTS que je vais aller loin) et qu'il s'avère donc encore compliqué pour moi de tout saisir du premier coup.
 
@Terminapor :  
Merci beaucoup pour toutes ces précisions, ça m'apporte une belle couche de connaissances sur le fichier STL et OpenGL !
Du coup ça m'aide énormément pour la 3ème solution que j'avais trouvé puisque je n'ai pas besoin de parcourir le code de tout un soft pour trouver ce qui m'intéresse. Sur d'autres forums, on m'a proposé d'utiliser des composants ActiveX, cela me parait plus simple donc je vais d'abord essayer comme ça puis voir si j'arrive à faire ce que je veux avec ce que tu m'as proposé.
Je te redonne des nouvelles dès que j'ai essayé tout ça !

Reply

Marsh Posté le 06-02-2014 à 16:12:05    

J'ai trouvé un moyen de visualiser les fichiers stl :
J'utilise un script javascript qui est dans un fichier .html que je lis avec un champs activeX de type "Microsoft Web Browser" (le champ HTML n'affiche pas le javascript).
Vous trouverez tout sur le script à cette adresse : http://code.google.com/p/jsc3d/
La page html que j'utilise est test.html
 
Ce script fonctionne très bien sous firefox (25) mais je ne sais pas pourquoi, il ne fonctionne pas sous IE (11) et chrome (32) même avec les pages faites pour IE (elles sont faites pour IE 9).
Sous WinDev, il ne fonctionne pas non plus, voici l'erreur que j'ai :
L'objet ne gère pas la propriété ou la méthode "addEventListener".
 
Ensuite, la page charge tout de même mais lorsque je souhaite charger un fichier, il m'affiche l'erreur :
Impossible d'obtenir la propriété "replaceSceneFromUrl" d'une référence null ou non définie.
 
Je m'y connais vraiment très peu en javascript et j'ai un peu cherché sur google, je n'ai pas vraiment trouvé de solution pour WinDev (surtout pour IE).
 
Merci d'avance !
 
 
 

Reply

Marsh Posté le 07-02-2014 à 11:54:40    

Euh, Windev ne fait pas de JS je crois :??:
 
Dans tout les cas, il m'est d'avis que ton professeur ne t'a surement pas demandé d'implémenter du code trouvé sur internet, n'est-ce pas ?
Quel langage vous a été demandé ? Et est-ce que vous avez eu des cours sur la 3D déjà ?


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 11-02-2014 à 08:26:54    

WinDev utilise le moteur d'internet explorer pour afficher le JS ;).
 
Mon professeur me laisse en autonomie étant donné qu'il s'agit d'un projet dans le cadre de l'obtention du BTS.
Je fais donc comme je peux pour trouver un moyen de passer au dessus des problèmes.
Les seules précisions que j'ai sont d'utiliser WinDev.
Je n'ai jamais eu de cours sur le 3D, avant de chercher un peu je ne savais pas du tout comment cela fonctionnait :).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed