Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 04 Juin 2009, 23:54 Message non corrigé | |
|
public static float calculerPointCollisionAvecTriangle (Vec3t positionsPerso, Vec3t pointA, Vec3t pointB, Vec3t pointC) {
boolean vertical; //Vertical par rapport à x.
Vec3t pointM; //Milieu de la base, pour la hauteur.
//Si les valeurs x du bas de la pente sont les même, la base du triangle est perpediculaire à z dont verticale sur un plan 2D du sol.
Vec3t normale = pointA.crossProduct(pointC);
Vec3t forward = new Vec3t (0.0f, 0.0f, 1.0f);
//Si l'angle par rapport au vecteur gauche est compris entre 90 et -90, il est horizontal.
if (normale.produitScalaire(forward)>= 0 && normale.produitScalaire(forward) <= 1) {
vertical = true;
float sizeBase = pointB.getVec3t()[0] - pointA.getVec3t()[0];
pointM = new Vec3t (pointA.getVec3t()[0], pointB.getVec3t()[1], pointA.getVec3t()[2] + sizeBase / 2);
} else {
//Sinon la base du triangle est perpendiculaire à l'axe x donc horizontale sur un plan en 2D du sol.
vertical = false;
float sizeBase = pointB.getVec3t()[0] - pointA.getVec3t()[0];
pointM = new Vec3t (pointA.getVec3t()[0] + sizeBase / 2, pointB.getVec3t()[1], pointA.getVec3t()[2]);
}
//Position du personnage par rapport à M pour le produit scalaire.
float angle;
//Position du sommet par rapport à M pour le produit scalaire.
Vec3t pointCM = positionsPerso.additionner (pointM);
Vec3t positionsPersoA = positionsPerso.additionner(pointA);
//Calcul de l'angle du personnage par rapport au sommet
angle = (float) Math.acos(positionsPersoA.produitScalaire(pointCM));
if (pointC.getVec3t()[1] < pointM.getVec3t()[1])
angle = -angle;
//Calcul de la transaltion pour savoir de combien le personnage doit monter.
float valeur;
if (!vertical)
valeur = (float) ((pointC.getVec3t()[2] - pointM.getVec3t()[2]) * Math.cos(angle));
else
valeur = (float) ((pointC.getVec3t()[0] - pointM.getVec3t()[0]) * Math.cos(angle));
positionsPerso.translation(valeur, false, true, false);
//Calcul de la dénivellation de la base.
Vec3t denivellation = null;
if (!vertical)
denivellation = new Vec3t (pointB.getVec3t()[0], pointA.getVec3t()[0], pointB.getVec3t()[0]);
else
denivellation = new Vec3t (pointB.getVec3t()[2], pointA.getVec3t()[0], pointB.getVec3t()[2]);
//Position de B par rapport à A pour le produit scalaire.
Vec3t pointBA = pointA.additionner(pointB);
Vec3t denivellationA = pointA.additionner(denivellation);
angle = (float) Math.acos(denivellationA.produitScalaire(pointBA));
if (pointB.getVec3t()[1] < pointA.getVec3t()[1])
angle = -angle;
valeur = (float) (positionsPerso.longueur() * Math.cos(angle));
if (pointB.getVec3t()[1] < pointA.getVec3t()[1])
positionsPerso.translation(valeur, true, false, true);
else
positionsPerso.translation(-valeur, true, false, true);
return valeur;
}
...A première vue je dirais des problème d'arrondissement ?
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|