C++/OpenGL convertir monde coords à l'écran(2D) coords
Je fais un jeu en OpenGL où j'ai quelques objets dans le monde de l'espace. Je veux faire une fonction où je peux prendre dans la position d'un objet (3D) et de la transformer à l'écran de l'emplacement (2D) et le retourner.
Je sais que la 3D à l'emplacement de l'objet, de la projection de la matrice et la matrice de vue dans la suite de varibles:
Matrix projectionMatrix;
Matrix viewMatrix;
Vector3 point3D;
OriginalL'auteur Danny | 2011-12-13
Vous devez vous connecter pour publier un commentaire.
Pour faire cette transformation, vous devez d'abord prendre votre modèle d'espace de positions et de les transformer en clip-espace. C'est fait avec de la matrice se multiplie. Je vais utiliser GLSL-style code afin de le rendre évident ce que je fais:
Avis comment je convertir votre 3D vecteur en un vecteur 4D avant la multiplication. Cela est nécessaire parce que les matrices sont des 4x4, et vous ne pouvez pas multiplier une matrice de 4x4, avec des un vecteur 3D. Vous avez besoin d'un quatrième volet.
La prochaine étape est de transformer cette position de clip-espace normalisé périphérique espace de coordonnées (NDC de l'espace). NDC espace sur l'intervalle [-1, 1] dans les trois axes. Ceci est fait par la division de la première de trois coordonnées par le quatrième:
Évidemment, si
clipSpacePos.w
est à zéro, vous avez un problème, de sorte que vous devriez vérifier à l'avance. Si elle est égale à zéro, alors cela signifie que l'objet est dans le plan de projection; c'est la vue de l'espace-la profondeur est égale à zéro. Et ces sommets sont automatiquement coupés par OpenGL.La prochaine étape est de transformer à partir de ce [-1, 1] l'espace à la fenêtre-coordonnées relatives. Cela nécessite l'utilisation de valeurs que vous avez passé à
glViewport
. Les deux premiers paramètres sont le décalage à partir de la partie inférieure gauche de la fenêtre (vec2 viewOffset
), et la seconde, deux paramètres sont la largeur/hauteur de la zone de fenêtre d'affichage (vec2 viewSize
). Compte tenu de ces, la fenêtre de l'espace-position:Et c'est aussi loin que vous alliez. Rappelez-vous: OpenGL fenêtre de l'espace est par rapport à la en bas à gauche de la fenêtre, pas le haut à gauche.
La meilleure réponse que j'ai trouvé après Googler pour un certain temps et le seul que j'ai trouvé qui mentionne avoir à diviser par clipSpacePos.w.
Remarque: si la fenêtre de l'espace-si par rapport à la partie supérieure gauche de la fenêtre, puis
windowSpacePos
devrait êtrevec2( ((ndcSpacePos.x + 1.0) / 2.0) * viewSize.x + viewOffset.x, ((1.0 - ndcSpacePos.y) / 2.0) * viewSize.y + viewOffset.y )
OriginalL'auteur Nicol Bolas