Question de calcule de 2d a 3d

SgtJazz Messages postés 18 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 20 décembre 2005 - 6 mai 2005 à 23:25
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 - 14 mai 2005 à 13:04
le but de ma question est pour arriver au resultat suivant:

lorsque je clique avec ma sourir( le clique donnnera un x,y pour la position du curseur) j'aimerais savoir ou ce clic est sur un plancher plat en 3d

les élément qui sont connu:
la position de la camera (x,y,z)
la cible de la camera(x,y,z)
le panorama que la camera voit est 60 deg.
le ration de l,affichage est 3*4 ou un affichage de 800 par 600 pixel

le probleme est le suivant:
lorsque la camera regarde a angle droit au sol c a dir que la camera a le meme x et y que la cible de la camera, j,ai une fonction qui fonctionne.
mais sir la camera et la cible ne partage pas les meme x et y. cela ne fonctionne pas
rapeller vous que la cible de la camera est toujours au centre

un gros Merci,
SgtJazz

1 réponse

Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
14 mai 2005 à 13:04
hello,



si j'ai bien compris ton problème, voici ce qu'il faut faire :

tu peux imaginer ta camera (appelée C) et ta cible (appelée T comme Target) dans l'espace x,y,z à 3D.

Dans cet espace, ton écran est un "rectangle" qui se trouve
perpendiculaire à la droite CT, et dont le centre (appelé A) se trouve
aussi

sur la droite CT à une distance k de C.

Le plan est le suivant :

1) trouver k

2) trouver 2 vecteurs définissant ton écran 2D dans l'espace 3D

3) trouver la position B dans l'espace 3D du point cliqué

4) tirer une droite entre C et B, et l'intersecter avec le plan recherché (si j'ai bien compris, ici, c'est le "sol" z=0)

tu peux faire un petit dessin avec ces expications, tout deviendra plus clair.

j'imagine aussi que tu n'as pas de "spin" sur ta caméra, càd que ta caméra est toujours "droite" par rapport à l'horizon.



les calculs à faire sont donc les suivants :



1) soit L la largeur de ton écran (L=800). Comme tu as un pano de 60°, tu trouves

tan(60/2) (L/2)/k, donc k sqrt(3)*L/2.

Ainsi, le centre de ton écran se trouve en A = C + k * d, où d est le vecteur reliant C à T, de norme 1.



2) soit u le vecteur de ton écran dans l'espace 3D correspondant à l'axe x 2D, et v celui correspondant à l'axe y 3D.

u est perpendiculaire à d, et a 0 comme composante z (pas de "spin"). Un petit produit vectoriel et tu trouves:

(ux,uy,uz) = (dy,-dx,0)

il faut normaliser le vecteur u, càd le diviser par sa norme = dx*dx+dy*dy : ça marche toujours, sauf quand ta caméra

regarde par terre perpendiculairement (c'est le cas de ton algo). Si tu
trouves ||u|| 0, alors il suffit de prendre (ux,uy,uz) (1,0,0) et

(vx,vy,vz) = (0,1,0). ensuite encore un produit vectoriel entre d et u, et tu trouves v :

(vx,vy,vz) = (-dx*dz,-dy*dz,dx*dx+dy*dy), v est déjà normalisé car ||d||=||u||=1

REMARQUE IMPORTANTE ICI :

je te laisse vérifier que u et v sont dans la bonne direction, càd il se peut qu'il faille (-u,v), (u,-v) ou (-u,-v) à la place

de (u,v); ça dépend de comment tu places tes axes sur l'écran 2D, et j'ai pas envie de trop réfléchir :)



3) La position 3D de B est : B = A + x * u + y * v

ATTENTION : c'est là qu'il faut bien faire correspondre tes axes 2D et 3D :

x est la distance entre le centre de l'écran 2D et le point cliqué, y
pareil, et il faut vérifier que tu prends tes axes x de gauche

à droite, et l'axe y de bas en haut.



4) ensuite, c'est tout simple : soit I le point d'intersection, il faut résoudre

I = (ix,iy,iz=0 sol z=0) = C + t * e

où e est le vecteur reliant C à A : e=(Ax-Cx,Ay-Cy,Az-Cz)=(ex,ey,ez)

tu trouves : t = -Cz/ez (qui est infini si ez=0, ce qui se comprend :
pas d'intersection avec le sol si tu regardes tout droit!). Et si t est

négatif, c'est que tu regardes en l'air!



FINALEMENT : tes points X et Y recherchés sont donnés par :



X = Cx + t * ex

Y = Cy + t * ey



Voilà, bonne chance!
0
Rejoignez-nous