Remplissage de triangle en 3D

Le problème exposé dans ce sujet a été résolu.

La formule présentée s'implémente très facilement: il s'agit d'une double-boucle de variables u et v variant entre 0 et 1. Si tes points sont représentés par A(xA, yA, zA), B(xB, yB, zB) et C(xC, yC, zC), alors tous les points de ton triangle (en 3D, donc), seront les points M(x, y, z) définis par :

1
2
3
x = xA + u * (xB - xA) + v * (xC - xA)
y = yA + u * (yB - yA) + v * (yC - yA)
z = zA + u * (zB - zA) + v * (zC - zA)

tels que u + v ≤ 1 (sinon, tu représentes un parallélogramme), c'est donc une condition à ajouter à ta seconde boucle (en ayant 1 - u comme valeur maximale plutôt que u).

EDIT:

Pour le moment, je préfère le garder privé.

Dans quel but ? Si c'est par crainte qu'on te vole ton code/projet, c'es infondé et tu peux poster le code.

Aze, si on te répète quelque chose, ce n'est pas pour rien.

Entwanne, ce n'est que maintenant que je comprends ta formule. C'est vachement astucieux, et c'est juste de la relation de Chasles en fait ? Si tu enlèves u + v inférieur à 1 dans la première formule, ça donne bien un rectangle ? D'ailleurs, même dans ton implémentation en 3D, je crois que ça donnerait un rectangle, et pas un parallélépipède.

+1 -0

Si j'ai bien compris, ça s'implémente donc comme ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
For u As Integer = 0 To 1 Step +1
    For v As Integer = 0 To 1 - u Step +1
        Dim xA As Integer = Positions(0).X
        Dim xB As Integer = Positions(1).X
        Dim xC As Integer = Positions(2).X
        Dim yA As Integer = Positions(0).Y
        Dim yB As Integer = Positions(1).Y
        Dim yC As Integer = Positions(2).Y
        Dim zA As Integer = Positions(0).Z
        Dim zB As Integer = Positions(1).Z
        Dim zC As Integer = Positions(2).Z
        Dim x = xA + u * (xB - xA) + v * (xC - xA)
        Dim y = yA + u * (yB - yA) + v * (yC - yA)
        Dim z = zA + u * (zB - zA) + v * (zC - zA)
        lst.Add(New Position(x, y, z))
    Next
Next

sachant que la variable tableau Positions contient les 3 positions des sommets.

Seulement ça ne me retourne que 1 pixel (ou plusieurs fois le même pixel, je ne sait pas)

+0 -0

Entwanne, ce n'est que maintenant que je comprends ta formule. C'est vachement astucieux, et c'est juste de la relation de Chasles en fait ? Si tu enlèves u + v inférieur à 1 dans la première formule, ça donne bien un rectangle ? D'ailleurs, même dans ton implémentation en 3D, je crois que ça donnerait un rectangle, et pas un parallélépipède.

Phigger

Ouais ouais, je viens d'éditer, j'ai dit n'importe quoi, je voulais dire «parallélogramme» (car ça n'est pas toujours un rectangle).

Aze> Non, il faut un pas plus petit que ça. Le pas va correspondre à l'inverse du nombre de pixels à parcourir, c'est pourquoi il te faut projeter tes sommets sur le plan, puis prendre la valeur maximale entre les ordonnées et les abscisses de tes points.

Je résonne toujours avec un triangle rectangle dans ma tête, effectivement, un parallélogramme ^^

Par contre, je dirais que le pas correspond à l'inverse de la moitié du carré du nombre de pixels :p Non, bon sinon, puisque le pas est le même, ça fera des pixels rectangulaires, non ? Puisque les 2 vecteurs n'ont pas la même norme.

+0 -0

Je considère plutôt deux pas différents pour chacune des deux valeurs. Mais par exemple, si tu as deux points A(0, 0) et B(10, 20) sur un écran, tu n'as besoin de parcourir que 20 itérations (et tu pourras associer un pixel différent à chaque itération). Si tu calcules la distance entre les points (environ 22), tu passeras plusieurs fois sur un même pixel.

Oui, l'inverse de 56 c'est 1/56. Car tu itéreras de 0 à 1, donc si tu as un pas de 1/56, tu feras 56 itérations.

Cette information est mathématiquement fausse :p Tu oublies le 0, pour faire 56 itérations il faudrait un pas de 1/55 ^^

Phigger

Je n'incluais pas la borne de fin pour simplifier, et parce qu'à ce niveau cela revient relativement au même. Et la bonne valeur pour ce qu'il veut faire reste 1/56, car la variable sera incrémentée 56 fois au sein de la boucle :) (elle sera incrémentée une 57ème fois mais on sortira de la boucle).

Ce serait pas plutôt 1 / 56 - 1 ?

Non, tu aurais là un pas négatif.

Je veux dire, sur un de tes vecteurs, tu as un moyen de calculer ton nombre d'itération ? Pour adapter le nombre de pixels à la taille de l'élément.

Phigger

Il me semble que c'est ce que j'ai donné plus haut, oui. Le nombre d'itération sera la plus grande valeur entre la valeur absolue de l'abscisse et celle de l'ordonnée du vecteur, plus 1.

donc dans un triangle, je prend le plus grand X - le plus petit X, et le plus grand y - le plus petit y ?

Aze

Non, dans ton triangle tu as 3 points, donc minimum deux vecteurs pour t'y repérer, donc tu dois répéter cette opération deux fois, pour les deux vecteurs différents.

Tout ças marche parfaitement ! En y appliquant sur une sphère, ça me calcule 386 408 pixels visibles xD (en 3D, soit bien moins affichés ^^ (environ 120 000 en 2D je pense)). avec le calcul de l'ombrage, ça prend 16 secondes à s'afficher xD. ça fait 0,04135783938220740771412600153206 milliseconde par pixel xDD

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte