Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1433 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Modeleur Volumique - Infos Idées & OpenCSG

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Modeleur Volumique - Infos Idées & OpenCSG

n°1448616
asseforeve​r
Nostalgique
Posté le 28-09-2006 à 10:34:17  profilanswer
 

Bonjour,
 
J'ai pour projet de créer un modeleur 3D multiplateforme basé sur C++. :love:  
Je compte utiliser OpenGL et wxWidgets pour la forme et OpenCSG pour le fond.
 
Je compte faire évoluer le topic au fur et à mesure de mes avancements :

  • Interface :) tout OK.
  • Affichage 3D :) sauf éclairage et textures...
  • Chargement/Enregistrement  :sleep:  
  • Picking  :) OK
  • Arbre CSG (besoin d'aide !)  :pt1cable:  


===========================================================
 

  • Mon programme devra permettre l'assemblage de blocs simples (parallélépipèdes) par placage (surface contre surface), j'ai donc prévu de faire choisir à l'utilisateur une face, et d'y rajouter un bloc. Je n'ai pas trouvé de fontion existantes pour ce problème, j'ai donc prévu de projeter les blocs sur la surface de l'écran et de calculer en fonction de la position de la souris quel bloc *visible* à été choisi. Je n'ai pas encore de résultat. Est-ce la solution, comment la mettre en oeuvre ?

>> spotaszn : méthode du Picking
>> Méthode mise en place et fonctionnelle.
 

  • Dans la meme optique de modelisation, afin d'eviter des erreurs d'arrondis lors du placage je comptais modifier mes modèles pour obtenir 1 seul bloc objet si désiré. Comment procéder pour obtenir ce résultat ?

>> Je compte utiliser la bibliothèque OpenCSG qui correspond assez bien à mon problème. Elle permet d'effectuer les opération booléennes dont j'ai besoin, l'implémentation serait un arbre avec une opération à chaque noeud et des modèles 3D simples à ses feuilles. Je recherche des exemples, j'ai du mal à avoir un quelconque résultat...  :sweat:  
 

  • Autre question : l'utilisateur pourra avoir le choix du type de traits des figures : plein, arêtes ou points. Mes blocs seront le plus souvent des parallélépipèdes, mais je me demandais si les modes GL_QUADS_STRIP ou GL_QUADS sont les mieux ?

>> bb138les XXX_STRIP sont plus performants au niveau du rendu 3D.  
>> Distinction des 3 cas dans l'algorithme lors de l'affichage à l'écran. Mais affichage face par face lors du lors du picking.
 

  • Enfin mon programme devra enregistrer les données, existe-t-il une méthode meilleure qu'une autre pour enregistrer des données 3D (+infos) ?

>> spotazsn : un format style "vrml" pourrait être pratique...
>> Pourquoi pas, je vais me créer un format en attendant, je n'ai pas encore fixé les limites de mon programme et j'ai pas encore implémenté la CSG...
 
Merci de m'aider à m'orienter dans mes décisions.  :jap:


Message édité par asseforever le 23-10-2006 à 14:26:30
mood
Publicité
Posté le 28-09-2006 à 10:34:17  profilanswer
 

n°1448637
spotaszn
Posté le 28-09-2006 à 11:12:06  profilanswer
 

Salut,
Donc, point par point...
- tu vas faire ce qu'on appelle du picking... pour cela, en openGL, il y a quelques fonctions : glSelectBuffer, glRenderMode, gluPickMatrix, glInitNames, glLoadName, glPushName, glPopName... Tu trouveras de nombreux exemples avec Google (Picking/OpenGL).
- il s'agit d'opérations booléennes (des unions, dans ce cas), pour des boîtes, ça doit pas être trop compliqué mais je me demande si c'est vraiment judicieux voire utile.
- perso, j'utilise les fonctions de tracé de lignes (GL_LINES) et de points (GL_POINTS) pour les rendus "non-plein"...
- il existe de nombreux format 3D simples à utiliser, perso, je préfère réinventer la roue à chaque fois... si t'as un parser XML sous la main, un format style "vrml" pourrait être pratique...

n°1448655
bb138
La vie est belle ...
Posté le 28-09-2006 à 11:34:39  profilanswer
 

Salut !
Tout d'abord je te souhaite bon courage  :)  
Je ne te dirais pas grand chose concernant tes questions si ce n'est que les XXX_STRIP sont plus performants au niveau du rendu 3D.
A part ça, as-tu pensé à un arbre de scène pour pouvoir gérer plus simplement tous tes objets ?

n°1448657
asseforeve​r
Nostalgique
Posté le 28-09-2006 à 11:35:20  profilanswer
 

Citation :

tu vas faire ce qu'on appelle du picking... pour cela, en openGL, il y a quelques fonctions : glSelectBuffer, glRenderMode, gluPickMatrix, glInitNames, glLoadName, glPushName, glPopName... Tu trouveras de nombreux exemples avec Google (Picking/OpenGL).

Déjà m'arrange bien que ca existe déjà, j'espère que je trouverai assez d'exemples, je vais aller me renseigner.

Citation :

- il s'agit d'opérations booléennes (des unions, dans ce cas), pour des boîtes, ça doit pas être trop compliqué mais je me demande si c'est vraiment judicieux voire utile

Je pense que cela peut etre utile car j'ai déjà essayé de créer un mini modeleur en inscrivant les coordonnées une par une et aux jointures des pièces il y a de gros problèmes d'arrondis que je n'ai pas su résoudre. La création des unions de boites qui se touchent pas à un arrondi de 0.0000001 est impossible  :sweat:  

Citation :

- perso, j'utilise les fonctions de tracé de lignes (GL_LINES) et de points (GL_POINTS) pour les rendus "non-plein"...

ok pour GL_LINES mais je peux dire adieu à GL_QUAD_STRIP (la méthode pour relier les points n'est plus compatible)

Citation :

- il existe de nombreux format 3D simples à utiliser, perso, je préfère réinventer la roue à chaque fois... si t'as un parser XML sous la main, un format style "vrml" pourrait être pratique...


Je n'ai encore jamais imaginé une méthode d'enregistrement (j'ai meme jamais appris je crois !) mais je vais voir comment je peux me débrouiller, pour l'instant j'en suis pas encore la.
 
Merci déjà mais je veux bien d'autres avis ^^

n°1448660
asseforeve​r
Nostalgique
Posté le 28-09-2006 à 11:40:44  profilanswer
 

bb138 a écrit :


Tout d'abord je te souhaite bon courage  :)  
A part ça, as-tu pensé à un arbre de scène pour pouvoir gérer plus simplement tous tes objets ?


Merci, Oui, c'est d'ailleurs la première chose que j'ai pensé, arbre, arêtes et couleurs...

n°1448706
bb138
La vie est belle ...
Posté le 28-09-2006 à 12:51:11  profilanswer
 

Concernant ton problème d'arrondi, je te conseille de ne pas utiliser une égalité stricte mais un intervalle avec l'utilisation d'un epsilon (=10^-6 par exemple).
Avec cette approximation tu devrais pouvoir t'ne sortir un peu plus facilement mais dans ce cas il te faudra peut-être abandonner les QUAD pour des TRIANGLE pour éviter les problème de coplanéité...

n°1448711
spotaszn
Posté le 28-09-2006 à 12:59:08  profilanswer
 

Citation :

Je pense que cela peut etre utile car j'ai déjà essayé de créer un mini modeleur en inscrivant les coordonnées une par une et aux jointures des pièces il y a de gros problèmes d'arrondis que je n'ai pas su résoudre. La création des unions de boites qui se touchent pas à un arrondi de 0.0000001 est impossible  :sweat:


 
C'est sûr qu'il faut faire preuve d'une certaine tolérance (Epsilon) si tu veux faire des opérations booléennes dans le monde des flottants... Je ne sais pas qu'elle est le but de ton modeleur mais si tu veux une réelle précision dans tes assemblages de boîtes, il va falloir garder des informations de plus haut niveau comme la description de l'assemblage lui-même (les points d'ancrage, les faces assemblées, etc.) Ensuite, pour l'affichage et le picking, tu peux bien sûr garder des coordonnées relatives ou absolues...

n°1448801
asseforeve​r
Nostalgique
Posté le 28-09-2006 à 14:39:27  profilanswer
 

OK pour les tolérances, l'an passé quand j'avais essayé j'avais échoué lamentablement, cette fois ci j'ai du temps, faut que je fasse quelque chose de mieux.
 
Je vais avancer le projet petit à petit. Donc j'ai créé une boite de dialogue simple demandant longueur, hauteur, largeur, couleur et style de trait (Plein, Arêtes ou Points).
Pour contourner le problème des traits, il me faut utiliser :
GL_QUADS pour "Plein"
GL_LINE_LOOP pour "Arêtes"
GP_POINTS pour "Points"
et dans ce cas dessiner les faces une par une.
Comme c'est une des bases du prog, je voudrais être certain qu'il n'existe rien de mieux.


Message édité par asseforever le 28-09-2006 à 14:39:42
n°1448814
spotaszn
Posté le 28-09-2006 à 14:48:52  profilanswer
 

Pense juste à ne pas repasser plusieurs fois sur les même arêtes... Pour une boîte, il te faut deux GL_LINE_LOOP et quatre GL_LINES, par exemple... Tu peux aussi tenter de faire mieux avec un GL_LINE_STRIP et trois GL_LINES...

n°1448843
asseforeve​r
Nostalgique
Posté le 28-09-2006 à 15:06:17  profilanswer
 

Je suis en train de chercher un solution, mais je me demande si je vais en trouver une. Je vais devoir faire 3 cas je pense et je privilégie donc les _STRIP.
 
Nouveau Défi : Dessiner un cube sans lever le crayon ;) (GL_LINE_LOOP quand tu nous tiens)

Message cité 1 fois
Message édité par asseforever le 28-09-2006 à 15:18:38
mood
Publicité
Posté le 28-09-2006 à 15:06:17  profilanswer
 

n°1449157
spotaszn
Posté le 28-09-2006 à 21:55:33  profilanswer
 

asseforever a écrit :

Nouveau Défi : Dessiner un cube sans lever le crayon ;) (GL_LINE_LOOP quand tu nous tiens)


 
Ce n'est pas possible, il faudrait que ton graph ait 0 ou 2 sommets de degré impair... Il en a 8... pas de bol ! :)

