Posté par manu008 .
En réponse au message Rendu 3D.
Évalué à 1.
Qu'on ne me prenne pas pour un illuminé de première! (bien que je le sois un peu)
La division de facette devraient plutôt s'appeler " la subdivision de facettes".
J'explique.
On a un algorithme de rendu qui prend en entrée :
- les coordonnées des objets. La structure de données adoptée est simple et consiste en une liste de triangle. Un triangle est formé de 3 points avec leurs coordonnées x, y et z soit 9 nombres float (ou double) par triangle.
Par exemple un cube est composé de 6 faces chacune est divisée en 2 pour obtenir deux triangles (ou facettes) par face de pet de cube.
Un personnage 3d sera composé de plus de facettes.
Pourquoi des triangles? La réponse est simple: un plan dans l'espace est déterminé par définition de 3 points. Soit 3 points quelconques, on obtient, dans le cas ordinaire, un plan. En juxtaposant des plans, on peut déterminer l'enveloppe d'un objet 3D, ce qu'on souhaite dessiner. Ce dessin sera ressemblant à l'objet.
Ce n'est peut-être pas le meilleur procédé, ce n'est qu'une simplification pour la synthèse d'objet 3D.
Exemple de triangle:
FacettedObject *fo = new FacettedObject();
fo->ajouterFacette(Point3D(0,0,0), Point3D(0,1,0), Point3D(1,1,0), Color(255,255,255));
Ce qui ajoute une facette blanche à notre objet.
- La deuxième entrée de l'algo: les projections 2D des 3 axes 3D x,y,z.
A partir de ces 2 entrées l'algo produit une image, que l'on peut afficher à l'écran, imprimer, sauvegarder sur disque, encoder dans une animation vidéo.
La subdivsion de facettes proprement dite est une bidouille que j'ai inventée (à moins qu'un "plagieur par anticipation" se désigne.
Le problème qui y mène est le suivant: l'algo du zbuffer parcourt l'écran et pour chaque point P(x,y) et chaque facette f, calcule l'intersection entre la droite 3D passant par le point P(x,y) et la facette f. Il est important de préciser qu'il s'agit bien d'une droite au point P, car le point de l'écran en 2D est en fait la projection de la droite 3D dont tous les points se trouvent projetés au point P.
-> Un des problèmes du zbuffer est de trouver les coordonnées de cette droite. CAR c'est les coordonnées z (profondeur) des différents points d'intersections avec les facettes qui vont permettre de trier les facettes afin d'afficher seulement les facettes qui sont devant les autres. (voir schéma sur internet du zbufffer)
La subdivision de facettes contourne ce problème. Au lieu de calculer directement z par une formule, on itère, pour chaque facette, en divisant f jusqu'à obtenir des surfaces à l'écran <= 1 (= 1 pixel).
La division se fait comme ceci:
Diviser f
Prendre M= (P1+P2+P3)/3 P12= (P1+P2)/2 P23= (P2+P3)/2 P31= (P3+P1)/2
f sub 1 = P1 M P12; f sub 2 = P12 M P2 ; f sub 3 = P2 M P23 ; f sub 4= P23 M P3 ; f sub 5 = P3 M P31 ; f sub 6 = P31 M P1
Diviser f sub (1, 6) si surface >1
Le bénéfice est le suivant : on peut estimer que si surface(fn) est suffisamment petit (concrètement 1 pixel), on a que (fn:P1 fn:P2 + fn:P3)/3 sont les coordonnées de la facette que l'on va tracer au pixel P.
L'algorithme n'est pas parfait au niveau du rendu, mais ça fonctionne bien. (voir illustration sur Youtube cube tournant autour d'un axe, et d'autres objets que je vais rendre bientôt)...
[^] # Qu'est-ce que c'est?
Posté par manu008 . En réponse au message Rendu 3D. Évalué à 1.
Qu'on ne me prenne pas pour un illuminé de première! (bien que je le sois un peu)
La division de facette devraient plutôt s'appeler " la subdivision de facettes".
J'explique.
On a un algorithme de rendu qui prend en entrée :
- les coordonnées des objets. La structure de données adoptée est simple et consiste en une liste de triangle. Un triangle est formé de 3 points avec leurs coordonnées x, y et z soit 9 nombres float (ou double) par triangle.
Par exemple un cube est composé de 6 faces chacune est divisée en 2 pour obtenir deux triangles (ou facettes) par face de pet de cube.
Un personnage 3d sera composé de plus de facettes.
Pourquoi des triangles? La réponse est simple: un plan dans l'espace est déterminé par définition de 3 points. Soit 3 points quelconques, on obtient, dans le cas ordinaire, un plan. En juxtaposant des plans, on peut déterminer l'enveloppe d'un objet 3D, ce qu'on souhaite dessiner. Ce dessin sera ressemblant à l'objet.
Ce n'est peut-être pas le meilleur procédé, ce n'est qu'une simplification pour la synthèse d'objet 3D.
Exemple de triangle:
FacettedObject *fo = new FacettedObject();
fo->ajouterFacette(Point3D(0,0,0), Point3D(0,1,0), Point3D(1,1,0), Color(255,255,255));
Ce qui ajoute une facette blanche à notre objet.
- La deuxième entrée de l'algo: les projections 2D des 3 axes 3D x,y,z.
A partir de ces 2 entrées l'algo produit une image, que l'on peut afficher à l'écran, imprimer, sauvegarder sur disque, encoder dans une animation vidéo.
La subdivsion de facettes proprement dite est une bidouille que j'ai inventée (à moins qu'un "plagieur par anticipation" se désigne.
Le problème qui y mène est le suivant: l'algo du zbuffer parcourt l'écran et pour chaque point P(x,y) et chaque facette f, calcule l'intersection entre la droite 3D passant par le point P(x,y) et la facette f. Il est important de préciser qu'il s'agit bien d'une droite au point P, car le point de l'écran en 2D est en fait la projection de la droite 3D dont tous les points se trouvent projetés au point P.
-> Un des problèmes du zbuffer est de trouver les coordonnées de cette droite. CAR c'est les coordonnées z (profondeur) des différents points d'intersections avec les facettes qui vont permettre de trier les facettes afin d'afficher seulement les facettes qui sont devant les autres. (voir schéma sur internet du zbufffer)
La subdivision de facettes contourne ce problème. Au lieu de calculer directement z par une formule, on itère, pour chaque facette, en divisant f jusqu'à obtenir des surfaces à l'écran <= 1 (= 1 pixel).
La division se fait comme ceci:
Diviser f
Prendre M= (P1+P2+P3)/3 P12= (P1+P2)/2 P23= (P2+P3)/2 P31= (P3+P1)/2
f sub 1 = P1 M P12; f sub 2 = P12 M P2 ; f sub 3 = P2 M P23 ; f sub 4= P23 M P3 ; f sub 5 = P3 M P31 ; f sub 6 = P31 M P1
Diviser f sub (1, 6) si surface >1
Le bénéfice est le suivant : on peut estimer que si surface(fn) est suffisamment petit (concrètement 1 pixel), on a que (fn:P1 fn:P2 + fn:P3)/3 sont les coordonnées de la facette que l'on va tracer au pixel P.
L'algorithme n'est pas parfait au niveau du rendu, mais ça fonctionne bien. (voir illustration sur Youtube cube tournant autour d'un axe, et d'autres objets que je vais rendre bientôt)...