Jeux Libres

Envie de créer un jeu vidéo ?   Le site qui vous accompagne de A à Z.


» Les Forums » A propos de la création de jeux vidéo » Collision avec polygones.[premier essai]


Aller à la page : 1.

Collision avec polygones.[premier essai]
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. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 05 Juin 2009, 13:07             Message non corrigé

Les algorithmes serons mis à jour en fonction des bugs rencontrés.

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
 


Aller à la page : 1.


Hébergeur du site : 1and1.fr



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

1198903 pages ont été consultées sur le site !
Dont 2387 pages pendant les 24 dernières heures.

Page générée en 0.316 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo


  © 2005-2012 www.jeux-libres.com - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.