2009-08-23 7 views
2

J'écris une simulation de physique en utilisant Ogre et MOC.Détecter un point de collision entre un maillage et une sphère?

J'ai une sphère que je photographie à partir de la position de la caméra et elle se déplace dans la direction de la caméra en utilisant le vecteur avant de la caméra.

Je voudrais savoir comment je peux détecter le point de la collision entre ma sphère et un autre maillage.

Comment serais-je en mesure de vérifier un point de collision entre les deux maillages en utilisant MOC ou OGRE?

Mise à jour: aurait dû le mentionner plus tôt. Je suis incapable d'utiliser une bibliothèque de physique tierce comme nous avons besoin de développer moi-même (uni projet).

Répondre

2

Je pense que le mieux serait d'utiliser une bibliothèque de physique spécialisée.

Cela étant dit. Si je pense à ce problème, je suppose que ce n'est pas si difficile:

La sphère a un point médian et un rayon. Pour chaque point du maillage, procédez comme suit:

  1. Vérifiez si le point se trouve à l'intérieur de la sphère.
  2. si elle ne vérifie si elle est plus proche du centre que le point trouvé précédemment (le cas échéant)
  3. si elle ne ... stocker ce point comme le point de collision

Bien sûr, cette routine sera assez lent. Quelques choses à l'accélérer:

  1. pour un premier trivial rejeter, voir d'abord si la sphère de délimitation du maillage entre en collision
  2. ne CALC pas les squareroots lors de la vérification des distances ... utiliser les longueurs au carré à la place. (beaucoup plus rapide)
  3. au lieu de comparer tous les points du maillage, utilisez un algorithme de répartition spatiale dimensions (quadtree/BSP) pour le maillage de se prononcer rapidement des groupes de points

Ah ... et cette routine ne fonctionne que si la sphère ne voyage pas trop vite (r élatif au maillage). S'il voyageait très vite, et que vous l'échantillonniez X fois par seconde, il est probable que la sphère aurait traversé le maillage sans qu'il y ait collision. Pour surmonter cela, vous devez utiliser des «volumes balayés» qui, fondamentalement, fait de votre sphère un tube. Rendre les mathématiques exponentiellement compliquées.

+3

Si votre mesh est grand par rapport à votre sphère, vous pouvez obtenir 2 points en dehors de la sphère où le bord de connexion croise la sphère. Bien sûr, si vous n'obtiendriez pas cela dans votre contexte, alors vous pourriez juste faire le test du point dans la sphère. – geofftnz

8

La solution acceptée ici à plat ne fonctionne pas. Cela ne fonctionnera que si la densité du maillage est généralement assez élevée pour que deux points sur le maillage ne soient pas plus éloignés que le diamètre de votre sphère de collision. Imaginez une petite sphère lancée à courte distance sur un vecteur aléatoire à un maillage de cube huuuge. Le maillage cube a seulement 8 verts. Quelles sont les chances que le cube atteigne réellement l'un de ces 8 verts?

Cela doit être fait avec une collision par polygone. Vous devez être capable de vérifier l'intersection du polygone et d'une sphère (et en plus un cylindre si vous voulez éviter le tunneling comme reinier mentionné). Il y a quelques ressources pour cette forme en ligne et sous forme de livre, mais http://www.realtimerendering.com/intersections.html pourrait être un point de départ utile.

Les commentaires sur l'optimisation sont bons. Des opportunités de sortie précoce (peut-être une vérification rapide par rapport à une sphère de délimitation ou un volume de délimitation aligné par axe pour le maillage) sont essentielles. Même une fois que vous avez déterminé que vous êtes dans un volume limitatif, il serait probablement judicieux d'éliminer les polygones improbables (trop loin, dans la mauvaise direction, etc.) de la liste des candidats potentiels.

+0

Merci d'avoir signalé cela. J'ai complètement raté ce cas. Mais pour les solutions où le maillage et la sphère sont de taille similaire ou la sphère est plus grande, la sienne pourrait fonctionner correctement? – Toad

+0

@Toad pour ces solutions, l'intersection avec une sphère de délimitation pourrait fonctionner. – AgentFire

Questions connexes