Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 05 Juin 2009, 02:11 Message non corrigé | |
|
Voilà j'ai essayer de le faire, j'espère que ça ira :
public static boolean collisionWithPolygon (Vec3t posBox, Vec3t posPerso, Vec3t[] points, int pointsParFace) {
//Position du personnage par rapport au cube.
float distance = posPerso.calculerDistance(posBox);
Vec3t pointCollision = null, avant;
Vec3t posPersoBox = posPerso.additionner(posBox);
//On recherche la face vers laquelle se trouve le personnage.
int point = 0;
boolean bonneFace = false;
Vec3t up = new Vec3t (0.0f, 1.0f, 0.0f);
Vec3t forward = new Vec3t (0.0f, 0.0f, 1.0f);
Vec3t left = new Vec3t (1.0f, 0.0f, 0.0f);
for (int i = 0; i < points.length / pointsParFace; i++) {
for (int j = 0; j < pointsParFace; j++) {
//Calcule de la normale, perpendiculaire à la face pour trouver le sens.
Vec3t normale = points[j].crossProduct(points[j+1]);
//On teste par rapport à x et y.
if (normale.produitScalaire(up) >= 0 && normale.produitScalaire(up) <= 1 && normale.produitScalaire(left) >= 0 && normale.produitScalaire(left) <= 1) {
if (!(points[j].getVec3t()[0] <= posPerso.getVec3t()[0] && points[j].getVec3t()[1] <= posPerso.getVec3t()[1])
&& (points[j].getVec3t()[0] <= posPerso.getVec3t()[0] && points[j].getVec3t()[1] <= posPerso.getVec3t()[1]))
//Ce n'est pas la bonne face, donc on sors.
break;
} else if (normale.produitScalaire(up) >= 0 && normale.produitScalaire(up) <= 1 && normale.produitScalaire(forward) >= 0 && normale.produitScalaire(forward) <= 1) {
//On regarde par rapport à y et z
if (!(points[j].getVec3t()[1] <= posPerso.getVec3t()[1] && points[j].getVec3t()[2] <= posPerso.getVec3t()[2])
&& (points[j].getVec3t()[1] <= posPerso.getVec3t()[1] && points[j].getVec3t()[2] <= posPerso.getVec3t()[2]))
//Ce n'est pas la bonne face, donc on sors.
break;
} else if (normale.produitScalaire(up) >= 0 && normale.produitScalaire(up) <= 1 && normale.produitScalaire(left) >= 0 && normale.produitScalaire(left) <= 1) {
//On regarde par rapport à z et à x.
if (!(points[j].getVec3t()[0] <= posPerso.getVec3t()[0] && points[j].getVec3t()[2] <= posPerso.getVec3t()[2])
&& (points[j].getVec3t()[0] <= posPerso.getVec3t()[0] && points[j].getVec3t()[2] <= posPerso.getVec3t()[2]))
//Ce n'est pas la bonne face, donc on sors.
break;
}
if (j == pointsParFace- 1) {
point = i;
bonneFace = true;
break;
}
}
if (bonneFace)
break;
}
//On prends un point de la face, n'importe déterminer l'avant.
avant = points[point];
//On place l'avant par rapport à la position de la boite.
Vec3t avantPosBox = avant.additionner(posBox);
//On calcule l'angle entre le point de la face et le personnage.
float angle = (float) Math.acos(posPersoBox.produitScalaire(avantPosBox));
//Calcul du rayon par rapport au point choisis sur la face.
float rayon = posBox.calculerDistance(points[point]);
//On fait une translation avec la tangeante pour déterminer le point ou se fera la collision avec le perso sur la face.
pointCollision = avant.translation((float) (rayon * Math.tan(angle)), true, true, true);
pointCollision = avant.rotation(-angle, true, true, true);
//Rayon Entre le centre et le point de collision.
rayon = posBox.calculerDistance(pointCollision);
return (distance < rayon) ? true : false;
Ce post sera mis à jour en fonction des bugs rencontré.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|