n°1449321
bb138
La vie est belle ...
Posté le 29-09-2006 à 09:24:54  profilanswer
 

Tu peux juste expliquer en deux mots ce que sont des sommets de degré impair ?
Merci :)

n°1449475
spotaszn
Posté le 29-09-2006 à 11:16:09  profilanswer
 

ce sont des sommets qui font la jonction d'un nombre impair d'arêtes...

n°1449499
bb138
La vie est belle ...
Posté le 29-09-2006 à 11:27:32  profilanswer
 

Merci !

n°1451907
asseforeve​r
Nostalgique
Posté le 04-10-2006 à 09:45:26  profilanswer
 

Lorsque je mets en place le picking, je dois distinguer les objets pour lesquels je veux recevoir un 'hit', mais suis-je obligé de créer un second algirithme de dessin pour avoir les faces distinctes ?

n°1451948
spotaszn
Posté le 04-10-2006 à 10:29:32  profilanswer
 

Je pense que tu vas devoir en effet les distinguer lors du "rendu de sélection" mais tu peux aussi utiliser un picking par couleur (en plus du rendu de sélection)... Perso, je préfère utiliser des glLoadName pertinents...

n°1454648
asseforeve​r
Nostalgique
Posté le 10-10-2006 à 08:53:26  profilanswer
 

