IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XNA/Monogame Discussion :

Creer bounding en fonction du Model


Sujet :

XNA/Monogame

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut Creer bounding en fonction du Model
    Bonjour a tous,

    Après une semaine à avoir épuché tous les types de tuto inimaginable pour chercher un moyen détecter convenablement la collision entre deux models, je craque et je me tourne vers vous.

    J'aurai souhaité savoir comment parvenir à générer une bounding sphere, box voir meme un liste de box ou sphere décrivant parfaitement les contours de n'imorte quel model que j'importe.

    En effet, je ne voit pas créer manuellement chaque bounding box ou sphere pour une map par exemple, la précision ne serait pas bonne en plus...

    Jusqu'ici j'ai du tester tout se que j'ai trouvé sur la toile, se qui se rapproche le plus de se que je voulais faire c'était de créer une liste de bounding sphere en fonction de chaque mesh du model, mais si le model comporte des zones plates, la mesh est grande et sa me genère une sphere de collision 400 fois trop grande, du coup, j'ai un collision à 400m de l'objet par endroit :S

    J'ai également testé de faire fonctionner se code qui a semblé ravir les personnes désirant faire ce que je cherche à faire ^^ mais sa ne tourne pas sur XNA 4.0 et les vertex se n'est pas encore ma tasse de thé ...

    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
    public BoundingBox GetBoundingBoxFromModel(Model model)
    {
      BoundingBox boundingBox = new BoundingBox()
     
     
      foreach (ModelMesh mesh in model.Meshes)
      {
        VertexPositionNormalTexture[] vertices =
          new VertexPositionNormalTexture[mesh.VertexBuffer.SizeInBytes / VertexPositionNormalTexture.SizeInBytes];
     
        mesh.VertexBuffer.GetData<VertexPositionNormalTexture>(vertices);
     
        Vector3[] vertexs = new Vector3[vertices.Length];
     
        for (int index = 0; index < vertexs.Length; index++)
        {
          vertexs[index] = vertices[index].Position;
        }
     
        boundingBox = BoundingBox.CreateMerged(boundingBox,
          BoundingBox.CreateFromPoints(vertexs));
      }
     
      return boundingBox;
    }
    Je remercie toutes les personnes qui seront m'aider par tous les moyens possible, je désespère et un jeu 3D sans collision s'est comme un gâteau au chocolat... sans chocolat ^^

    Merci d'avance a tous !!!!!!!!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Salut,

    Déjà, commence par faire un petit tour par là

    en suite:
    un liste de box ou sphere décrivant parfaitement les contours de n'imorte quel model
    Ce n'est pas possible (à moins de réaffiner les box à l'infinie), et de toute façon ce n'est pas la bonne façon d'utiliser les bounding box/sphere.
    Les bbox servent à avoir une approximation rapide du model pour éliminer rapidement une géométrie:
    Si 2 bbox ne se collisionnent pas, ALORS les mesh ne se collisionnent pas (l'inverse n'étant pas vrai !).
    Si 2 bbox se collisionnent, alors il faut faire un calcul d'intersection plus poussé sur la géométrie (triangle/triangle généralement)

    Après il existe des méthodes de génération de bbox plus poussées (octree, ...) mais elles visent toutes à éliminer le plus de géométrie possible avant de se faire une intersection triangle/triangle. Ce n'est pas elles qui font réellement le calcul d'intersection.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut Apocalypses,

    Comme je le répète souvent, pourquoi se casser à faire un gestionnaire de collisions alors que des moteurs physiques existent ! Bien sûr on y arrive seul en 3D mais les performances ne sont pas toujours au rendez-vous. Pour la 3D il y a Bepu qui est performant:

    http://bepuphysics.codeplex.com/

    ou Jitter:

    http://jitter-physics.com/wordpress/

    Sinon il y a un exemple pour xna 4.0 ici:

    http://gamedev.stackexchange.com/que...s-with-xna-4-0

    Salutations.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonsoir,

    Je vous remercie de vos réponse et du point de grammaire -.-

    Cela m'a permis de comprendre un peu plus le principe des bounding box, utilisé donc pour amorcer une collision mais sans plus...

    Etant un peu short dans le temps qui ma été donné je vais me tourner vers BEPUphysics qui semble faire exactement se que j'ai besoin sans en faire trop.

    Je vous remercie et vous tiens au courant si le problème persiste

    Bonne continuation

  5. #5
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    salut, si cela peut aider, j'ai posté un tuto sur la création de OBB pour un mesh, te restera à coder la collision entre obb, regardes l'adresse de mon site..., ça te posera moins de problèmes qu'avec des sphères pour la précision, et tu pourras jouer avec un paramètre filterweight pour affiner tes obb, si certaines personnes trouvent des choses à améliorer pour affiner la création de chaque obb, je suis preneur...

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    Je te remercie pour ton post, je viens de regarder brievement ton code et sa pourrait en effet m'aider, se n'est pas que je n'aime pas les moteurs tout fait mais on est moins libre ^^. Par contre, cela marchera-il avec une map ?
    La recherche des collisions et l'actualisation des OBB ne font-elle pas laguer le jeux ?

    Je te remercie par avance...

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Pour améliorer les performances sur les tests de collision on utilisera des structures de partitionnement de l'espace (Space partitionning), qui permettront de déterminer plus rapidement dans quel coin chercher la collision (un peu comme une recherche dichotomique). Après, la mise à jour d'OBB ou même des structures de partitionnement prend un temps, certes, mais ça devrait être correct niveau performance.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Apocalypses Voir le message
    Bonjour,

    Je te remercie pour ton post, je viens de regarder brievement ton code et sa pourrait en effet m'aider, se n'est pas que je n'aime pas les moteurs tout fait mais on est moins libre ^^. Par contre, cela marchera-il avec une map ?
    La recherche des collisions et l'actualisation des OBB ne font-elle pas laguer le jeux ?

    Je te remercie par avance...
    heu, bein dit moi plutôt quel type de collision tu veux réaliser...
    ex: obb - ray, obb - aabb, obb-obb...

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Se sont surtout des collisions avec une map, je souahiterai faire un perso sur une map, pour le perso je pensais donc faire des obb mais pour la map que dois-je utiliser car actuellement c'est le moteur bepuphysics qui gère les collisions.

  10. #10
    Membre régulier
    Homme Profil pro
    médical
    Inscrit en
    Septembre 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : médical

    Informations forums :
    Inscription : Septembre 2007
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Apocalypses Voir le message
    Se sont surtout des collisions avec une map, je souahiterai faire un perso sur une map, pour le perso je pensais donc faire des obb mais pour la map que dois-je utiliser car actuellement c'est le moteur bepuphysics qui gère les collisions.
    pour les map, si c'est un terrain, il te faut gérer des octrees, si c'est une carte d'intérieur (type quake3 par ex), les bsp tree.

    dans ma vie je n'ai géré que des octrees, il y a bien longtemps, donc pour la suite je ne suis pas certain de pouvoir t'aider.

    la seule chose à te dire pour les octrees :

    tu vas devoir créer une grosse boite englobante de type (AABB)(fait en sorte que elle soit plus grande en largeur/hauteur/longueur pour que même si ton perso tend les bras ou les jambes ou si il est allongé, il reste entièrement dans la boite).

    Cette boite ne changera pas sur la rotation (juste translate) comme ça ce sera plus facile pour tester rapidement si il est dans un octree bien précis (ou à cheval entre plusieurs).

    de là l'algo ressemblera à quelque chose dans ce genre :

    1) lister chaque octree pour savoir si il y a des persos dedans (test de collision Octree <-> AABB), l'octree est en quelque sorte aussi une AABB

    2) si des persos se trouvent dans un octree alors regarder si leurs AABB rentre en collision (test de collision AABB <-> AABB)

    3) si collision regarder quel OBB du perso A rentre avec quel OBB du perso B (test de collision OBB <-> OBB)


    tu pourrais pousser encore les tests,mais au bout d'un moment, je me demande si tu ne risques pas de trop perdre de FPS...

Discussions similaires

  1. Creer un document decrivant un modele de donnees
    Par Mimi94800 dans le forum Qualité
    Réponses: 1
    Dernier message: 06/12/2012, 14h24
  2. [ZF 1.10] Fonction du model s'exécutant deux fois et routeur
    Par hackiles dans le forum Zend Framework
    Réponses: 7
    Dernier message: 17/12/2010, 23h05
  3. Réponses: 7
    Dernier message: 05/04/2010, 02h11
  4. Réponses: 1
    Dernier message: 18/05/2009, 22h38
  5. Creer ca propre fonction de cast
    Par gazzall17 dans le forum C#
    Réponses: 5
    Dernier message: 07/03/2007, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo