Jeux Libres

Plateforme de création de jeux vidéo (Le site est en cours de création / réorganisation)


» Les Forums » Mathématiques / Algorithmique » Truc pas mal
Aller à la page : 1.

Truc pas mal
Lo



Messages: 447
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 15 Juin 2009, 00:06        Citer

En fait en me renseignant j'ai trouver deux types d'algorithmes pour gérer les collisions avec les box, ça dépends si les box sont toujours alignées dans le même sens par rapport aux axes x, y et z ou alors si elle sont orientée n'importe comment.
Dans le premier cas, c'est simple, on doit faire un test de collision AABB (Axis Aligned Bounding Box.)
On fait il suffit d'avoir le centre de la boîte et le milieu de chaque arrête de la boîte, enfin je mettrai l'algo final et expliquerai quand j'aurai terminé.

(C'est moins complexe je trouves que le lien que tu m'a donné David.)

Pour le cas n°2 ce sont des OBB (Oriented Bouding Bos.) pour faire simple il suffit de stocker les deux angles têta et rho de la boîte, prendre l'inverse de la transformation pour ensuite pouvoir faire le même test que pour les AABB.

Voilà, je suis content j'ai enfin trouvé un truc qui 'ma l'air simple et qui me plait bien pour la suite de mes tutos.
Une fois ceci fait je n'aurai plus qu'à placer des objets dans mes blocs.
J'ai fait une classe bloc dans laquelle je peut mettre des objets, n'importe lesquels, je penses que c'est le plus simple.

________
"Il n'y a qu'avec ce que je crée que je représente quelque chose dans la vie des autres.
Mes créations sont ma seule fierté."
 
Lo



Messages: 447
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 29 Juin 2009, 21:05        Citer

Voilà, la direction est bonne, j'ai la bonne face de sélectionnée, mais l'intersection, je n'ai pas encore trouvé, là je n'ai pas encore les bonnes valeurs, mais ça va venir, prochaines étape, l'utilisation de la souris et de gluUnProject.
Aller j'ai presque finis la sélection, après reste la modifiction.
En fait je compte présenter (mon projet une fois finis) à un studio qui développe des jeux vidéos car à l'école ça ne marche pas for fort, histoire d'être recruté facilement.
Donc après je remettrai le jeux en c++, je n'aurais pas de mal car une fois fait en java, suffit de transcrire.


Code :

public boolean intersects (Ray ray) {
       
        float tFar = Float.MAX_VALUE;
        float tNear = -Float.MAX_VALUE;
        int axe = 0;
        boolean devant = false;
        Vec3t d = new Vec3t(0, 0, 0);
       
        for (int i = 0; i < 3; i++) {
            float milieu, orig;
            switch (i) {
            case 0 :
                milieu = milieuX;
                d.getVec3t()[0] = ray.getDest().getVec3t()[0] - ray.getOrig().getVec3t()[0];
                orig =  ray.getOrig().getVec3t()[0] - centre.getVec3t()[0];               
                break;           
            case 1 :
                milieu = milieuY;
                d.getVec3t()[1] = ray.getDest().getVec3t()[1] - ray.getOrig().getVec3t()[1];
                orig =  ray.getOrig().getVec3t()[1] - centre.getVec3t()[1];               
                break;
            default :
                milieu = milieuZ;
                d.getVec3t()[2] = ray.getDest().getVec3t()[2] - ray.getOrig().getVec3t()[2];
                orig =  ray.getOrig().getVec3t()[2] - centre.getVec3t()[2];   
               
            }
            if (d.getVec3t()[i] == 0) {
                if (Math.abs(orig) > milieu)
                    return false;
            } else {
                float t1 = (-milieu - orig) / d.getVec3t()[i];
                float t2 = (milieu - orig) / d.getVec3t()[i];               
                float tmp;
                if(t1>t2){
                    tmp = t1;
                    t1 = t2;
                    t2 = tmp;
                } else
                    tmp = t1;
               
               
                if (t1 > tNear) {
                    axe = i;
                    tNear = t1;   
                   
                    devant = tmp != t1;   
                }
                   
                if (t2 < tFar) {
                    tFar = t2;           
                                       
                }
               
               
               
                // on prend le plus grand t1 et le plus petit t2, et si t1 > t2, c'est que
                // la droite rencontre la face droite avant la face gauche, et donc n'est pas dans
                // la boite.
                if (tNear > tFar)
                    return false;

                // (a uniquement mettre si ton rayon est orienté (si le cube ne peut pas être derrière l'origine du rayon))
                // si l'intersection à lieu avant l'origine
                if (tFar < 0)
                    return false;
                           
            }   
           
        }       
       
       
        intersection = ray.getOrig().translation(tNear, true, true, true);
        switch (axe) {
       
            case 0 :
                //intersection = ray.getOrig().translation(tNear * Parameter.RAY, true, false, false);
                if (devant)
                    orientation = OrientationRayon.DROITE;
                else
                    orientation = OrientationRayon.GAUCHE;
                break;
            case 1 :
                //intersection = ray.getOrig().translation(tNear * Parameter.RAY, false, true, false);
                if (devant)
                    orientation = OrientationRayon.HAUT;
                else
                    orientation = OrientationRayon.BAS;
                break;
            default :
                //intersection = ray.getOrig().translation(tNear * Parameter.RAY, true, false, false);
                if (devant)
                    orientation = OrientationRayon.DEVANT;
                else
                    orientation = OrientationRayon.DERRIERE;
                break;           
        }       
       
        return true;       
    }


