EXTRUSION : OPENGL / VRML
PHILIPPE COVAL
Rendus :
Programme
L'appli est dispo pour linux-gnu et SGI (IRIX mips)
et les sources completes sur demande.
Introduction :
Une extrusion est une surface plane (crosssection) déplacée le long d'une
courbe 3d (spine).
Le noeud Extrusion est defini par la struture suivante :
/*-------------------------------------------------------------------------*/
typedef struct _extrusion {
int type; /* type du noeud */
int beginCap;
int endCap;
int ccw;
int convex;
int solid; /* Objet plein / creux */
float creaseAngle; /* angle limite */
sfvect2f *crossSection;
int nbPointsCrossSection;
sfvect3f *spine;
int nbPointsSpine;
sfvect2f *scale;
int nbScale; /* 1 ou nb spine */
sfRotation *orientation;
int nbOrientations;
int displayOgl; /* identificateur de la display list pour OpenGL */
} VRMLExtrusion;
/*-------------------------------------------------------------------------*/
Algorithme d'Extrusion :
cf: Extrusion Node @ http://vrml.org
Algorithme de Lissage :
Considerons la facette suivante:
2_______3
/ \
1 /_________\ 0
On pourait assimiler les normales en chaques points
à la normale de la facette.
Cependant dans certains cas (ie bartwist) la facette n'est pas
dans un plan
(le coté supérieur est obtenu par translation et rotation du coté inferieur)
... calculer une normale a autre chose qu'un plan devient absurde.
Donc dans le cas géneral on calcule la normale en chaques points :
- Normale_en_(pt0) = Vecteur(pt0/pt3) X Vecteur(pt0/pt1)
- Normale_en_(pt1) = Vecteur(pt1/pt0) X Vecteur(pt1/pt2)
- Normale_en_(pt2) = Vecteur(pt2/pt1) X Vecteur(pt2/pt3)
- Normale_en_(pt3) = Vecteur(pt3/pt2) X Vecteur(pt3/pt1)
Après avoir calculer les normales en tous les points.
Pour obtenir un lissage il faut faire la moyenne en un point
des 3 normales des autres facettes en ce meme point.
Si l'angle entre deux facettes est superieur a une certaine limite
(crease angle) on ne lisse pas, ce qui donne l'effet anguleux désiré.
La difficulte reside a traiter tous les cas particuliers et les fermetures
(du spine et crosssection).
La derniere partie est le texturage.
En fait plusieurs politiques peuvent s'appliquer.
La plus simple est d'enrouler l'image le long de la crossection,
et pour les facettes extremitees plaquer la textures a plat...
sans ce soucier des correspondances.
Source :
see
extrusion.txt
Philippe.COVAL - http://rzr.online.fr
Last modified: Tue Jun 5 00:26:31 CEST 2007