Merci, j'ai enfin réussi à faire quelque chose d'opérationnel, j'ai encore un petit souci de données. Lors du picking, on empile un numéro dans la pile avec pushname, puis on fait des loadnames et on termine avec popname. Avec le système de buffer, je n'ai pu récupérer que les loadnames, peut on avoir les noms empilés ?

Code :
  1. int CorrectHit(GLint hits, GLuint buffer[])
  2. {
  3.     GLuint names, *ptr;
  4.     long minz;
  5.     int nom;
  6.     ptr = (GLuint *) buffer;
  7.     if ( hits == 1 ) return *(ptr + 3); // si un seul
  8.     minz = *(ptr + 1);
  9.     nom = *(ptr + 3);
  10.     for (int i = 0; i < hits; i++) {
  11.         if ( (int) *ptr < minz ) { // prends le plus petit
  12.             minz = *ptr;
  13.             nom  = *(ptr + 2);
  14.         }
  15.         ptr += 3;
  16.     }
  17.     return nom;
  18. }

Cette fonction ne retourne que les loadnames, les pushname sont ils inscrits dans le buffer ?

Message cité 1 fois
Message édité par asseforever le 10-10-2006 à 10:25:40
n°1454678
spotaszn
Posté le 10-10-2006 à 09:45:14  profilanswer
 

asseforever a écrit :

