Technique backface removal

Signaler
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
bonjours est ce que quelqu'un connait une bonne manière de faire du backface removal (enlever la face arrière) avec des objects en 3d plygonale. Comment savoir rapidement si un polygone est de dos ou de face? (format ascii 3dsmax)

7 réponses

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Tu as plusieurs méthode:
1. Dessiner les triangles les plus éloignés d'abord et terminer par dessiner les facettes les plus proches mais c'est très lent.

2. Utiliser l'algorithme du peintre c'est à utiliser sa technique pour dessiner. On analyse tout d'abord la coordonnée de profondeur (z) puis les 2 autres coordonnée (x et y). Donc en déterminant si le z de chaque point d'une facette n'est pas supérieur aux z du barycentre d'une des autres facettes. Mais attention aux facette qui sont sécantes.

3. Tu peux trier les facettes par ordre de profondeur ainsi tu peux avoir immédiatement celles que tu peux dessinner.

4. Utiliser la coordonnée de profondeur du produit vectoriel du vecteur formé du premier point et du deuxième ainsi que du vecteur formé du premier point et du troisième. Si la coordonnée de profondeur est positive c'est que la facette est cachée sinon c'est qu'elle est visible. Mais l'ordre des points est important car il détermine le sens des vecteurs. Mais là il faut faire confiance à 3DS pour celà.

5. Et ce qui est pour moi le plus rapide: le z-buffer. Tu crée un tableau à 2 dimensions contenant des numéros de facette, et la valeur de sa profondeur. Ce tableau va représenter les facettes visibles à l'écran. Les dimensions du tableau sont dimensions de l'écran. Tu parcours chaque facette et tu détermine sa profondeur (par exemple en prenant la coordonnée de profondeur du barycentre) et si la profondeur est inférieur par rapport à cette du tableau tout en mappant en 2D la facette sur le tableau alors tu actualises les valeurs de profondeur et du numéro de facette.

Tu peux aussi combiner ces technique. Combiner l'alorithme du peintre et les produits vectoriel pour obtenir la solution suivante:
Déterminer si le troisième point de chaque facettes adjacentes à la facette testée et qui ne lui appartient pas a une coordornnée de profondeur inférieure au barycentre de la facette testée. Si c'est le cas pour les 3 facettes adjacentes et que la coordonnée de profondeur du barycentre est supérieur à toutes les autres facettes alors ta facette est cachée.

Core Breaker :)
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004

;-------------------------------
;prunkdump
;-------------------------------
Est ce que tu pourrai m'expliquer plus amplement ce qu'est ce produit vertoriel car pour moi le seul produit du vecteur possible est le produit scalaire. J'ai essayé de réaliser une routine qui calcule les coodonnée d'un verteur tangent au plan mais je n'ai pas trouvé encore d'équation simple.
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Un produit vectoriel est un vecteur qui est normal au plan défini par les 2 vecteurs donc ici à la facette le sens suis la règle des 3 doigts de la main droite (forme un répère tridimensionel avec comme x le pouce, y l'index et z le majeur, le sens premier vecteur est représenté par le pouce, le sens du deuxième vecteur est représenté par l'index et le sens "positif" du produit vectoriel est représenté par le majeur)

[PRE]

z y
^ ^
| /
| /
| /
| /
+------------->x

/PRE

La norme du produit vectoriel représente l'aire de la facette.
Le calcul est le suivant:
Si vecteur1= {x1, y1, z1} et vecteur2= {x2, y2, z2} alors le produit vectoriel (notation mathématique: vecteur1 ^ vecteur2) est {y1 z2 - y2 z1, x2 z1 - x1 z2, x1 y2 - x2 y1}

Core Breaker :)
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004

;------------------------------
;prunkdump
;-------------------------------

j'ai essayé se faire une routine, elle ne marche pas mais je me demande si ce n'est pas du à mon format 3Dsmax. Elle supprime en fait les polygone qui ce repasse dessus le résultat est un modèle plus fin.

;---------------------------------------------------------------------
;backface_removal (les point on déjas subit les trasformations)
;---------------------------------------------------------------------backface_removal:
pushad
movsx eax, word [si+3] ;Xpoint2
movsx ebx, word [si+0] ;Xpoint1
sub eax, ebx ;eax=X1
movsx ebx, word [si+7] ;Ypoint3
movsx ecx, word [si+1] ;Ypoint1
sub ebx, ecx ;ebx=Y2
imul ebx
push eax
;---------------------------------
movsx eax, word [si+6] ;Xpoint3
movsx ebx, word [si+0] ;Xpoint1
sub eax, ebx ;eax=X2
movsx ebx, word [si+4] ;Ypoint2
movsx ecx, word [si+1] ;Ypoint1
sub ebx, ecx ;ebx=Y1
imul ebx
pop ebx
;---------------------------------
sub ebx, eax ;ebx= X1*X2-X2*Y1
popad
ret ;il y à un "jge" au retour
;qui saute au dessus
;du traçage de polygone
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Tu calcule bien la coordonnée Z du produit vectoriel mais je t'ai dis que l'ordre des points dans le modèle est important car il conditionne le sens du produit vectoriel et donc qu'il fallait pour cela faire confiance à 3DS donc si ça ne marche pas, c'est que le sens des vecteurs est mauvais.
Bref oui cela peut donc venir du modèle 3DS.

Tu devrais essayer le z-buffer c'est ce qu'il y a de plus rapide actuellement.

Core Breaker :)
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004

;-----------------------
;prunkdump
;----------------------

Il y a quelques points que je ne comprend pas dans le z-buffering et particulièrement la constitution du tableau. Tu dis que ce tableau est de la taille de l'écran, Il faut le numéro de facette et ça coordonnée z pour chaque pixel de l'écran? Ou juste la coordonnée z par facette?

l'avantage que je trouve à cette technique du produit vertoriel c'est quelle permet d'enchaîner avec un shading ombrée.

pourrait tu menvoyer un modèle simple (genre la téillère) au format ascii de 3dsmax à l'adresse, [mailto:prunkdump@hotmail.com mailto:prunkdump@hotmail.com]
Ci tu n'en à pas c'est pas grâve.

merci
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
C'est vrai le produit vectoriel est interessant mais malheurement tout dépend de 3DS Peut-être qu'un jour 3DS en tiendra compte.

Je n'ai pas la teillère en fichier ASC mais j'ai le canard je te fournirai aussi le nouveau format ascii de 3DS (depuis 3DSMax 3) c'est un fichier .ase

Pour le Z-Buffer en C ca donnerais ceci:

typedef struct
{
int x, y, z;
} point3D:

typedef point3D modele[3]:

typedef struct
{
int numeroFacette;
int profondeur;
} cell;

modele facette[nombreFacettes];
cell zbuffer[320][200]; // Si tu es en resolution 320x200

...

for(i= 0; i<nombreFacettes; i++)
mapper(i);

...

void actualise(int numeroFacette, int x, int y)
{
int profondeur= calculProfondeur(facette[numeroFacette]);
if( zbuffer[x][y].profondeur > profondeur )
{
zbuffer[x][y].profondeur= profondeur;
zbuffer[x][y].numeroFacette= numeroFacette;
}
}


la fonction "mapper" effectue la même chose que le remplissage d'une facette saut qu'au lieu de placer un pixel elle appelle la fonction actualise

La fonction calculProfondeur peut être celle-ci:
int calculProfondeur(modele f)
{
return f[0].z + f[1].z + f[2].z;
}


Core Breaker :)