Remplissage de triangle en 3D

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

Les vecteurs c'est pas le truc le plus dur. Le souci c'est que tu n'as pas encore les bases mathématiques pour comprendre ce que tu fais, çe qui peut t'induire en erreur. Tu es en quelle classe, au collège nan ?

En fait problème non résolu, car je voudrais implémenter un Z-buffer, et donc il me faut la position de chaque pixel à dessiner. C'est donc toujours le même problème, trouver la position x, y, z de tout les pixels d'un triangle en 3D. Une idée ?

+0 -0

Tu noteras surtout que ce que j'ai dit est une grossière erreur… Techniquement, tu obtiendrais un parallélépipède rectangle.

Par conséquent, tu n'as pas vraiment réfléchi à ce que j'ai dit… Ce qui est dommage. J'ai quand même l'impression que tu t'attends à ce qu'on te file l'algo tout prêt :/ Pour en revenir à ton problème, la seule solution que j'ai trouvé, ce serait d'ajouter une équation de plan aux conditions précédentes.

+0 -0

Si j'ai réfléchi dessus.

J'ai eu une idée : je prend 2 des trois points. j'utilise un algorithme de tracé de segment avec uniquement leur coordonnées x et y. je réutilise le même algorithme, mais avec les coordonnée x et z. Je croise les résultats : je fait une boucle de point1.x to point2.x et je défini mes points comme ça : x de la boucle. y du résultat 1 en comparant x. Z du résultat 2 en comparant x. Qu'en pense tu ? ça permet déjà d'obtenir tout les pixels se trouvant entre 2 points. Je n'ai pas encore réussi à y mettre en place.

+0 -0

Pour obtenir les pixels se trouvant entre 2 points, tu peux faire une projection des 2 points sur le plan de l'écran, ça veut rien dire "pixels entre 2 points" sinon. Ce plan de l'écran, il est découpé sous forme de grille, et chaque case c'est tes pixels. J'appelle $A'$ et $B'$ tes points projetés sur le plan de l'écran. Tu calcules un vecteur directeur de la droite $(A'B')$, unitaire (de norme 1). Ensuite tu trouver les pixels par lequels passe la droite, et enlever ceux qui ne sont pas "entre A et B".

Là encore, il faut des maths et tu n'as pas encore le niveau. Peut-être que tu pourrais attendre un peu avant de te lancer dans des projets de cette ampleur, et faire des trucs plus simples mais tout aussi sympas en attendant ?

Non Aze, le problème n'est pas la solution que propose Grimur mais le fait que tu ne la comprends pas. Grimur parle d'une projection, ce qui est un peu comme prendre une photo. Tu ramènes des points en 3D sur un seul plan. C'est pratique en maths.

Par contre, je ne pense pas que ce soit très utile en 3D. En utilisant la projection, tu perds toute notion de profondeur.

+0 -0

Si tu jettes un coup d'œil à ce que j'ai écrit en page précédente, tu verras que la formule est parfaitement valable pour des vecteurs en 3 dimensions. Mais il te faudra alors calculer la projection de chaque point pour savoir où la placer à l'écran (et le z ne sera pas suffisant, c'est plutôt la distance par rapport à l'œil qui t'intéresse), et le calcul du pas sera aussi plus dur (tu peux t'en sortir en projetant sur le plan les 3 sommets du triangle et procéder comme je le faisais dans mon message).

J'ai une formation de marabout, et rien qu'en lisant dans tes pensées avec ma boule de cristal, je vois ton code, je peux le test pour comprendre pourquoi ça marche pas et t'aider. Je t'ai demandé de nous montrer du code, Stranger a l'air d'accord mais tu t'en fous et tu persistes. Tu sais ce qu'on dit, une image vaut mille discours ? Et bien remplace image par code.
C'est pas en fonçant tête baissée dans des projets qui te dépassent (pour l'instant) et en n'écoutant pas ceux qui essaient de t'aider que tu vas progresser.

Je n'avais pas vu que tu m'avait demandé mon code. Pour le moment, je préfère le garder privé. Stranger a posté deux messages dans le topic, pour corriger shaynox… Comment peut il sembler d'accord xD ?

@Tout le monde : "C'est pas en fonçant tête baissée dans des projets qui te dépassent (pour l'instant)." à été dit une fois dans le sujet. J'ai vu, j'ai compris. Pas besoin de le répéter dans tous les prochains messages ;) .

+0 -0

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.

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