Cette fonction ne retourne que les loadnames, les pushname sont ils inscrits dans le buffer ?


 
Oui, la pile complète est posée dans le buffer... et c'est tout l'intérêt !
Cette URL est sympa http://medialab.di.unipi.it/web/IU [...] ode87.html

n°1454702
bb138
La vie est belle ...
Posté le 10-10-2006 à 10:32:38  profilanswer
 

Au fait, j'ai travaillé pas mal de temps avec OpenSG. C'est vrai que c'est orienté multi-plateformes multi-noeuds et RV mais il y a tout plein de choses intéressantes (arbre de scène, optimisations OpenGL, shader et surement d'autres choses ont évoluée depuis que je ne l'ai plus utilisé !)

n°1454707
asseforeve​r
Nostalgique
Posté le 10-10-2006 à 10:36:55  profilanswer
 

spotaszn a écrit :

Oui, la pile complète est posée dans le buffer... et c'est tout l'intérêt !


 
Ben, ca me semblait pas logique aussi, mais bon... Donc déjà je vais devoir revoir ma fonction, ca n'est pas un souci mais le truc qui m'a fait trompé je ne le comprends pas, voici une autre fonction qui elle indique les piles successives :

Code :
  1. void AfficheHits(GLint hits, GLuint buffer[])
  2. {
  3.    GLuint names, *ptr;
  4.    printf("hits = %d\n", hits);
  5.    ptr = (GLuint *) buffer;
  6.    for (int i = 0; i < hits; i++) {
  7.       names = *ptr;
  8.       printf(" number of names for hit = %d\n", names); ptr++;
  9.       printf("  z1 is %g;", (float) *ptr/0x7fffffff); ptr++;
  10.       printf(" z2 is %g\n", (float) *ptr/0x7fffffff); ptr++;
  11.       printf("   the name is " );
  12.       for (int j = 0; j < names; j++) { // s'occupe des piles
  13.          printf("%d ", *ptr); ptr++;
  14.       }
  15.       printf("\n" );
  16.    }
  17. }


en fait mon souci est la :
dans l'initialisation j'ai :

Code :
  1. glRenderMode(GL_SELECT); // on passe en mode sélection
  2.     glInitNames(); // initialiser la pile des noms.
  3.     glPushName(0); // on empile qqchose dans la matrice de noms sinon erreur avec le glLoadName


et dans ma fonction dessin :

Code :
  1. glPushName(1);
  2.             glLoadName(1);
  3.             DessineFacette ();
  4.             ...
  5.             glLoadName(6);
  6.             DessineFacette ();
  7.             glPopName();


Et ma fonction Affichehits, donne pour la pile 0 6 (pour la facette 6) et non 0 1 6.
 
J'ai fait des test et plus généralement, le pushname précédent le loadname n'est pas affiché dans la pile, c'est normal ?

n°1454713
spotaszn
Posté le 10-10-2006 à 10:43:28  profilanswer
 

asseforever a écrit :

J'ai fait des test et plus généralement, le pushname précédent le loadname n'est pas affiché dans la pile, c'est normal ?


 
Oui, c'est ainsi qu'elle est définie dans la doc... glLoadName remplace le haut de la pile...

n°1454719
asseforeve​r
Nostalgique
Posté le 10-10-2006 à 10:49:55  profilanswer
 

spotaszn a écrit :

Oui, c'est ainsi qu'elle est définie dans la doc... glLoadName remplace le haut de la pile...


 :sweat: Argh, si c'est dans la doc et que je l'ai pas vu, je suis impardonnable ! En tout cas merci, je m'en tire finalement pas si mal de cette erreur...
Ce qui m'étonne c'est j'avais du le lire, puisque j'avais mis qqch dans la pile pour eviter l'erreur du glLoadname mais que je me souvenais plus pourquoi je faisais ca  :(


Message édité par asseforever le 10-10-2006 à 11:18:06
n°1455480
asseforeve​r
Nostalgique
Posté le 11-10-2006 à 14:37:25  profilanswer
 

Avant que j'aille trop loin y'a un truc auquel j'ai pas pensé, c'est la possibilité multilingue, pas que cela me soit carrément utile, mais, la méthode m'interresse.
En gros je créé des tableaux, et selon un id de langue, je choisis une case.
Est-ce la seule méthode viable ?


Message édité par asseforever le 11-10-2006 à 14:41:05
n°1455582
spotaszn
Posté le 11-10-2006 à 16:27:02  profilanswer
 

