2010-09-03 8 views
2

Je suis en train de développer un jeu dont l'ensemble du terrain est constitué de boîtes AABB. Je connais les verticies, minimum et maximum de chaque boîte. J'ai aussi mis en place mon appareil photo comme ceci:Trouver un objet sous la souris

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glRotatef(Camera.rotx,1,0,0); 
glRotatef(Camera.roty,0,1,0); 
glRotatef(Camera.rotz,0,0,1); 

glTranslatef(-Camera.x,-Camera.y,-Camera.z); 

Ce que je suis en train de faire est de trouver essentiellement le cube de la souris est activée. J'ai pensé à donner à la souris une position de vecteur directionnel vers l'avant et simplement itérer jusqu'à ce que la «balle de souris» touche quelque chose. Cependant cela implique d'interagir à travers tous les objets plusieurs fois. Y a-t-il un moyen de le faire en faisant seulement une itération à travers tous les objets une fois?

Merci

+2

Probablement http://gamedev.stackexchange.com/ est un meilleur endroit à demander? – GSerg

+1

Pourquoi devez-vous répéter plusieurs fois? –

+0

Bonne question cependant, également le marquer avec la cueillette 3d. – hydrogen

Répondre

3

Cela est généralement appelé « picking » This here ressemble à un lien basé bonne gl

Si tel est tldr, puis un algorithme de base, vous pouvez utiliser

  1. objets trier par z (ou garder les trier par z, ou les tours de tampon de profondeur, etc.)
  2. itérez et faites un test de limites, en vous arrêtant lorsque vous frappez le premier.
1

Ceci est appelé Ray Tracing (oups, mon erreur, il est en fait Ray casting). Chaque moteur physique a cette fonctionnalité. Vous pouvez regarder l'un des plus simples - ODE, ou c'est dérivé - Bullet. Ils sont open-source afin que vous puissiez sortir ce dont vous n'avez pas besoin. Ils ont tous deux une bibliothèque mathématique pratique qui gère toutes les opérations de matrice et de vertex souvent nécessaires. Ils ont tous des démonstrations sur comment faire exactement cette tâche.

0

Il y a beaucoup d'informations sur les tests de succès dans OpenGL sur la OpenGL FAQ

0

Je vous suggère d'envisager de regarder cette question d'une plus grande perspective.

Les boîtes ne sont que des points de résolution inférieure. L'astuce consiste à réduire la résolution de la souris pour savoir sur quelle boîte il est.

Vous devrez peut-être effectuer une conversion 2d à 3d (ou vice versa). Dans la plupart des jeux, la souris vit dans un monde de coordonnées 2d. Le truc "sous" la souris est une projection 2D d'un univers 3D.

0

Vous souhaitez utiliser un algorithme de sélection 3D. L'idée est que vous dessinez un rayon à partir de la position de l'utilisateur dans le monde virtuel dans le sens du clic. This blog post explique très clairement comment implémenter un tel algorithme. Essentiellement vos coordonnées d'écran doivent être transformées de l'espace d'écran à l'espace du monde virtuel. Il y a un site qui a une très bonne description des différentes transformations et je ne peux pas poster le lien en raison de mon rang. Rechercher le livre de l'algorithme de sélection de souris de crochet [Je ne possède pas le site et je n'ai pas écrit le document]. Une fois que vous obtenez un rayon dans la direction souhaitée, vous devez effectuer des tests d'intersection avec les géométries dans le monde réel. Puisque vous avez entièrement des boîtes AABB, vous pouvez utiliser des équations vectorielles simples pour vérifier quelle géométrie intersecte le rayon. Je dirais que l'approximation de vos boîtes en tant que sphère rendrait la vie très facile puisqu'il y a un test d'intersection sphère-rayon très simple. Ainsi, votre rayon serait décrit par ce que vous obtenez à partir de la première étape (le rayon dessiné dans la première étape) et ensuite vous auriez besoin d'utiliser un test d'intersection. Si vous êtes d'accord pour utiliser des sphères, le centre de la sphère serait le point où vous dessinez votre boîte et le diamètre serait la largeur de votre boîte.

Bonne chance!

Questions connexes