# Applications > Dveloppement 2D, 3D et Jeux > Moteurs 3D >  Cration de mesh complexes par programmation

## kami58

Bonjour  tous.  :;): 

Quel que soit le moteur 3D/bibliothque 3D, ds qu'il s'agit de crer des meshs par programmation, je vois toujours passer sur les tutos les mmes exemples simples style cylindre/cube/cone ....

Je prends pour exemple mon besoin, lie au dveloppement d'une petite application CAD/CAM, permettant l'affichage 3D temps rel d'usinages sur des pices mcaniques.

Par exemple, si on parle d'une tle, je connais sa longueur/largeur/paisseur. Jusque l pas de soucis. Je veux maintenant crer un trou de perage dedans. L'utilisateur me donne dans une fentre la position du centre de perage, le diamtre, et la profondeur (on peut imaginer un perage non dbouchant). Et l, je commence  me casser les dents  ::aie:: 
Rien que dj crer par programmation un trou dans un volume de type parallpipde, a se complique ...  ::cry::  ::cry:: 

Qqn a-t'il des explications plus prcises (voire un exemple de code  ::D:  )  me fournir pour crer les vertices associe  cette opration ?

Question bonus  ::mrgreen::  N'est-il pas plus simple dans mon cas de crer un mesh par soustraction ? Les moteurs 3D savent-ils grer ce mcanisme ?

Merci  ::zoubi::

----------


## seeme

Ce que tu demande dpasse largement le cadre d'un moteur 3D qui se contente d'afficher les informations.

Pour ton exemple prcis un premier problme est que tu te retrouves avec une forme concave, donc dj pleins de problmes en perspective (en tout cas baisse des perfs).

Pour le cas d'un perage, il faudrait calculer les points d'intersection entre ton paralllpipde et un cylindre (tu rsous un systme en fait) sachant qu'ensuite il faudra dterminer un niveau de prcision (il y a une infinit de solutions si effectivement le cylindre intersecte la boite.. il faut en garder un nombre suffisant).

Bref, c'est bien plus compliqu que a en  l'air.. Tu utilises quel moteur? Il embarque peut-tre des solutions boolennes (auquel cas ce n'est plus un moteur 3D).

Pourquoi ne pas utiliser des logiciels ddis (Cathia...)?

----------


## kami58

En fait, je suis  la recherche du moteur 3D  utiliser  :;):  (cf un vieux post sur le fofo ....).