C'est bien de penser à l'internationalisation dès les premières lignes... Perso, je suis partisan des "fichiers de langue"... A la place de toutes les chaînes que tu affiches à l'utilisateur tu fais appel à une fonction à qui tu passes un "identifiant de chaîne"... Cette fonction devra te retourner la chaîne extraite du fichier de langue choisi par l'utilisateur et identifiée par l'identifiant de chaîne.
Pour information, sous Windows, on utiliserait des "string tables" stockées dans un fichier de ressources (une "dll" ) et des appels à "LoadString"... Mais un fichier de langue dans un format texte lisible sera plus pratique pour ajouter de nouvelles langues.

n°1455631
tbp
Posté le 11-10-2006 à 17:05:22  profilanswer
 

VRML? Format proprietaire?
Je crois qu'il est temps que je me lance dans le lobbying pour un export triangulé en .obj ce qui offre la garantie de pouvoir importer le bazar à peu près partout - notament dans mon rtrt ;)
 
Exporter des triangles avec le minimum syndical au niveau hierarchique est d'une simplicité enfantine.
Wavefront, la specification: http://www.martinreddy.net/gfx/3d/OBJ.spec
Optionnelement les materiaux: http://www.fileformat.info/format/material/


Message édité par tbp le 11-10-2006 à 17:05:37
n°1458688
asseforeve​r
Nostalgique
Posté le 17-10-2006 à 13:59:00  profilanswer
 

J'ai encore quelques interrogations à vous soumettre :
- le fichier de traductions avec des indentifiant chiffrés ou lettrés ?
(je demande à mon prog d'aller lire le fichier de langue et de renvoyer le message dont la ligne commence par l'identifiant "XX" (un chiffre, plus rapide, moins lisible dans le programme et plus difficile encore à traduire) ou par "abcdef" (une abbréviation, plus long, mais plus agréable à lire...)
 
- les coordonnées il vaut mieux les enregistrer en relatives ou absolues ?

n°1459068
spotaszn
Posté le 17-10-2006 à 19:13:54  profilanswer
 

Je choisirais de faire une gestion des langues la plus "human-friendly" possible (identifiants texte dans un fichier texte) car ça ne doit pas être le goulet d'étranglement de ton application sinon, c'est qu'il y a un sérieux problème de conception... :) C'est sûr qu'un fichier "binaire" avec des identifiants numériques serait plus performant lors du chargement, mais bon... 'faut pas déconner !
 
Pour tes coordonnées, je travaillerais en relatif pour rester dans la plage la plus précise des "float" (ou "double" )...

n°1464613
asseforeve​r
Nostalgique
Posté le 25-10-2006 à 10:40:54  profilanswer
 

J'ai décidé de faire les deux posibilités :
ce qui me donne un fichier :
index abrev = message
soit :
0001 hellow! = Hello world !
Comme ca marche, je vais laisser ca comme ca on verra après !

n°1464614
asseforeve​r
Nostalgique
Posté le 25-10-2006 à 10:44:46  profilanswer
 

J'ai une question qui concerner les wxDC et wxCanvas, étant donné qu'il n'est pas possible nativement d'écrire du texte dans OpenGL, la fonctionnalité est présente avec la fonction DrawText() de wxDC.
Est-ce que cela peut fonctionner :  

((wxDC *)this)->DrawText(_("OK" ),100,100);


avec "this" un wxCanvas ?
Je n'ai pas de message à la compilation mais je n'ai rien à l'écran, j'ai surement oublié un truc...

n°1466528
asseforeve​r
Nostalgique
Posté le 28-10-2006 à 08:51:53  profilanswer
 

Bon le problème c'était pas grand  chose, juste une meilleure déclaration :

wxClientDC dc(this*);
dc.DrawText(_("OK" ),100,100);

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Modeleur Volumique - Infos Idées & OpenCSG

 

Sujets relatifs
Infos IPTC de photos et caractères accentués ...Des infos ou une explication sur les Web Services et sur WSDL
infos: mettre du php sur mon site pour des accès réservé ?[JFileChooser] récupérer des infos !
Afficher des infos dans un form à partir d'une BDRecuperation d'infos de plusieurs formulaires
besoin d'infos sur la sortie serie et les souris series...Bulle d'infos sur lien de carte-image
Ressortir les infos membres d'une base IPB[VBS + LDAP + HTML] Récupération des infos utilisateurs d'un AD
Plus de sujets relatifs à : Modeleur Volumique - Infos Idées & OpenCSG


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR