Question

J'ai rendu une scène 3D en utilisant glFrustum() mode perspective.J'ai ensuite un objet 2D que je place sur la scène 3D pour servir d'étiquette à un objet 3D particulier.J'ai calculé la position 2D de l'objet 3D en utilisant using gluProject() à quelle position je place ensuite mon objet étiquette 2D.L'objet étiquette 2D est rendu en utilisant glOrtho() mode orthographique.Cela fonctionne parfaitement et l'objet étiquette 2D survole l'objet 3D.

Maintenant, ce que je veux faire, c'est donner à l'objet 2D une valeur z afin qu'il puisse être caché derrière d'autres objets 3D de la scène à l'aide du tampon de profondeur.J'ai donné à l'objet 2D une valeur z qui, je le sais, devrait être masquée par le tampon de profondeur, mais lorsque je rends l'objet, il est toujours visible.

La question est donc : pourquoi l’objet 2D est-il toujours visible et non caché ?

J'ai lu quelque part que les projections orthographiques et en perspective stockaient des valeurs de tampon de profondeur incompatibles.Est-ce vrai, et si oui, comment puis-je convertir entre eux ?

Était-ce utile?

La solution

Je ne veux pas qu'il soit transformé, mais je veux qu'il apparaisse comme une étiquette 2D plate qui fait toujours face à la caméra et reste à tout moment de la même taille sur l'écran.Cependant, s'il est caché derrière quelque chose, je veux qu'il apparaisse caché.

D'abord, tu aurais dû mettre que dans votre question ;cela explique bien plus ce que vous essayez de faire que votre question.

Pour y parvenir, vous devez trouver la coordonnée z dans la projection orthographique qui correspond à la coordonnée z dans l'espace pré-projectif de l'endroit où vous souhaitez que l'étiquette apparaisse.

Quand tu as utilisé gluProject, vous avez trois coordonne le retour.La coordonnée Z est importante.Ce que vous devez faire est d'inverser la transformation de la coordonnée Z en fonction des valeurs zNear et zFar que vous donnez à glOrtho.

Note pédante : gluProject ne transforme pas la coordonnée Z en espace fenêtre.Pour ce faire, il faudrait prendre le glDepthRange paramètres.En réalité, il suppose une plage de profondeur proche = 0,0 et lointaine = 1,0.

Notre première étape consiste donc à passer de l’espace fenêtre Z à l’espace Z de coordonnées de périphérique normalisées (NDC).Nous utilisons cette équation simple :

ndcZ = (2 * winZ) - 1

Assez simple.Maintenant, nous devons aller dans l’espace de découpage.Ce qui est impossible, car avec une projection orthographique, la coordonnée W est supposée être 1,0.Et la division par W est la différence entre l'espace de clip et l'espace NDC.

clipZ = ndcZ

Mais nous n'avons pas besoin de l'espace de découpe Z.Nous avons besoin d'un espace de projection pré-orthographique Z (alias :espace caméra Z).Et cela nécessite les paramètres zNear et zFar que vous avez donnés à glOrtho.Pour accéder à l'espace caméra, nous procédons comme suit :

cameraZ = ((clipZ + (zFar + zNear)/(zFar - zNear)) * (zFar - zNear))/-2

Et tu as fini.Utilisez cette position Z dans votre rendu.Oh, et assurez-vous que votre matrice modelview n'inclut aucune transformation dans la direction Z (sauf si vous utilisez la matrice modelview pour appliquer cette position Z à l'étiquette, ce qui est très bien).

Autres conseils

Sur la base de la réponse de Nicol, vous pouvez simplement définir zNear sur 0 (ce qui est généralement logique pour les éléments 2D qui font partie de l'interface graphique), puis vous avez simplement :

cameraZ = -winZ*zFar
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top