Et non, CATIA est un logiciel de CAO pour faire de la conception/modlisation. Moi je cherche  intgrer une fentre d'affichage 3D  mon logiciel que je peux programmer et qui me permet de faire de la 3D temps rel  partir de paramtres gomtriques/mcaniques.
En gros je veux programmer un CATIA  ::mouarf::  ::mouarf::  ... (nan rien d'aussi compliqu, je gre des cas plus simples ouf)... Et non un moteur 3D sait faire ce genre de chose (exemple du ManualObject sous Ogre), j'ai dj gnr un grand nombre de formes complexes via des fonctions mathmatiques.... mais il faut les trouver, et donc a a ses limites  ::aie:: 

Moi je recherche pour mon environnement C# un moteur 3D que je peux programmer, et pour lequel je peux crer des meshs paramtriques.
Et effectivement, je tombe souvent sur des gomtries un peu complexes (mais pas non plus insurmontables).
Et comme tu le prcise, je recherche le moteur 3D programmable si possible qui permet d'effectuer des oprations boolennes, ou permettant de construire un mesh par CSG (le nec plus ultrat  ::ccool:: ).

Dans ma recherche, je passe en revue des moteurs 3D style Ogre/TV3D, mais aussi des environnements de dveloppement plus spcialiss (mais plus chers) comme OCC/OpenInventor/Hoops ...

----------


## kami58

Bon, vu que les rponses se bousculent pas  ::roll:: , je reformule la question :
Existe-t'il des bibliothques C# permettant d'effectuer des oprations boolennes / CSG (Constructive Solid Geometry), que je pourrai intgrer ventuellement  mon code en complment du moteur 3D que j'utilise.
Existe-til sinon des moteurs 3D du march intgrant directement ce type de bibliothques ?

Exemple type : crer par programmation un mesh rsultat de l'intersection d'un parallpipde et d'un cylindre, quel que soit l'axe du cyclindre.

Merci de vos rponses  ::ccool::

----------


## Mat.M

> Dans ma recherche, je passe en revue des moteurs 3D style Ogre/TV3D, mais aussi des environnements de dveloppement plus spcialiss (mais plus chers) comme OCC/OpenInventor/Hoops ...


OGRE ne sera pas d'une grande utilit enfin si oui on peut le prendre..
mais cela risque d'tre une surcouche inutile...
moins je taperais directement dans Open GL il y a suffisament de tutos pour afficher des formes complexes et grer l'affichage pour se passer d'un truc comme OGRE.
Et en plus tu fais ce que tu veux.
Il y a par exemple les tutos de Nehe.
Pour ce qui est des oprations sur les formes 3d il faut effectuer des oprations mathmatiques sur les matrices..




> Exemple type : crer par programmation un mesh rsultat de l'intersection d'un parallpipde et d'un cylindre, quel que soit l'axe du cyclindre.
> 
> Merci de vos rponses


aucun moteur de jeu ne permet de faire cela...
il faut voir plutot dans des bibliothques de gomtrie mais je doute qu'on puisse trouver cela..
il faudrait chercher dans google "cad libraries"
il est facile de crer un "mesh" de toute pices sous OPen GL

----------


## seeme

Juste en passant...

Ogre est un moteur de jeu qui embarque un moteur 3D  ::aie::  Ma rponse reste donc parfaitement valable.

----------


## Mat.M

> Juste en passant...
> 
> Ogre est un moteur de jeu qui embarque un moteur 3D  Ma rponse reste donc parfaitement valable.



oui je le sais parfaitement merci !
Mais franchement j'aurais des rticences  utiliser toute une usine--gaz pour faire ce genre de choses.
Parce qu'avec OGRE tu vas appeler des fonctionnalits qui ne seront pas forcment utiles et qui vont alourdir le code..
Maintenant si tu veux prendre OGRE rien ne t'empche !

----------


## plegat

> Mais franchement j'aurais des rticences  utiliser toute une usine--gaz pour faire ce genre de choses.


+1

De toute faon, d'aprs ce que je comprends, ce n'est pas le moteur 3D qui pose problme, mais plutt la gnration des mesh complexes.

Le seul "truc" que je connaisse qui fasse a est OpenCascade (qui est gratuit si je ne m'abuse), et pour lequel il semble exister un wrapper C#. Aprs, c'est une usine  gaz au mme titre qu'un moteur 3D, a gre de l'affichage, de l'import/export, du maillage, etc etc.

Je suis actuellement (hum... un actuellement qui dure depuis quelques annes toutefois...) sur le mme problme, et encore en pleine phase de rflexion. Pour les intersections simples (plan/cylindre/conique), a se "calcule" assez facilement, au pire en discrtisant les cercles et autres ellipses. Aprs si tu as besoin de faire des intersection de nurbs, j'en suis encore  essayer de comprendre comment a fonctionne, donc je ne te serai d'aucune aide...

Je suis le sujet avec intrt toutefois... je suis intress si quelqu'un trouve quelque chose...  :;):

----------


## kami58

Oui j'ai cru voir que OCC grait ce genre de choses (et oui ils ont un wrapper C#) ...
Le pb d'OCC est son dynamisme sur le march (pas de nlle version depuis 2 ans je crois)... De plus oui c'est une usine  gaz  ::mrgreen:: 
Sinon je travaille un peu sur Hoops3D (Tech Soft 3D), ils ont une gestion des shells et des oprations boolennes sur ces objets (j'ai pas encore test  vraid dire).

Mais bon ces 2 solutions sont des outils commerciaux (OCC fait payer le support, l'intgration d'un moteur de collisions et la mise  dispo du wrapper C#  ::(:  ). Donc effectivement, faire ca par moi meme ca me tenterait plus  ::): 

Par contre je suis super interess par ce que tu me dit : intersection plan/cylindre par exemple .... Les algos sont complexes ?
Une fois tes points d'intersections calculs, comment tu gnre ton maillage (tu as des fonctions de tesselation spcifique ?)

Merci  ::ccool::

----------


## plegat

> intersection plan/cylindre par exemple .... Les algos sont complexes ?
> Une fois tes points d'intersections calculs, comment tu gnre ton maillage


Si on part sur une intersection plan/cylindre, on sait que a donne une ellipse (ou un cercle, mais ce n'est qu'une ellipse particulire), dont les caractristiques peuvent se calculer en fonction des paramtres du plan et du cylindre.

Une fois que tu connais ton ellipse, tu discrtises son contour (par exemple un noeud tous les x mm), et tu triangules ton plan avec un contour interne impos sur l'ellipse. Au final, tu enlves les triangles formant l'intrieur de l'ellipse, et tu as ta surface perce.
Ca a l'air simple dit comme a... mme si ce n'est pas hyper compliqu, il y a quand mme un peu de boulot "thorique" (en particulier sur la triangulation, mais rien de sorcier, un delaunay se comprend facilement).

Comme je l'ai prcis dans mon prcdent post, je suis encore en phase de rflexion, mais les diffrentes tapes ont bien fonctionn dans des projets prcdents, donc a ne devrait pas bloquer. Je suis plutt en train de rflchir  la gestion des donnes afin que l'algorithme soit le plus polyvalent possible sans trop de modifications (genre savoir grer une portion de cylindre aussi simplement qu'un plan...)
Ensuite faudra rflechir  comment grer une intersection cylindre/cylindre...  ::):

----------


## kami58

> Si on part sur une intersection plan/cylindre, on sait que a donne une ellipse (ou un cercle, mais ce n'est qu'une ellipse particulire), dont les caractristiques peuvent se calculer en fonction des paramtres du plan et du cylindre.
> 
> Une fois que tu connais ton ellipse, tu discrtises son contour (par exemple un noeud tous les x mm), et tu triangules ton plan avec un contour interne impos sur l'ellipse


Jusque l je te suis pas de soucis, mme si cela reste effectivement trs thorique  ::D:  Il faut quand mme trouver le maillage triangulaire entre les 4 pts de ton contour externe rectangulaire, et les x pts internes de ton ellipse....  ::?: 
Et puis si ton cylindre traverse un parallpipde, faut grer a sur les 2 plans, puis grer le cylindre interne.




> Au final, tu enlves les triangles formant l'intrieur de l'ellipse, et tu as ta surface perce.


Quand tu dis que tu les enlves .... c'est une action openGL particulire pour supprimer un triangle, ou tout simplement tu veux dire que tu ne gnre pas le triangle ?




> Ca a l'air simple dit comme a... mme si ce n'est pas hyper compliqu, il y a quand mme un peu de boulot "thorique" (en particulier sur la triangulation, mais rien de sorcier, un delaunay se comprend facilement).


Delaunay ? Kesako ? Un p'tit Google s'impose je crois ...




> Comme je l'ai prcis dans mon prcdent post, je suis encore en phase de rflexion, mais les diffrentes tapes ont bien fonctionn dans des projets prcdents, donc a ne devrait pas bloquer. Je suis plutt en train de rflchir  la gestion des donnes afin que l'algorithme soit le plus polyvalent possible sans trop de modifications (genre savoir grer une portion de cylindre aussi simplement qu'un plan...)


C'est dj pas mal !  ::ccool:: 
Le pb est que je voudrais savoir si ce genre de manip tue les performances sur une appli 3d temps rel ? car  terme, sur des cas rel, j'aurai  grer des pices avec quasiment une centaine de perages !...  ::?: 
Donc faut imaginer le calcul, et si j'en reviens  la tesselation, il faut imaginer le cas thorique o tu peux avoir une centaine d'ellispses sur ton plan, et faut gnrer le maillage adquat ....  ::(: 




> Ensuite faudra rflechir  comment grer une intersection cylindre/cylindre...


Arghh .... Ma premire question tait un cas de base cylindre/plan, mais je sais que s'appli pour laquelle je bosse, je dois aller vers du cylindre/cylindre (gestion des "gueules de loup")  ::calim2::

----------


## Camel LowFilter

Pour ton trou dans ta tle je vois une manire trs simple de faire le calcul: (plus simple que de percer un plan et se taper une triangulation)

Si on part du principe que la forme ondule de la tle est une suite de segments parallles relis les uns aux autres par des rectangles trs fins, et que la finesse du rectangle dpend de la rsolution choisie, alors y'a pas  calculer la forme du trou  l'intrieur de ces rectangles car on descend pas en dessous de cette rsolution, y'a juste  relier les points avec deux lignes droites

tu calculs juste les intersections entre le cylindre et ces segments parallles qui dfinissent la tle, ensuite t'as plus qu' relier les points en clatant chaque rectangle fin en 2 quadrilateres

----------


## Camel LowFilter

si tu cherches une solution gnrique qui sait tout faire alors voir oprations boolennes entre deux maillages

la source doit pouvoir se trouver

----------


## Ange_blond

Bonjour,

J'arrive un peu comme un cheveux sur la soupe, mais le moteur OSG a un NodeKit OSGModelling (http://code.google.com/p/osgmodeling/) qui fait un peu de CAD.
Le projet n'est pas encore officiellement releas je crois, mais il y a dej pas mal de boulot de fait.

Bon courage.

----------


## kami58

> Pour ton trou dans ta tle je vois une manire trs simple de faire le calcul: (plus simple que de percer un plan et se taper une triangulation)
> 
> Si on part du principe que la forme ondule de la tle est une suite de segments parallles relis les uns aux autres par des rectangles trs fins, et que la finesse du rectangle dpend de la rsolution choisie, alors y'a pas  calculer la forme du trou  l'intrieur de ces rectangles car on descend pas en dessous de cette rsolution, y'a juste  relier les points avec deux lignes droites
> 
> tu calculs juste les intersections entre le cylindre et ces segments parallles qui dfinissent la tle, ensuite t'as plus qu' relier les points en clatant chaque rectangle fin en 2 quadrilateres


Nan car ce cas est trop simpliste. j'ai pris a en exemple, mais j'ai des formes plus complexes  grer : tles dformes, cylindres croiss, ...




> si tu cherches une solution gnrique qui sait tout faire alors voir oprations boolennes entre deux maillages
> 
> la source doit pouvoir se trouver


J'ai dj cherch je t'assure  ::D: 
Il existe OpenCSG ventuellement en C++, donc bof bof pour le portage C#  ::?: 




> Bonjour,
> 
> J'arrive un peu comme un cheveux sur la soupe, mais le moteur OSG a un NodeKit OSGModelling (http://code.google.com/p/osgmodeling/) qui fait un peu de CAD.
> Le projet n'est pas encore officiellement releas je crois, mais il y a dej pas mal de boulot de fait.
> 
> Bon courage.


Merci pour l'info c'est tres interessant  ::D: 
J'avais retenu OpenSceneGraph comme ventuelle solution car il disposait d'un wrapper C#. Par contre le tps que ce modeler soit finalis, et que le wrapper C# pour l'API mis  jour .... Trop tard peut etre  ::?:

----------


## plegat

> Jusque l je te suis pas de soucis, mme si cela reste effectivement trs thorique  Il faut quand mme trouver le maillage triangulaire entre les 4 pts de ton contour externe rectangulaire, et les x pts internes de ton ellipse....


a, ce n'est pas ce qui m'inquite le plus. A la limite, c'est le plus simple!  :;): 




> Et puis si ton cylindre traverse un parallpipde, faut grer a sur les 2 plans, puis grer le cylindre interne.


Oui. Rien de plus simple. Si on sait faire un plan/cylindre, on sait en faire deux. Et limiter les gnratrices d'un cylindre en longueur, ce n'est pas compliqu non plus.





> Quand tu dis que tu les enlves .... c'est une action openGL particulire pour supprimer un triangle, ou tout simplement tu veux dire que tu ne gnre pas le triangle ?


OpenGL ne gre que l'affichage... toutes les infos sur ce qu'il doit afficher sont traites en extrieur, donc dans la partie "non graphique" de ton programme. Quand je dis "on enlve", a veut dire qu'on ne les passe pas  OpenGL pour l'affichage.




> Delaunay ? Kesako ? Un p'tit Google s'impose je crois ...


Je prsume que tu as dj trouv de la doc sur internet.
En gros, a consiste  insrer un point dans une surface triangule. On supprime les triangles dont le cercle circonscrit contient le point qu'on rajoute, et on en crer de nouveaux  partir de ce point. Et ainsi de suite avec tous les points. Dans notre cas, les points consiste en ceux dfinissant le plan, et ceux dfinissant l'ellipse. Il y a encore un peu de boulot de basculement d'arte et d'autres subtilits du genre pour respecter les frontires.




> Donc faut imaginer le calcul, et si j'en reviens  la tesselation, il faut imaginer le cas thorique o tu peux avoir une centaine d'ellispses sur ton plan, et faut gnrer le maillage adquat ....


Tu ne fais le calcul du maillage que quand tu cres tes solides et leur intersection. Pas  chaque boucle d'affichage. L'affichage sera limit par le nombre de primitives  afficher, mais en aucun cas par le calcul de ces primitives.
OpenGL ne fait pas de calcul de primitives, il ne fait qu'afficher tes primitives...




> Arghh .... Ma premire question tait un cas de base cylindre/plan, mais je sais que s'appli pour laquelle je bosse, je dois aller vers du cylindre/cylindre (gestion des "gueules de loup")


Moi aussi... faut garder espoir!  ::aie:: 






> Nan car ce cas est trop simpliste. j'ai pris a en exemple, mais j'ai des formes plus complexes  grer : tles dformes, cylindres croiss, ...


Il n'empche que le principe peut tre creus... connaissant les tesselations des deux "solides", on peut "facilement" calculer leur intersection (qui se rduit  des calculs d'intersections de triangles/quads)

----------


## Ange_blond

> Par contre le tps que ce modeler soit finalis, et que le wrapper C# pour l'API mis  jour .... Trop tard peut etre


Je me suis peut etre avanc sur cette histoire de release, a toi de voir si la version actuelle est une version stable. Je sais juste que c'est assez rcent.

----------


## LeGreg

Quasiment personne n'utilise les oprations boolennes dans son moteur temps rel pour plein de raisons :

- peu d'objets de la vie relle sont rellement faits de combinaisons simples d'oprations boolennes. Ou alors il faudrait revenir d'un point de vue artistique dans les annes 70/80 (TRON et tout a..)
- Mme si c'est un outil  la cration dans les programmes de CAD/modeling, au final ton programme il envoie des triangles purs  ta carte graphique.
- les triangles sont super flexibles et peuvent reprsenter toutes sortes d'objets, simples, complexes, organiques, manufacturs. Et mme si une sphre low poly est peu convaincante on peut rajouter des triangles pour la rendre plus convaincante.

Bref le faible intrt que tu as dcel pour les oprations boolennes viennent de leur faible utilit pour faire des jeux.

LeGreg

----------


## LeGreg

Ton temps serait probablement mieux investi dans un programme d'importation de fichiers gomtriques issu d'un logiciel de modlisation (blender, maya, max, zbrush etc..).

LeGreg

----------


## kami58

> Ton temps serait probablement mieux investi dans un programme d'importation de fichiers gomtriques issu d'un logiciel de modlisation (blender, maya, max, zbrush etc..).
> 
> LeGreg


*** Hors-Sujet *** 
Dsol mais cette dernire remarque montre que tu n'as pas suivi et compris le sujet ...  ::roll:: 
Demande  qqn qui travaille sous CATIA ou Solidworks s'il doit obligatoirement crer sous Blender son solide avant de l'importer dans son logiciel de CAO ....  ::aie:: 

Le but est de crer une appli professionnelle correspondant  un modeleur 3D paramtrique type CAO, cest  dire de pouvoir crer des formes simples (et si, a existe dans le vie relle du XXIe sicle)  partir de donnnes gomtriques saisies dans des formulaires spcifiques.
On peut imaginer par exemple gnrer  la vole une tle, une matrice de perages (cylindriques, oblongs, biais, ...), ajouter des chanfreins, une coupe biaises, etc ...
L'appli doit donc permettre l'affichage 3D temps-rel de ces modifs.

----------


## icer

Bonjour,

Peut-tre que vous pouvez partir d'une approche bas sur image 3d volumtrique, c'est  dire composes de voxel. Dans ce cas, chaque voxel reprsente la prsence ou non de matire. Il serait trs facile de sculpter le volume, puisqu'il suffirait d'alumer ou d'teindre des voxels selon qu'ils se trouvent ou pas dans le volume  enlever. Vous pouvez ensuite utiliser un algorithme tel que Marching Cube pour construire un maillage  partir du volume pour finalement l'afficher.

----------

