2010-02-05 3 views
1

Je construis une interface de glisser-déposer 3D simple dans le traitement, et je veux détecter quand la souris survole un objet. J'imagine que j'ai besoin de faire des traductions matricielles aux coordonnées du modèle 3D pour les obtenir dans l'espace écran et ainsi de suite ...Traduction des coordonnées X & Y de la souris en coordonnées 3D

J'ai une version simple de ce fonctionnement, le problème est que lorsque la caméra est déplacée la scène les coordonnées que je reçois vont haywire.

Alors comment traduire les coordonnées des tuiles dans l'espace d'écran (puisque les screenY & screenY ne fonctionnent pas correctement)?

MISE À JOUR: J'ai finalement trouvé deux exemples du site de traitement sur la façon de procéder. Merci à villintehaspam.

http://processing.org/hacks/hacks:picking

+0

Pour voir une projection 2D de votre objet 3D, vous devez traduire des coordonnées 3D en une projection 2D spécifique (coordonnées d'écran). Le problème est que cette traduction implique une perte, donc vous ne pouvez pas simplement inverser le processus et obtenir un point en 3D. Vous devez projeter un rayon en arrière, trouver tous les objets que le rayon croise et trier par ordre-Z. –

Répondre

3

Ce problème est appelé la cueillette. Recherchez la sélection de la souris et vous obtenez beaucoup, beaucoup de hits.

théorie de base est la suivante:

  1. Get x, y coords du clic de la souris.
  2. Convertit ces coordonnées en coordonnées x, y, z en coordonnées oculaires (ie -1 < = 0 < = 1, -1 < = y < = 1, z = distance du clip proche/lointain, si vous avez une projection normale) .
  3. Transformez ces coordonnées par l'inverse de la matrice de projection pour obtenir les coordonnées du monde.
  4. Vous avez maintenant un rayon de la position de la caméra, avec la direction vers les coordonnées du monde que vous venez d'obtenir.
  5. Effectuez un test d'intersection rayons-objets avec les objets que vous souhaitez prendre en compte. Choisissez l'objet qui intersecte le rayon le plus proche de l'origine du rayon (position de la caméra).
+0

Merci beaucoup pour cela. Il s'avère qu'il y a déjà du code pour cela (ce qui n'est pas surprenant), je ne l'ai tout simplement pas trouvé. Avoir le bon terme de recherche a aidé. –

Questions connexes