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!