2015-07-24 2 views
1

Je souhaite convertir les coordonnées d'écran 2D en coordonnées 3D. J'ai beaucoup cherché mais je n'ai pas obtenu de résultat satisfaisant.Conversion de l'écran 2D en coordonnées 3D du monde

Remarque: Je n'utilise pas OpenGL ni aucune autre bibliothèque graphique.

données que j'ai:

écran X

écran Y

écran Hauteur

Largeur de l'écran

Aspect Ratio

+0

Vous devez connaître les autres propriétés de la caméra. IE Projection Matrix et View Matrix (ou position x, y, z et orientation). En outre, vous ne pouvez calculer qu'un rayon et non les coordonnées réelles en 3D. –

+0

Désolé, j'ai la position de la caméra ainsi que ses vecteurs frontaux. – rvmod

+0

Vous ne pouvez pas simplement convertir des coordonnées d'écran 2D en coordonnées 3D du monde. Vous pouvez le voir comme un mappage un-à-plusieurs, donc vous n'obtenez pas un seul point mais une ligne entière. Vous recherchez probablement Ray Casting. – aslg

Répondre

1

Si vous avez le monde Caméra Matrice et la matrice de projection c'est pret ty simple.

Si vous n'avez pas la matrice du monde, vous pouvez la calculer à partir de sa position et de sa rotation. Où translate renvoie les matrices de traduction 4x4 et Rotate renvoie les matrices de rotation 4x4 autour de l'axe donné.

La matrice de projection peut être calculée à partir du rapport d'aspect, de l'angle de champ de vision et des plans proche et lointain.

This blog a une bonne explication de la façon de calculer la matrice de projection.

Vous pouvez unproject l'écran les coordonnées en faisant:

mat = worldMatrix * inverse(ProjectionMatrix) 
dir = transpose(mat) * <x_screen, y_screen, 0.5, 1> 

dir /= mat[3] + mat[7] + mat[11] + mat[15] 
dir -= camera.position 

Votre rayon pointera de la caméra dans la direction dir.

Cela devrait fonctionner, mais ce n'est pas un exemple super concret sur la façon de le faire.

Fondamentalement, il vous suffit de suivre les étapes suivantes:

calculate camera's worldMatrix 
calculate camera's projection matrix 
multiply worldMatrix with inverse projection matrix. 

create a point <Screen_X_Value, Screen_Y_Value, SOME_POSITIVE_Z_VALUE, 1> 
apply this "inverse" projection to your point. 
then subtract the cameras position form this point. 

Le vecteur résultant est la direction de la caméra. Tout point le long de ce rayon correspond aux coordonnées 3D correspondant à vos coordonnées d'écran 2D.