________
"Il n'y a qu'avec ce que je crée que je représente quelque chose dans la vie des autres.
Mes créations sont ma seule fierté."
 
Lo



Messages: 447
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 30 Juin 2009, 08:53        Citer

Et voilà l'algo pour déterminer l'intersection entre le Bloc (Aligné par rapport aux axes.) et le rayon marche!

Code :

public boolean intersects (Ray ray) {
        float tFar = Float.MAX_VALUE;
        float tNear = -Float.MAX_VALUE;       
        int axe = 0;
        boolean devant = false;
        Vec3t d = new Vec3t(0, 0, 0);
       
        for (int i = 0; i < 3; i++) {
           
            float milieu, orig;
            switch (i) {
            case 0 :
                milieu = milieuX;
                d.getVec3t()[0] = ray.getDest().getVec3t()[0] - ray.getOrig().getVec3t()[0];
                orig =  ray.getOrig().getVec3t()[0] - centre.getVec3t()[0];       
               
                break;           
            case 1 :
                milieu = milieuY;
                d.getVec3t()[1] = ray.getDest().getVec3t()[1] - ray.getOrig().getVec3t()[1];
                orig =  ray.getOrig().getVec3t()[1] - centre.getVec3t()[1];               
                break;
            default :
                milieu = milieuZ;
                d.getVec3t()[2] = ray.getDest().getVec3t()[2] - ray.getOrig().getVec3t()[2];
                orig =  ray.getOrig().getVec3t()[2] - centre.getVec3t()[2];                   
            }
            //Si la droite est parallèle à la boîte.
            if (d.getVec3t()[i] == 0) {
                if (Math.abs(orig) > milieu)
                    return false;
            } else {
                float t1 = (-milieu - orig) / d.getVec3t()[i];
                float t2 = (milieu - orig) / d.getVec3t()[i];               
                float tmp;
                if(t1>t2){
                    tmp = t1;
                    t1 = t2;
                    t2 = tmp;
                } else
                    tmp = t1;
               
               
                if (t1 > tNear) {
                    axe = i;
                    tNear = t1;                       
                    devant = tmp != t1;   
                }
                   
                if (t2 < tFar) {
                    tFar = t2;           
                                       
                }
               
               
               
                // on prend le plus grand t1 et le plus petit t2, et si t1 > t2, c'est que
                // la droite rencontre la face droite avant la face gauche, et donc n'est pas dans
                // la boite.
                if (tNear > tFar)
                    return false;

                // (a uniquement mettre si ton rayon est orienté (si le cube ne peut pas être derrière l'origine du rayon))
                // si l'intersection à lieu avant l'origine
                if (tFar < 0)
                    return false;
                           
            }   
           
        }       


Pour les bloc non aligné c'est facile, il suffit de stocker en plus têta et phi, annuler la transformation et faire un test comme si c'était une AABB et pour avoir le point d'intersection, il suffit de le recalculer avec phi et têta.

Vraiment pas compliqué je trouves finalement.

________
"Il n'y a qu'avec ce que je crée que je représente quelque chose dans la vie des autres.
Mes créations sont ma seule fierté."
 
Lo



Messages: 447
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 03 Juillet 2009, 18:12        Citer

Ha voilà, j'arrive à sélectionné la boîte en face de la souris :D, normalement d'ici quelques moi je finis l'éditeur de map, je ne vais pas faire un truc trop complexe pour débuter, vaut mieux je crois.

Maintenant que les collisions avec les boîtes marchent, je vais pouvoir avancer un peu plus sur WOTCK! (A non merde j'ai 7 exams à repasser pfff...!!)
Commence à en avoir sérieusement marre de l'école.

Pourquoi on nous permets pas d'apprendre en autodidacte après l'école, moi j'ai franchement envie de continuer à apprendre en autodidacte car il ne me reste plus grand chose à apprendre, juste un peu plus sur de physique et de géométrie et sur les shaders. (Enfin ça fait pas mal encore mais ça va.)

Enfin soit pourquoi pas tenter de fonder un studio plus tard si je réussis pas, ça me tente vraiment. :D
(Ou en rejoindre un mais à ce qu'on m'a dis même avec un BTS je n'ai aucune chance faut au moins un Bac + 5 et encore t pas sûr d'être pris.)

________
"Il n'y a qu'avec ce que je crée que je représente quelque chose dans la vie des autres.
Mes créations sont ma seule fierté."
 
 


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

A propos de la construction du site...
515114 pages ont été consultées sur le site !
Dont 297 pages pendant les 24 dernières heures.

Page générée en 0.268 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Site de dessins d'enfants


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