Bonjour à tous,

J'ai commencé il y a un bon moment la programmation d'un mini moteur 3d basé sur le raytracing. Le sujet m'intéressait et j'ai trouvé cela chouette à programmer.

Pour l'instant j'arrive à afficher des sphères, et leur intersections.

Maintenant j'essaie d'afficher un triangle. Et c'est la que ça se complique.

Les sommets de mon triangles sont définis comme suit :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
        ......
	Point3df somet1(400,50,600);
	Point3df somet2(200,300,600);
	Point3df somet3(600,300,600);
	Color ColorTriangle(255,0,0);
 
	CRB::Triangle triangle1(somet1,somet2,somet3,ColorTriangle);
	sceneManager.addPrimitive(&triangle1);
        .....
le vieuwer est défini à partir de son coin supérieur gauche ( mon écran), et la direction vers laquelle il regarde.La résolution de ma fenêtre est 800x600.

Dans mon cas il est en (0,0,0) et la direction est (0,0,1). z entrant dans mon écran.

le problème se situe au niveau de la fonction intersection. Elle reçoit le rayon pour lequel je teste l'intersection et le point de collision. Si je touche la primitive, je rentre les coordonnées du point de collision, sinon je rentre -10 pour x, y et z . Voici la fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
void Triangle::intersection(const Ray& ray,Point3df& collisionPoint)
	{
		Vector3df    u, v, r, n, O;
		double  Iu, Iv, Ir;
		u = mPoint1 - mPoint2;
		//normelize(u);
		v = mPoint1 - mPoint3;
		//normelize(v);
		r = ray.direction();
		//normelize(r);
 
		n = u ^ v;
		O = ray.origin() - mPoint1;
		//normelize(O);
 
		Ir = -1 * ((n*O)/(n*r));
		Iu = ((O^v)*r)/(n*r);
		Iv = (((u^O)*r)/(n*r));
 
 
		if ( Iu >=0 && Iu<=1 && Iv >=0 && Iv<=1 && Ir>=0 && (Iu+Iv)<= 1)
		{
			collisionPoint = (Iu * u)+(Iv * v);
		}
		else
		{
			collisionPoint.assign(-10);
		}
 
	}
J'ai débuggé le code plusieurs fois, me je ne trouve pas l'erreur.
Pour le calcule, je me suis basé sur cette exemple çi. ( en début de page)

http://fr.wikipedia.org/wiki/Lancer_....27un_triangle

Les produits scalaires et vectoriels on été revérifié pour être sur que l'erreur ne vient pas de là.