Existe-t-il des projections 3D autres qu'orthographiques et en perspective? [fermé]
22
La question est à peu près dans le titre. Existe-t-il des projections 3D notables autres qu'orthographiques et en perspective qui pourraient être utilisées dans un système 3D comme OpenGL?
En particulier, y en a-t-il qui ont une utilisation particulière dans la conception de jeux?
+1 pour la projection Panini; Je n'en avais jamais entendu parler auparavant. BTW, tant que nous parlons de projections non linéaires, le double paraboloïde est parfois utilisé pour les cartes d'environnement et les cartes d'ombre.
Nathan Reed
Être très pointilleux, mais il semble que ce soit la projection "Pannini", pas "Panini".
aardvarkk
Très sympa! Je suppose que tout cela n'est pas linéaire, comme le dit Nathan Reed?
jmite
Je crois que oui, vous devez très probablement utiliser la tessellation matérielle ou le traitement d'image pour les réaliser dans la pratique. J'ai du mal à penser à une autre projection qui mappe les lignes droites en lignes droites, mais je l'ajouterai à cette réponse si je trouve quelque chose.
MickLH
Cela n'existe probablement pas, c'est exactement le genre de pensée à laquelle je pensais!
jmite
15
Cela dépend de ce que vous entendez par «qui pourrait être utilisé dans un système 3D comme OpenGL». :)
De manière générale, le matériel graphique 3D et les API comme OpenGL ne traitent correctement que les projections linéaires - des projections qui mappent des lignes droites dans l'espace mondial avec des lignes droites sur l'image. Ils ne déforment jamais quelque chose en une forme incurvée (sauf si elle a été incurvée au départ). En effet, les GPU dépendent de triangles ayant des bords droits afin de les pixelliser correctement à l'écran.
Si nous nous limitons aux projections linéaires, il n'y a pas trop de choix. En plus de l'ortho et de la perspective standard, il existe également des variations "décentrées" qui sont obtenues en cisaillant le tronc de la vue.
Une projection ortho excentrée est appelée projection oblique et est souvent utilisée pour les diagrammes d'ingénierie mais n'apparaît pas beaucoup dans les jeux.
Projections en perspective décentrées sont utilisées dans le rendu 3D stéréo , car il s'avère que les vues de l'œil gauche et droit fusionnent mieux dans le cerveau si vous cisaillez les troncs au lieu de les faire pivoter pour vous concentrer sur un objet.
Ces projections peuvent être représentées avec la matrice de projection 4 × 4 habituelle et utilisées sans problème dans une API 3D.
Ensuite, il y a les projections non linéaires, qui n'ont pas la restriction de faire correspondre les lignes droites aux lignes droites; ils sont autorisés à déformer les choses en courbes. Il y en a beaucoup, notamment cylindrique, sphérique, divers types de fisheye et autres.
Avec les projections non linéaires, vous ne pouvez pas simplement utiliser une matrice de projection; vous devez en quelque sorte implémenter la projection vous-même à l'aide de shaders. Une façon consiste à écrire un vertex shader personnalisé pour effectuer la projection par sommet. Le GPU dessinera toujours le triangle avec des lignes droites entre les sommets, donc si les petits triangles seront assez proches pour être corrects, les triangles plus grands seront visiblement faux. Cela peut entraîner des problèmes et il peut être nécessaire de subdiviser la géométrie très finement pour un rendu correct.
Une deuxième approche pour obtenir une projection non linéaire consiste à rendre la scène en utilisant d'abord une projection en perspective régulière (peut-être sur un cubemap, qui a une projection en perspective pour chaque face de cube), puis d'appliquer un shader de pixel post-traitement pour le rééchantillonner à la vue souhaitée projection non linéaire. Cela a l'avantage de ne pas nécessiter de modifications de la géométrie, mais cela peut être plus cher en raison du travail de rendu supplémentaire requis, et le résultat peut être flou dans certaines zones si le rendu de premier passage n'a pas une résolution suffisante. L'approche post-processus est utilisée par les jeux Oculus Rift, par exemple, pour implémenter la projection non linéaire dont le Rift a besoin pour fonctionner avec ses lentilles.
Pour autant que je sache, les projections isométriques sont des cas d'utilisation spécifiques des deux autres types de projection, orthographique et perspective. Par exemple, une projection ortho avec une vue sous un certain angle vous donne une caméra isométrique.
Cela dépend de ce que vous entendez par «qui pourrait être utilisé dans un système 3D comme OpenGL». :)
De manière générale, le matériel graphique 3D et les API comme OpenGL ne traitent correctement que les projections linéaires - des projections qui mappent des lignes droites dans l'espace mondial avec des lignes droites sur l'image. Ils ne déforment jamais quelque chose en une forme incurvée (sauf si elle a été incurvée au départ). En effet, les GPU dépendent de triangles ayant des bords droits afin de les pixelliser correctement à l'écran.
Si nous nous limitons aux projections linéaires, il n'y a pas trop de choix. En plus de l'ortho et de la perspective standard, il existe également des variations "décentrées" qui sont obtenues en cisaillant le tronc de la vue.
Ces projections peuvent être représentées avec la matrice de projection 4 × 4 habituelle et utilisées sans problème dans une API 3D.
Ensuite, il y a les projections non linéaires, qui n'ont pas la restriction de faire correspondre les lignes droites aux lignes droites; ils sont autorisés à déformer les choses en courbes. Il y en a beaucoup, notamment cylindrique, sphérique, divers types de fisheye et autres.
Avec les projections non linéaires, vous ne pouvez pas simplement utiliser une matrice de projection; vous devez en quelque sorte implémenter la projection vous-même à l'aide de shaders. Une façon consiste à écrire un vertex shader personnalisé pour effectuer la projection par sommet. Le GPU dessinera toujours le triangle avec des lignes droites entre les sommets, donc si les petits triangles seront assez proches pour être corrects, les triangles plus grands seront visiblement faux. Cela peut entraîner des problèmes et il peut être nécessaire de subdiviser la géométrie très finement pour un rendu correct.
Une deuxième approche pour obtenir une projection non linéaire consiste à rendre la scène en utilisant d'abord une projection en perspective régulière (peut-être sur un cubemap, qui a une projection en perspective pour chaque face de cube), puis d'appliquer un shader de pixel post-traitement pour le rééchantillonner à la vue souhaitée projection non linéaire. Cela a l'avantage de ne pas nécessiter de modifications de la géométrie, mais cela peut être plus cher en raison du travail de rendu supplémentaire requis, et le résultat peut être flou dans certaines zones si le rendu de premier passage n'a pas une résolution suffisante. L'approche post-processus est utilisée par les jeux Oculus Rift, par exemple, pour implémenter la projection non linéaire dont le Rift a besoin pour fonctionner avec ses lentilles.
la source
Je ne peux pas le croire, mais personne n'a mentionné la projection isométrique qui était assez courante.
la source