gKit2 light
|
cf pipeline.cpp
la solution présentée dans introduction api 3d, openGL et pipeline graphique fonctionne correctement dans les cas simples lorsque tous les triangles sont devant la camera. un grand triangle dont les sommets ne sont pas visibles dans l'image mais dont l'interieur est visible ne sera pas dessiné... le test de visibilité du triangle n'est pas suffisant.
sans rentrer dans les détails, la projection utilisée est juste une transformation comme une autre, et les points derrière la caméra se projettent aussi sur l'image... il faut donc trouver une approche différente qui ne fait pas de projection.
les tests d'inclusion des pixels se font en 2d, dans le plan image, après la projection. si on ne veut pas calculer la projection, il faut faire un test équivalent en 3d, avant la projection.
la solution est logique, au lieu de tester un pixel par rapport à un triangle, et de calculer des aires, il faut tester un point 3d par rapport à un... tetrahèdre et calculer des volumes.
remarque : pour les curieux, toutes les explications sont dans cet article
le test d'inclusion d'un pixel p dans un triangle abc calcule les aires signées des triangles pab, pbc, pca. ce qui permet de vérifier que le pixel se trouve du "bon" coté de chaque arête du triangle.
pour le test 3d, la camera est le sommet du tetrahedre, e, et sa base est le triangle abc. le test d'inclusion du point p se transforme en calcul du volume signé des tetrahedres formés par le point p et les faces abc, eba ecb, eac. s'ils sont tous du même signe, p à est l'interieur du volume eabc, et le pixel fait parti du triangle. c'est le même test qu'avec l'aire, le volume sera positif si p se trouve du "bon" coté de chaque face du tetrahedre.