Bonjour à tous. Dans l'optique de créer un petit moteur physique très basique avec une gestion des rebondes, j'ai suivi ce tutorial, que je trouvais à la fois clair et simple :
http://texel3d.free.fr/opengl/collisions.htm
J'ai créer une classe de Vecteur, qui semble être parfaitement en règle, juste sur un point auquel je doute, le produit scalaire ou dot product. En effet j'ai des valeurs proches de 1 malgré la fonction acos... :
J'ai pas l'impression que sont des valeurs en degré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 double Vecteur::DotProduct(Vecteur *vec) { double dot = (x * vec->x) + (y * vec->y); double angle = acos(dot)*this->Longueur()*vec->Longueur(); return angle; }
voici mon code entier :
Voici mes questions, j'ai du faire des modifs sont elles justes ? comme à cette partie :
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
32
33
34
35
36
37
38 for(int i = 0; i < vec.size() ; i++) vec[i]->Normalise(); D = 0 - (pts[0]->x * pts[3]->x) - (pts[2]->x * pts[3]->y); // Calcul de D dist = (pts[0]->x * pts[3]->x) + (pts[2]->y * pts[3]->y) + D; // Calcul de H if(dist < 0) { CollisionSol = false; } else if (dist > 0) { for(int i = 0; i < vec.size() ; i++) vec[i]->Normalise(); R = dist / (vec[2]->DotProduct(vec[3])); // Calcul de R pts[4]->x = pts[3]->x - (vec[3]->x * R); // On redéfinit le point I avec ses coordonnées pts[4]->y = pts[3]->y - (vec[3]->y * R); vec[4]->SoustrairePts(pts[0], pts[4]); //AI vec[5]->SoustrairePts(pts[0], pts[2]); //AB for(int i = 0; i < vec.size() ; i++) vec[i]->Normalise(); angle = vec[4]->DotProduct(vec[5]); cout << "angle final = " << angle << endl; if(angle == 1) CollisionSol = true; }
xi = x - ( xv * R)
yi = y - ( yv * R)
en code :
Et je ne comprend pas cette partie :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 pts[4]->x = pts[3]->x - (vec[3]->x * R); pts[4]->y = pts[3]->y - (vec[3]->y * R);
Ni la fin, avec le vecteur de rebond (extrémment important pourtant !!!)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 III. On Cherche si le point I appartient au segment. Si le point I(xi,yi) appartient au segment, l'angle qui relient I(xi,yi) aux deux sommets du segment est égale à 180 degrés (ou PI). Si cet angle est égal à -180 degrés, le point G(x,y) est à l'extérieur du segment. On utilise le produit scalaire pour trouver cet angle. Attention aux extrémités des segments? Note: Le point G(x,y) appartiendra forcement à la droite donc l'angle est égal à -180 ou 180 degrés. Alors vous pouvez être très large dans le choix de votre marge d'incertitude.
Comment il fait cette multiplication, ça n'a pas été abordé dans le cours de Yno et donc dans mon implantation vectorielle en C++ non plus...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 NouveauVecteurVitesse= V + 2*(-V.N)*N.
Voilà j'ai besoin de votre aide !!! Merci d'avance
Partager