Comment calculer la coordonnée z en projection perspective. Propriétés géométriques de plusieurs images

Pour décrire en détail les méthodes de suivi des caractéristiques ponctuelles, d'étalonnage de la caméra et de reconstruction d'objets 3D, il est nécessaire d'introduire un modèle de conception en perspective et de décrire les propriétés géométriques de cette transformation. Points de plusieurs images obtenues à l'aide projection en perspective, sont dans relation particulière les uns avec les autres, qui sont décrits par la géométrie épipolaire. Les modèles de ces relations doivent être examinés en détail, car Presque toutes les méthodes de reconstruction tridimensionnelle nécessitent l'évaluation des modèles correspondants et s'appuient sur leurs propriétés.

Il est nécessaire de noter séparément l'hypothèse selon laquelle images sources la même scène est capturée, c'est-à-dire chaque image est une vue de la scène provenant d'une caméra spécifique. Par conséquent, pour faciliter la description, le concept de vue est introduit, comme une image avec un modèle de caméra associé à partir duquel elle a été obtenue.

Projection en perspective

Le modèle de projection en perspective correspond à une caméra sténopé idéale. Ce modèle correspond assez étroitement au processus de construction d’image de la plupart des appareils photo et vidéo modernes. Cependant, en raison des limites de l’optique moderne, le processus réel est quelque peu différent du modèle de caméra sténopé. Les différences entre le processus réel et le modèle sont appelées distorsions et sont modélisées séparément.

Le modèle de caméra sténopé le plus simple est pratique dans la mesure où il est entièrement décrit par le centre de projection et la position du plan image. Par conséquent, la projection de n’importe quel point de la scène dans l’image peut être considérée comme l’intersection du rayon reliant le centre de la projection et le point de la scène avec le plan de l’image.

Le modèle le plus simple de projection en perspective

Considérons le cas le plus simple où le centre de projection de la caméra (focus) est placé à l'origine du système de coordonnées, et le plan image coïncide avec le plan Z=1. Soit (X,Y,Z) les coordonnées d'un point dans 3 espace dimensionnel, et (x,y) est la projection de ce point sur l'image I. La projection en perspective dans ce cas est décrite par les équations suivantes :

DANS forme matricielle En utilisant des coordonnées homogènes, ces équations sont réécrites comme suit :

(2.2)

Le plan situé à une distance de 1 du centre de la projection et perpendiculaire à l'axe optique est appelé plan image idéal. L'axe optique coupe le plan image idéal en un point c, appelé point principal. Une illustration du cas le plus simple de projection en perspective est présentée sur la Fig. 1.

Calibrage de la caméra interne

Le cas le plus simple de projection en perspective ne correspond presque toujours pas à la caméra réelle. La distance du centre de projection au plan image, c'est-à-dire la distance focale, notée f, n'est généralement pas égale à 1. De plus, les coordonnées d'un point dans le plan image peuvent ne pas coïncider avec les coordonnées absolues. Lors de l'utilisation d'un appareil photo numérique, la relation entre les coordonnées d'un point dans l'image et les coordonnées absolues d'un point sur un plan idéal est déterminée par la forme et la taille des pixels de la matrice.

Notons les dimensions en pixels d'une matrice d'appareil photo numérique par p x , p y , l'angle d'inclinaison des pixels par α et le point principal par , Fig. 2. Alors les coordonnées du point (x,y) dans l'image correspondant au point (x R , y R) sur le plan idéal sont déterminées par l'expression :

(2.3)

Si on note f x ,f y distance focale f, mesuré en largeurs et hauteurs de pixels, et tan(α)*f/py noté s, alors la formule 2.3 est convertie en :

(2.4)

La matrice K est appelée la matrice calibrage interne caméras. Dans la plupart des cas, dans les vrais appareils photo numériques, l'angle des pixels est proche de la ligne droite, c'est-à-dire paramètre s=0, et la largeur et la hauteur du pixel sont égales. Le point principal est généralement situé au centre de l'image. La matrice K peut donc s’écrire :

(2.5)

Cette hypothèse sur la forme de la matrice K est largement utilisée pour simplifier les algorithmes permettant de déterminer l'étalonnage interne de la caméra, ainsi que dans la modélisation d'images synthétiques nécessaires pour évaluer la qualité et l'efficacité des méthodes de reconstruction 3D.

Calibrage de la caméra externe

Soit M un point de scène dans un espace tridimensionnel. Tout mouvement est une transformation euclidienne de l'espace, donc en coordonnées homogènes il s'exprime comme :

(2.6)

où R est la matrice de rotation, T= T est le vecteur de translation.

Le mouvement de la caméra par rapport à la scène équivaut à mouvement inverse points de la scène par rapport à la caméra, est donc égal à :

(2.7)

où R, T sont la matrice de rotation et le vecteur de mouvement de la caméra par rapport à la scène. La matrice C est appelée matrice étalonnage externe caméras. La matrice C -1 est appelée matrice mouvements de caméra. Ainsi, la matrice d'étalonnage de la caméra externe traduit les coordonnées des points de la scène du système de coordonnées de la scène vers le système de coordonnées associé à la caméra.

Modèle de projection en perspective complet

À partir des expressions 2.1, 2.4, 2.7, nous pouvons dériver une expression pour une projection en perspective arbitraire pour toute caméra avec une orientation et une position arbitraires dans l'espace :

Sous une forme plus concise, compte tenu de la notation précédente, cette formule peut s'écrire :

La matrice P est appelée matrice de projection de caméra.

Par analogie avec la transformation de perspective générale, considérons d'abord le cas le plus simple d'une transformation de perspective d'un plan. Soit le plan p coïncide avec le plan Z=0, alors homogène Coordonnées 3D n'importe lequel de ses points M=. Pour toute caméra dotée d'une matrice de projection P, la transformation en perspective du plan est décrite par une matrice 3*3 :


Puisque n'importe quel plan dans l'espace tridimensionnel peut être transféré au plan Z = 0 par la transformation euclidienne de rotation et de translation, ce qui équivaut à multiplier la matrice de caméra P par la matrice de transformation L, alors l'affichage en perspective d'un plan arbitraire dans l'espace est décrit par transformation linéaire avec une matrice 3*3.

La transformation du plan de perspective est également appelée homographie. Sous forme matricielle, la transformation en perspective du plan s'écrit m=HM.

Géométrie de deux images

La scène capturée dans toutes les images sources est considérée comme immobile, donc la position relative des projections des points de scène sur différentes images ne peut pas changer de manière arbitraire. Les restrictions imposées sur l'emplacement des projections ponctuelles dépendent évidemment des paramètres des caméras et de leur position les unes par rapport aux autres. Par conséquent, la définition de modèles de telles restrictions fournit des informations sur les positions relatives des caméras à partir desquelles les images ont été obtenues.

Transformation du plan de perspective

Si les centres des deux caméras coïncident, alors les points sur les plans image des deux caméras sont translatés l'un vers l'autre par une transformation en perspective du plan. Dans ce cas, la transformation des points entre images ne dépend pas de la forme de la scène tridimensionnelle, mais dépend uniquement de position mutuelle plans images.

Si la scène entière ou une partie de celle-ci est un avion, alors ses images sur différents types avec des centres de caméra non coïncidants peuvent être convertis les uns dans les autres par une transformation homographique. Soit p le plan observé, H 1 la transformation homographique entre le plan p et l'image Je 1, H 2 - transformation homographique entre le plan p et l'image Je 2. Puis la transformation homographique H 12 entre images Je 1 Et Je 2 peut être sorti comme suit :

H 12 ne dépend pas du paramétrage du plan p, et donc ne dépend pas du système de coordonnées dans l'espace

La plupart des méthodes permettant de déterminer les coordonnées de points 3D à partir de leurs projections et les méthodes de reconstruction d'une scène 3D reposent sur l'hypothèse que le centre de la caméra se déplace entre les vues. Par conséquent, si les centres de caméras de plusieurs types coïncident, ces méthodes donneront des résultats incorrects. De telles configurations de caméras doivent être détectées et traitées d'une manière particulière.

Puisque la transformation homographique s'écrit en coordonnées homogènes, la matrice H est définie à l'échelle. Il possède 8 degrés de liberté et est paramétré par 8 variables. Chaque paire connue de points correspondants m1 Et m2 dans la première et la deuxième image donne respectivement 2 équations linéairesà partir des éléments de la matrice H. Ainsi, 4 couples connus de points correspondants suffisent pour composer un système d'équations linéaires de 8 équations à 8 inconnues. Selon ce système, l'homographie H peut être déterminée de manière unique si trois points ne se trouvent pas sur la même ligne.

Matrice fondamentale

Considérons le cas où les centres des deux types de caméras ne coïncident pas. Laisser C1 Et C2- centres de deux caméras, M - point tridimensionnel de la scène, m1 Et m2- projections du point M sur respectivement la première et la deuxième images. Soit P un plan passant par le point M et les centres des caméras C1 Et C2. Le plan P coupe les plans image des première et deuxième vues le long de lignes droites. l1 Et l2. Depuis les rayons C1M Et C2M se trouvent dans le plan P, alors il est évident que les points m1 Et m2 s'allonger sur des lignes droites l1 Et l2 respectivement. Nous pouvons donner une affirmation plus générale selon laquelle les projections de tout point M" situé dans le plan Π sur les deux images doivent se trouver sur des droites l1 Et l2. Ces lignes sont appelées lignes épipolaires. Le plan P est appelé plan épipolaire.

Deux vues de la même scène sont appelées une paire stéréo et un segment C1C2, la connexion des centres des caméras est appelée base de la paire stéréo (ligne de base) ou base stéréo. Tout plan épipolaire traverse le segment C1C2. Laisser C1C2 coupe les première et deuxième images en des points e 1 Et e 2 respectivement. Points e 1 Et e 2 sont appelés points épipolaires ou épipôles. Toutes les lignes épipolaires se coupent en des points e 1 Et e 2 respectivement dans la première et la deuxième image. L'ensemble des plans épipolaires est un faisceau se coupant le long de la base stéréo C1C2. Les nombreuses lignes épipolaires dans les deux images représentent également des faisceaux de lignes droites se coupant à e 1 Et e 2 .

Points m1 Et m2 sont dites correspondantes s'il s'agit de projections du même point de scène M. Lignes épipolaires l1 Et l2 sont dits correspondants s'ils se situent dans le même plan épipolaire P. Si le plan épipolaire P passe par un point m1, puis les lignes épipolaires l1 Et l2, qui s'y trouvent sont appelés correspondant au point m1.

Restriction sur la position des points correspondants m1 Et m2, qui découle de la géométrie épipolaire, peut être formulé ainsi : point m2, correspondant m1, doit se situer sur la ligne épipolaire l2, correspondant m1. Cette condition est appelée contrainte épipolaire. En coordonnées homogènes, la condition qu'un point m est sur la ligne jeécrit comme lTm=0. La ligne épipolaire passe également par le point épipolaire. Équation d'une droite passant par des points m1 Et e 1 peut s'écrire sous la forme :

je 1 ∼ x m 1,

x- une matrice antisymétrique de dimension 3*3 telle que, x m 1 - produit vectoriel m1 Et e 1.

Pour les lignes épipolaires correspondantes l1 Et l2 droite:

P+- pseudoinversion de la matrice P.

La matrice F est appelée matrice fondamentale. Elle représente opérateur linéaire, correspondant à chaque point m1 sa ligne épipolaire correspondante l2. Pour chaque paire de points correspondants m1 Et m2 droite

m T 2 Fm 1 =0

Il s'agit d'une formulation de la contrainte épipolaire à travers la matrice fondamentale.

La matrice fondamentale possède 7 degrés de liberté. Chaque paire de points correspondants m1 Et m2 définit une équation linéaire pour les éléments de la matrice, elle peut donc être calculée à partir des 7 paires connues de points correspondants.

La contrainte épipolaire est valable pour toute paire de points correspondants situés sur des plans idéaux de deux types. Si les matrices d’étalonnage internes sont connues K1 Et K2 caméras des deux types, alors la contrainte épipolaire pour les points correspondants sur les plans idéaux s'écrit :

La matrice E est appelée significatif matrice. On peut montrer que la matrice essentielle peut également être obtenue à partir des positions relatives des caméras.

Laisser P1 =(I|0) Et P2 =(R|-RT)- deux matrices de conception avec calibrage K = I. Ensuite les équations de conception du plan idéal des deux caméras s'écrivent sous la forme :

Retrouvons la ligne épipolaire dans la deuxième vue correspondant au point m"1 sur le premier. Pour ce faire, il suffit de projeter sur la deuxième vue deux points situés sur le rayon (C 1 ,m" 1)à la deuxième vue, par exemple le centre de la première caméra (0,0,0,1)T et un point sur le plan infini (x" 1 ,y" 1 ,z" 1 ,0)T. Les projections de ces points seront -RT, et R(x" 1 ,y" 1 ,z" 1 ,0)T. Équation de la ligne épipolaire l2, passant par ces deux points est donné sous forme de produit vectoriel :

l 2 =RT×R(x" 1 ,y" 1 ,z" 1) T =R(T×(x" 1 ,y" 1 ,z" 1) T)

Sous forme matricielle, un vecteur n'est pas un produit T×(x" 1 ,y" 1 ,z" 1) T peut s'écrire en utilisant la matrice S :

Alors la contrainte épipolaire sur les points du plan idéal s’écrit :

L'expression de la matrice essentielle en termes de paramètres d'étalonnage externes des deux caméras est utilisée pour calculer les positions relatives des caméras.

Propriétés géométriques de trois images ou plus

Laisser C1,C2 Et C3- les centres de trois vues d'une même scène tridimensionnelle. Dans ce cas, des contraintes épipolaires sont imposées sur les points correspondants de n'importe quelle paire d'espèces. Si les projections de deux points sont connues m1 Et m2 aux première et deuxième vues, alors la position de la projection sur la troisième image peut être trouvée comme l'intersection de deux vues épipolaires correspondant aux points m1 Et m2.

Selon deux projections connues m1 Et m2 A l'aide de deux images avec un calibrage connu, la position du point M dans l'espace peut être déterminée. Ainsi, si le calibrage de la troisième image est connu, alors la projection du point M sur la troisième vue peut être déterminée par une simple projection.

Les contraintes imposées sur la position des points correspondants dans plus de deux images peuvent également être écrites en forme linéaire. Pour trois types, ces restrictions sont écrites sous la forme d'un tenseur trifocal, pour quatre types - sous la forme d'un tenseur quadrifocal. Cependant, calculer ces contraintes équivaut à calculer la jauge des trois ou quatre vues dans l'espace projectif. Ces types de restrictions ne sont pas utilisés dans ce travail et ne sont donc pas abordés plus en détail.

Œuvres des années. Volochine Maximilien. VALEUR D'UN POÈTE. 1. Editez le poème comme le texte d'une dépêche outre-mer : Sécheresse, clarté, pression - chaque mot est en alerte.

Pour tailler lettre par lettre sur une pierre dure et exiguë : Que mots avec parcimonie, plus leur force est intense. La charge volontaire de la pensée est égale aux strophes silencieuses.

Effacez les mots « Beauté », « Inspiration » du dictionnaire - le vil jargon des rimeurs Le poète comprend : Vérité, dessein, plan, équivalence, concision et exactitude. Dans un métier sobre et ardu est l'inspiration et l'honneur d'un poète : Dans la matière sourde-muette, aiguiser la vigilance transcendantale. Volochine M.A. Bibliothèque : Bibliothèque scientifique universelle régionale d'Orel bibliothèque publique eux. I.A. Bounine. - M., ; Œuvres sélectionnées : En 2 volumes.

M., ; Fumée rouge : histoires. - M., ; Gladyshev de la compagnie de reconnaissance : Histoires. - M., ; Échelon; Inévitabilité : romans. Il a fait de nombreuses traductions de poètes maris et oudmourtes. De temps en temps, je m'essayais aussi à la prose. Op. Maximilian Alexandrovich Voloshin () - l'un des les plus grands poètes premier tiers du 20e siècle. C'est un artiste talentueux, un parolier aux multiples facettes, passé le chemin des poèmes symbolistes et ésotériques à la poésie civique-journalistique et scientifique-philosophique, en passant par les prédilections anthroposophiques - jusqu'à « l'idéal de la Cité de Dieu ».

La publication proposée permet au lecteur de se familiariser non seulement avec les meilleurs œuvres poétiques Voloshin, mais aussi - avec son plus œuvres intéressantes en esthétique, prose mémorielle, journalisme et lettres liées aux événements dramatiques de la vie des pays. Auteur. Volochine Maximilien. Tous les poèmes de l'auteur. Travail. La valeur du poète. 2. Étoiles. Créez des recueils préférés d'auteurs et de poèmes !

Discutez avec des personnes partageant les mêmes idées ! Rédigez des critiques, participez à des duels et des concours de poésie ! Rejoignez les meilleurs ! Merci d'avoir rejoint Poembook ! Une lettre avec les données d'accès au compte a été envoyée à votre e-mail !

Vous devez vous connecter dans les 24 heures. Sinon, le compte sera supprimé ! Les utilisateurs enregistrés bénéficient de nombreux avantages : Publiez de la poésie - réalisez votre talent ! Créez des recueils préférés d'auteurs et de poèmes ! Discutez avec des personnes partageant les mêmes idées ! Rédigez des critiques, participez à des duels et des concours de poésie ! Maximilien Volochine. Description. Maximilien Alexandrovitch Volochine est l'un des plus grands poètes du premier tiers du XXe siècle.

C'est un artiste talentueux, un parolier aux multiples facettes, qui a parcouru le chemin des poèmes symbolistes et ésotériques à la poésie civique-journalistique et scientifique-philosophique, en passant par les prédilections anthroposophiques - jusqu'à « l'idéal de la Cité de Dieu ». La publication proposée donne au lecteur l’occasion de se familiariser non seulement avec les meilleures œuvres poétiques de Volochine, mais également avec ses œuvres les plus intéressantes sur l’esthétique, la prose des mémoires, le journalisme et les lettres liées au théâtre.

Œuvres et lettres choisies. M. A. Volochine. Prix. frotter. Maximilien Alexandrovitch Volochine est l'un des plus grands poètes du premier tiers du XXe siècle. C'est un artiste talentueux, un parolier aux multiples facettes, qui a parcouru le chemin des poèmes symbolistes et ésotériques à la poésie civique-journalistique et scientifique-philosophique, en passant par les prédilections anthroposophiques - jusqu'à « l'idéal de la Cité de Dieu ».

Voloshin M.A., La valeur du poète : œuvres et lettres choisies. série: Nouvelle bibliothèque Classiques russes : exemplaire obligatoire Défilé, ville, page, Description du livre. Maximilian Alexandrovich Voloshin () est l'un des plus grands poètes du premier tiers du XXe siècle. C'est un artiste talentueux, un parolier aux multiples facettes, qui a parcouru le chemin des poèmes symbolistes et ésotériques à la poésie civique-journalistique et scientifique-philosophique, en passant par les prédilections anthroposophiques - jusqu'à « l'idéal de la Cité de Dieu ».

Catégories Navigation des articles

Actuellement, les dispositifs d'affichage les plus courants sont ceux qui synthétisent des images sur un avion - un écran d'affichage ou du papier. Les appareils créant des images véritablement tridimensionnelles sont encore assez rares. Mais des informations sur de tels développements apparaissent de plus en plus, par exemple sur les écrans volumétriques ou même sur les imprimantes tridimensionnelles.

Lors de l'utilisation de périphériques graphiques, des projections sont généralement utilisées. La projection spécifie la façon dont les objets sont affichés sur un périphérique graphique. Nous ne considérerons que les projections sur le plan.

Coordonnées du monde et de l'écran

Lors de l'affichage d'objets spatiaux sur un écran ou sur une feuille de papier à l'aide d'une imprimante, vous devez connaître les coordonnées des objets. Nous considérerons deux systèmes de coordonnées. D'abord - coordonnées mondiales, qui décrivent la véritable position des objets dans l'espace avec une précision donnée. L'autre est le système de coordonnées du dispositif d'image, dans lequel les images d'objets sont affichées dans une projection donnée.

Supposons que les coordonnées du monde soient des coordonnées cartésiennes 3D. L'endroit où doit être situé le centre des coordonnées et quelles seront les unités de mesure le long de chaque axe n'est pas encore très important pour nous. L'important est que pour images, nous connaîtrons quelques valeurs numériques des coordonnées des objets affichés.

Pour obtenir une image dans une projection spécifique, il est nécessaire de calculer les coordonnées de projection. À partir d'eux, vous pouvez obtenir les coordonnées du périphérique graphique - appelons-les coordonnées de l'écran. Pour synthétiser une image sur un plan, un système de coordonnées bidimensionnelles suffit. Cependant, certains algorithmes de rendu utilisent des coordonnées d'écran 3D, comme l'algorithme Z-buffer.

Principaux types de projections

DANS infographie le plus courant parallèle Et central projections (Fig. 2.15).

Pour la projection centrale (également appelée prometteur) les rayons de projection proviennent d'un point unique placé à une distance finie des objets et du plan de projection. Pour projection parallèle les rayons de projection sont parallèles.

Projection axonométrique

La projection axonométrique est un type de projection parallèle. Pour cela, tous les rayons de projection sont situés perpendiculairement au plan de projection (Fig. 2.16).

[Définissons les positions du plan de projection en utilisant deux angles - α et β , Positionnons la caméra de manière à ce que la projection de l'axe z sur le plan de projection X0Y serait une ligne verticale (parallèle à l'axe de l'ampli opérationnel).

Riz. 2.16. Projection axonométrique

Afin de trouver les relations entre les coordonnées (x, y,z) Et (X, Oui, Z) pour tout point de l'espace tridimensionnel, considérons les transformations du système de coordonnées ( X, oui,z) dans le système (X, Oui, Z). Définissons une telle transformation en deux étapes.

1er étape. Rotation d'un système de coordonnées autour d'un axe z par l'angle α. Cette rotation des axes est décrite par la matrice

2ème étape. Rotation du système de coordonnées (x, ou",z") par rapport à l'axe X" par angle β - obtenir les coordonnées (X, Oui, Z). Matrice de rotation

On exprime les transformations de coordonnées par le produit de matrices B*A :

Écrivons-le
transformation des coordonnées de projection sous forme de formules :

Pensez-vous que la même projection sera obtenue si les transformations de coordonnées sont décrites dans les deux mêmes étapes, mais dans un ordre différent - d'abord, en faisant pivoter le système de coordonnées par rapport à l'axe x de coinβ , puis faites pivoter le système de coordonnées par rapport à l'axe z" par angle α ? Et y aura-t-il des lignes verticales dans le système de coordonnées (x, oui, z) dessiné également par des verticales dans le système de coordonnées (X, toi, Z) ? En d'autres termes, est-ce que A*B – B*A ?Transformation de coordonnées inverse projection axonométrique. Pour que les coordonnées de projection (X, Oui, Z) convertir en coordonnées mondiales (x, y,z), vous devez faire la séquence de tours inverse. Tournez d’abord selon l’angle -β, puis faites pivoter selon l’angle - α . Écrivons la transformation inverse sous forme matricielle

Matrices de rotation :

En multipliant les matrices A -1 et B -1, on obtient la matrice de transformation inverse :

Écrivons également la transformation inverse sous forme de formules

Projection en perspective

Nous considérerons d'abord la projection en perspective (Fig. 2.17) lorsque disposition verticale caméras quand une = β= 0. Une telle projection peut être imaginée comme une image sur verre à travers laquelle un observateur situé au-dessus du point regarde (x, y,z) = (0, 0, zk). Ici le plan de projection est parallèle au plan (xOy).

Sur la base de la similitude des triangles, nous notons les proportions suivantes :

En considérant également la coordonnée Z :

Sous forme matricielle, la transformation de coordonnées peut s'écrire comme suit :

Riz. 2.17. Projection en perspective

Veuillez noter qu'ici les coefficients matriciels dépendent de la coordonnée z (au dénominateur des fractions). Cela signifie que la transformation de coordonnées est non linéaire (ou plutôt linéaire fractionnaire), elle appartient à la classe projectif transformations.

Considérons maintenant cas général- pour des angles de caméra arbitraires (UN Et p) la même chose que pour la projection axonométrique parallèle. Laisser (x", y",z 1 ) - coordonnées d'un système de coordonnées pivoté par rapport au système initial (x, y,z) aux angles α et β .

Écrivons les transformations des coordonnées de projection perspective sous la forme :

La séquence de transformation des coordonnées peut être décrite comme suit :

La transformation est généralement non linéaire. Il ne peut pas être décrit par une matrice de coefficients constants pour tous les objets de la scène (bien qu'une forme matricielle puisse être utilisée pour transformer les coordonnées).

Pour une telle projection en perspective, le plan de projection est perpendiculaire au rayon issu du centre (x, y,z)= (0, 0, 0) et incliné d'un angle α , β . Si la caméra s'éloigne du centre de coordonnées, la projection centrale change. Lorsque la caméra est à l'infini, la projection centrale dégénère en projection parallèle.

Indiquons les principales propriétés de la transformation de perspective. Au centre

projections :

□ le rapport longueurs/surfaces n'est pas conservé ;

□ les lignes droites sont représentées comme des lignes droites ;

□ les lignes parallèles sont représentées comme convergeant en un point.

Cette dernière propriété est largement utilisée dans géométrie descriptive pour dessiner à la main sur papier. Illustrons cela à l'aide de l'exemple d'une charpente de maison (Fig. 2.18).

Il existe d'autres projections en perspective qui diffèrent par la position du plan de projection et l'emplacement du point de convergence des rayons de projection. De plus, la projection peut être réalisée non pas sur un plan, mais par exemple sur une surface sphérique ou cylindrique.

Considérons une projection oblique pour laquelle les rayons de projection ne sont pas perpendiculaires au plan de projection. L'idée principale d'une telle projection est que la caméra est élevée à une hauteur h tout en conservant la position verticale du plan de conception (Fig. 2.19).

Riz. 2.18. Lignes parallèles sont représentés dans la projection centrale convergeant en un point

Riz. 2.19. Projection oblique

Vous pouvez obtenir une telle projection de la manière suivante :

1. Faire pivoter autour d'un axe z sous un angle UN.

2. Nous remplaçons z" sur -y", a.u" à z".

3. Déplacez le système de coordonnées vers le haut de la hauteur de la caméra h

4. En avion (x", y", 0) construire une projection en perspective en utilisant la méthode déjà évoquée ci-dessus (le point de fuite des rayons sur l'axe z).

La transformation des coordonnées peut être décrite de cette façon. Déterminez d’abord (x", oui",z).

Et puis une transformation de perspective est effectuée

L'avantage d'une telle projection est qu'elle maintient le parallélisme lignes verticales, ce qui est parfois utile pour représenter des maisons dans des systèmes informatiques architecturaux.

Exemples d'images dans différentes projections. Donnons des exemples d'images d'objets identiques dans différentes projections. Les objets seront des cubes de même taille. La position de la caméra est déterminée par les angles d'inclinaison α = 27°, β = 70°.

Un exemple de projection axonométrique est présenté sur la figure. 2.20.

Riz. 2.20.Projection axonométrique

Examinons maintenant des exemples de projection en perspective. Contrairement à la projection parallèle, l'image en projection perspective dépend fortement de la position du plan de projection et de la distance à la caméra.

Dans les systèmes optiques, le concept est connu distance focale. Plus la distance focale de l'objectif est longue, plus la perception de la perspective est faible (Fig. 2.21" et vice versa, pour les objectifs à focale courte, la perspective est la plus grande (Fig. 2.22). Cet effet Vous l'avez probablement déjà remarqué si vous filmiez avec une caméra vidéo ou une caméra. Dans nos exemples, nous pouvons observer une certaine correspondance entre la distance de la caméra au plan de projection { z k z svp ) et la distance focale de l'objectif. Cette correspondance est cependant conditionnelle ; l’analogie avec les systèmes optiques est incomplète.

Pour les exemples ci-dessous (Fig. 2.21, 2.22) z svp = 700. Angles d'inclinaison de la caméra α = 27°, β = 70°.

Riz. 2.21.Projection en perspective pour une caméra à longue focale( z K = 2000)

Riz. 2.22.Projection en perspective pour une caméra à courte focale( z K = 1200)

Dans le cas d'une caméra à courte focale (z K = 1 200), la perception de la perspective est plus visible pour les cubes les plus proches de la caméra. Les lignes verticales des objets ne sont pas verticales sur la projection (les objets s'effondrent").

Regardons des exemples projection oblique(Fig. 2.23, 2.24). Pour elle, les lignes verticales des objets maintiennent une position verticale sur la projection. La position de la caméra (le point de convergence des rayons de projection) est décrite angle de rotation α = 27° et hauteur de levage h = 500. Le plan de projection est parallèle au plan (x"Oh") et est situé à une distance z svp = 700.

Riz.2.23. Projection en perspective oblique pour une caméra à longue focale( z K = 2000)

Riz. 2.24.Projection en perspective oblique pour une caméra à courte focale( z K = 1200)

Regardons un autre exemple d'image de projection centrale - une balise dans le style du film Star Wars :

Affichage en vitrine

Comme nous l'avons déjà évoqué ci-dessus, le mappage sur le plan de projection correspond à une certaine transformation de coordonnées. Cette transformation de coordonnées est différente selon les types de projection, mais, d'une manière ou d'une autre, une transition est effectuée vers un nouveau système de coordonnées - les coordonnées de projection. Les coordonnées de projection peuvent être utilisées pour générer une image à l'aide d'un dispositif de sortie graphique. Cependant, cela peut nécessiter des transformations supplémentaires car le système de coordonnées dans le plan de projection peut ne pas coïncider avec le système de coordonnées du dispositif d'affichage. Par exemple, les objets mesurés en kilomètres doivent être affichés, mais dans un affichage raster, l'unité de mesure est le pixel. Comment exprimer les kilomètres en pixels ?

De plus, vous avez probablement vu que sur un écran d'ordinateur, vous pouvez afficher des images agrandies et réduites d'objets, ainsi que les déplacer. Comment cela se fait-il ?

Introduisons quelques notations. Laisser (Lui, Ue,Ze) sont les coordonnées d'écran des objets dans le dispositif d'affichage graphique. Notez que nous ne devons pas prendre le mot « écran » comme si nous parlions uniquement d'écrans : tout ce qui suit peut être appliqué à tout autre appareil utilisant le système de coordonnées cartésiennes. Nous désignons ici les coordonnées de projection par (X, Y, Z).

Appelons fenêtre zone de sortie rectangulaire avec coordonnées d'écran

XeuhminUetp) - (Hetah Uetah) - Habituellement, vous devez afficher DANS UNE Fenêtre OU TOUT

scène, ou une partie distincte de celle-ci (Fig. 2.25).

Riz. 2.25. Affichage de projection de scène

a - limites de la scène en coordonnées de projection ;b - une partie de la scène est dans la fenêtre, c - la scène entière s'inscrit dans la fenêtre en gardant les proportions

La conversion des coordonnées de projection en coordonnées d'écran peut être spécifiée comme étirement/rétrécissement et cisaillement :

X E = KX +dx, ; Oui E = KY+ mourir; Ze =KZ.

Cette transformation préserve les proportions des objets grâce au même rapport étirement/rétrécissement (À) pour toutes les coordonnées. Notez que pour une cartographie plate, vous pouvez ignorer la coordonnée Z. Voyons comment calculer. À,dxEtmourir. Par exemple, il est nécessaire de faire rentrer l’image entière de la scène dans une fenêtre de dimensions données. La condition d’ajustement peut être définie comme suit :

Si on ajoute (1) à (3), on obtient :

Des inégalités (2) et (4) il résulte :

La solution du système (1)-(4) pour K sera : À min (Kx, Ku) = K min .

Si la valeur À X ou le sens K Oui est égal à l'infini, alors il doit être écarté. Si les deux - alors la valeur À min peut être réglé égal à un. Dga| Pour que l'image dans la fenêtre ait la plus grande taille, on sélectionne À= À min Maintenant vous pouvez trouver dx. De l'inégalité (1) :

De l'inégalité (3) : I

Parce que dx1 < dx2, alors la valeur dx peut être sélectionné à partir de l'intervalle I dx1 dx dx2. Choisissons un emplacement central dans la fenêtre : I

On peut de même trouver dy :

Avec de telles valeurs dxEtmourir le centre de la scène sera au centre de la fenêtre.

Dans d'autres cas, lorsqu'il est nécessaire d'afficher seulement une partie de la scène dans la fenêtre avec l'échelle appropriée, vous pouvez directement définir les valeurs d'échelle numérique. (À) et décaler les coordonnées (dx, mourir). À conception d'interfaces système graphique il est conseillé de limiter le choix À,dx, mourir plage de valeurs acceptables.

Les systèmes graphiques utilisent diverses méthodes pour spécifier la disposition d'affichage et définir les limites de la scène à afficher dans la fenêtre de visualisation. Par exemple, les curseurs de défilement sont souvent utilisés pour le déplacement. Pointez également le curseur vers le sud sur un point de la scène, et ce point deviendra alors le point central de la fenêtre. Ou vous pouvez tracer un rectangle, mettant en évidence les limites d'un fragment de la scène - ce fragment sera alors inscrit dans. la fenêtre. Et ainsi de suite. Toutes ces méthodes d'affichage sont basées sur l'étirement et la compression (mise à l'échelle), ainsi que sur le décalage, et sont décrites par une transformation de coordonnées affine.

À un moment donné, tout développeur dans le domaine de l'infographie se pose une question : comment fonctionnent ces matrices prometteuses ? Parfois, la réponse est très difficile à trouver et, comme cela arrive généralement, la majorité des développeurs abandonnent à mi-chemin.

Ce n'est pas une solution au problème ! Trouvons-le ensemble !

Soyons réalistes avec un parti pris pratique et prenons comme sujet de test Versions OpenGL 3.3. À partir de cette version, chaque développeur doit implémenter le module de manière indépendante opérations matricielles. Super, c'est ce dont nous avons besoin. Décomposons notre tâche difficile et soulignons les points principaux. Quelques faits tirés de la spécification OpenGL :

  • Les matrices sont stockées en colonnes (colonne majeure) ;
  • Coordonnées homogènes ;
  • Volume de découpage canonique (CVV) dans un système de coordonnées gaucher.
Il existe deux manières de stocker des matrices : colonne majeure et ligne majeure. Lors de conférences sur algèbre linéaire le schéma de ligne principale est utilisé. Par en gros La représentation des matrices en mémoire n'a pas d'importance, car une matrice peut toujours être convertie d'une représentation à une autre par simple transposition. Et comme il n'y a pas de différence, nous utiliserons pour tous les calculs ultérieurs des matrices classiques de lignes principales. Lors de la programmation d'OpenGL, il existe une petite astuce qui permet d'éviter de transposer des matrices tout en conservant les calculs classiques de lignes principales. La matrice doit être transférée telle quelle au programme shader, et dans le shader, la multiplication ne doit pas être effectuée entre un vecteur et une matrice, mais entre une matrice et un vecteur.

Les coordonnées homogènes ne constituent pas un système très délicat avec un certain nombre de règles simples sur la conversion de coordonnées cartésiennes conventionnelles en coordonnées homogènes et retour. Une coordonnée homogène est une matrice de lignes de dimension . Pour convertir une coordonnée cartésienne en coordonnée homogène, il faut x, oui Et z multiplier par n'importe quel nombre réel w(sauf 0). Ensuite, vous devez écrire le résultat dans les trois premiers composants, et le dernier composant sera égal au multiplicateur w. Autrement dit:
- Coordonnées cartésiennes
w– nombre réel différent de 0

- coordonnées homogènes

Un petit truc : si w est égal à un, alors tout ce qui est nécessaire pour la traduction est de transférer les composants x, oui Et z et attribuez-en un au dernier composant. Autrement dit, obtenez une matrice de lignes :

Quelques mots sur la qualité zéro w. Du point de vue des coordonnées homogènes, cela est tout à fait acceptable. Les coordonnées homogènes permettent de distinguer les points et les vecteurs. Dans un système de coordonnées cartésiennes, une telle division est impossible.

- point où ( x, y, z) – Coordonnées cartésiennes

- vecteur, où ( x, y, z) – rayon vecteur

La translation inverse d'un sommet de coordonnées homogènes en coordonnées cartésiennes s'effectue comme suit. Tous les composants d'une matrice de lignes doivent être divisés par le dernier composant. Autrement dit:

- coordonnées homogènes
- Coordonnées cartésiennes

La principale chose que vous devez savoir est que tous les algorithmes de découpage et de rastérisation OpenGL fonctionnent en coordonnées cartésiennes, mais avant cela, toutes les transformations sont effectuées en coordonnées homogènes. Le passage des coordonnées homogènes aux coordonnées cartésiennes s'effectue matériellement.

Le volume de découpage canonique (CVV) est l'une des parties les moins documentées d'OpenGL. Comme on peut le voir sur la Fig. 1 CVV est un cube aligné sur un axe centré à l'origine et dont la longueur d'arête est égale à deux. Tout ce qui relève de la zone CVV est soumis à la rastérisation, tout ce qui se trouve en dehors de la zone CVV est ignoré. Tout ce qui échappe partiellement au CVV est soumis à des algorithmes d’élagage. La chose la plus importante que vous devez savoir est que le système de coordonnées CVV est gaucher !


Riz. 1. Volume de découpage canonique OpenGL (CVV)

Système de coordonnées gaucher ? Comment est-ce possible, puisque la spécification d'OpenGL 1.0 indique clairement que le système de coordonnées utilisé est droitier ? Voyons cela.


Riz. 2. Systèmes de coordonnées

Comme on peut le voir sur la Fig. Les 2 systèmes de coordonnées diffèrent uniquement dans la direction de l'axe Z. OpenGL 1.0 utilise un système de coordonnées utilisateur droitier. Mais le système de coordonnées CVV et le système de coordonnées utilisateur sont deux choses complètement différentes. De plus, depuis la version 3.3, il n'existe plus système standard Coordonnées OpenGL. Comme mentionné précédemment, le programmeur lui-même implémente le module d'opérations matricielles. Formation de matrices de rotation, formation de matrices de projection, recherche d'une matrice inverse, multiplication matricielle sont ensemble minimum opérations incluses dans le module d’opérations matricielles. Deux questions logiques se posent. Si le volume de visibilité est un cube dont la longueur des bords est égale à deux, alors pourquoi une scène de plusieurs milliers d'unités est-elle visible à l'écran ? À quel moment le système de coordonnées utilisateur est-il converti en système de coordonnées CVV ? Les matrices de projection sont précisément l’entité qui traite ces questions.

L'idée principale de ce qui précède est que le développeur lui-même est libre de choisir le type de système de coordonnées utilisateur et doit décrire correctement les matrices de projection. Ceci complète les faits sur OpenGL et il est temps de tout mettre en place.

L'une des matrices les plus courantes et les plus difficiles à comprendre est la matrice de transformation de perspective. Alors, quel est le rapport avec CVV et le système de coordonnées utilisateur ? Pourquoi les objets deviennent-ils plus petits à mesure qu’ils s’éloignent de l’observateur ? Pour comprendre pourquoi les objets deviennent plus petits à mesure que la distance augmente, regardons les transformations matricielles modèle tridimensionnel pas à pas. Ce n'est un secret pour personne que tout modèle tridimensionnel consiste en une liste finie de sommets qui subissent des transformations matricielles de manière totalement indépendante les uns des autres. Afin de déterminer la coordonnée d'un sommet tridimensionnel sur un écran de moniteur bidimensionnel, vous devez :

  1. Convertir la coordonnée cartésienne en coordonnée homogène ;
  2. Multipliez la coordonnée homogène par la matrice du modèle ;
  3. Le résultat est multiplié par la matrice de vue ;
  4. Multipliez le résultat par la matrice de projection ;
  5. Convertissez le résultat des coordonnées homogènes en coordonnées cartésiennes.
La conversion de coordonnées cartésiennes en coordonnées homogènes a été discutée précédemment. Signification géométrique La matrice du modèle consiste à transférer le modèle d'un système de coordonnées local vers un système de coordonnées global. Ou, comme on dit, déplacez les sommets hors de l'espace modèle vers l'espace monde. Disons-le simplement, un objet tridimensionnel chargé à partir d'un fichier est situé dans l'espace modèle, où les coordonnées sont mesurées par rapport à l'objet lui-même. Ensuite, à l'aide de la matrice du modèle, le modèle est positionné, mis à l'échelle et pivoté. En conséquence, tous les sommets du modèle 3D reçoivent des coordonnées homogènes réelles dans la scène 3D. L'espace modèle par rapport à l'espace mondial est local. Depuis l'espace modèle, les coordonnées sont transférées vers l'espace mondial (du local au global). A cet effet, une matrice modèle est utilisée.

Passons maintenant à la troisième étape. C’est là que l’espace de visualisation entre en jeu. Dans cet espace, les coordonnées sont mesurées par rapport à la position et à l'orientation de l'observateur comme s'il était le centre du monde. L'espace de visualisation est local par rapport à l'espace mondial, les coordonnées doivent donc y être saisies (et non supprimées, comme dans le cas précédent). Direct transformation matricielle supprime les coordonnées d'un certain espace. Pour les y introduire, au contraire, il faut inverser la transformation matricielle, donc la transformation de type est décrite par la matrice inverse. Comment obtenir ça matrice inverse? Tout d’abord, obtenons la matrice de l’observateur direct. Qu'est-ce qui caractérise un observateur ? L'observateur est décrit par la coordonnée dans laquelle il se trouve et les vecteurs de direction de visualisation. L'observateur regarde toujours dans la direction de son axe local Z. L'observateur peut se déplacer dans la scène et faire des virages. À bien des égards, cela ressemble à la signification de la matrice du modèle. En gros, c’est comme ça. Cependant, pour un observateur, l'opération de mise à l'échelle n'a donc aucun sens entre la matrice modèle de l'observateur et la matrice modèle objet tridimensionnel Vous ne pouvez pas mettre de signe égal. La matrice modèle de l'observateur est la matrice directe souhaitée. En inversant cette matrice, on obtient la matrice de vue. En pratique, cela signifie que tous les sommets en coordonnées homogènes globales recevront de nouvelles coordonnées homogènes par rapport à l'observateur. En conséquence, si l'observateur voyait un certain sommet, alors la valeur de la coordonnée homogène z d'un sommet donné dans l'espace de vue, il y aura certainement nombre positif. Si le sommet était derrière l'observateur, alors la valeur de sa coordonnée homogène z dans l'espace de vue sera certainement un nombre négatif.

La quatrième étape est la plus étape intéressante. Les étapes précédentes ont été discutées de manière si détaillée intentionnellement afin que le lecteur ait image complète sur tous les opérandes de la quatrième étape. Lors de la quatrième étape, les coordonnées homogènes sont transférées de l'espace de visualisation vers l'espace CVV. Encore une fois, il est souligné que tous les sommets potentiellement visibles auront une valeur positive de la coordonnée homogène z.

Considérons une matrice de la forme :

Et pointez vers espace homogène observateur:

Multiplions la coordonnée homogène par la matrice en question :

Convertissons les coordonnées homogènes résultantes en coordonnées cartésiennes :

Disons qu'il y a deux points dans l'espace de visualisation avec les mêmes coordonnées x Et oui, mais avec des coordonnées différentes z. Autrement dit, l’un des points est derrière l’autre. En raison de la distorsion de la perspective, l'observateur doit voir les deux points. En effet, il ressort clairement de la formule qu'en raison de la division par la coordonnée z, la compression se produit jusqu'au point d'origine. Comment plus de valeur z(plus le point est éloigné de l'observateur), plus la compression est forte. C'est l'explication de l'effet de perspective.

La spécification OpenGL indique que les opérations de découpage et de rastérisation sont effectuées en coordonnées cartésiennes et que le processus de conversion de coordonnées homogènes en coordonnées cartésiennes est effectué automatiquement.

La matrice (1) est un modèle pour une matrice de projection en perspective. Comme mentionné précédemment, la tâche de la matrice de projection consiste en deux points : définir un système de coordonnées utilisateur (gaucher ou droitier), transférer le volume de visibilité de l'observateur vers CVV. Dérivons une matrice de perspective pour un système de coordonnées utilisateur gaucher.

La matrice de projection peut être décrite à l'aide de quatre paramètres (Fig. 3) :

  • Angle de vision en radians ( fovy);
  • Rapport hauteur/largeur ( aspect);
  • Distance au plan de détourage le plus proche ( n);
  • Distance au plan de détourage éloigné ( f).


Riz. 3. Volume de visibilité en perspective

Considérons la projection d'un point dans l'espace de l'observateur sur le bord avant de la coupure du volume perspective de visibilité. Pour plus de clarté, sur la Fig. 4 montre une vue latérale. Il convient également de tenir compte du fait que le système de coordonnées utilisateur coïncide avec le système de coordonnées CVV, c'est-à-dire que le système de coordonnées gaucher est utilisé partout.


Riz. 4. Projection point arbitraire

Basé sur les propriétés triangles similaires les égalités suivantes sont valables :

Exprimons yꞌ et xꞌ :

En principe, les expressions (2) suffisent pour obtenir les coordonnées des points de projection. Cependant, pour filtrer correctement des objets tridimensionnels, vous devez connaître la profondeur de chaque fragment. Autrement dit, il faut stocker la valeur du composant z. C'est la valeur utilisée pour les tests de profondeur OpenGL. Sur la fig. 3 il est clair que la valeur zꞌ ne convient pas comme profondeur de fragment, car toutes les projections ponctuelles peuvent même valeur zꞌ. La sortie de cette situation consiste à utiliser ce qu'on appelle la pseudo-profondeur.

Propriétés de pseudo-profondeur :

  1. La pseudo-profondeur est calculée en fonction de la valeur z;
  2. Plus le point est proche de l'observateur, moins la pseudo-profondeur a de valeur ;
  3. Tous les points situés sur le plan avant du volume de visibilité ont une valeur de pseudo-profondeur de -1 ;
  4. Tous les points situés sur le plan de coupe éloigné du volume de visibilité ont une valeur de pseudo-profondeur de 1 ;
  5. Tous les fragments situés à l'intérieur du volume de visibilité ont une valeur de pseudo-profondeur comprise dans la plage [-1 1].
Dérivons la formule par laquelle la pseudo-profondeur sera calculée. Prenons comme base l'expression suivante :

Chances un Et b doit être calculé. Pour ce faire, on utilise les propriétés des pseudo-profondeurs 3 et 4. On obtient un système de deux équations à deux inconnues :

Additionnons les deux parties du système et multiplions le résultat par le produit fn, alors que f Et n ne peut pas être égal à zéro. On obtient :

Ouvrons les parenthèses et réorganisons les termes pour que seule la partie avec UN, et à droite seulement avec b:

Remplaçons (6) par (5). Convertissons l'expression en une fraction simple :

Multipliez les deux côtés par -2fn, alors que f Et n ne peut pas être égal à zéro. Présentons-en des similaires, réorganisons les termes et exprimons b:

Remplaçons (7) par (6) et exprimons un:

En conséquence, les composants un Et b sont égaux :

Remplaçons maintenant les coefficients obtenus dans la matrice de la pièce (1) et voyons ce qui arrive aux coordonnées z pour un point arbitraire dans l'espace homogène de l'observateur. La substitution s'effectue comme suit :

Laissez la distance au plan de coupe avant n est égale à 2, et la distance au plan de détourage éloigné f est égal à 10. Considérons cinq points dans l’espace homogène de l’observateur :

Position mutuelle points et volume de visibilité
Point Signification Description
1 1 Le point est situé devant le plan de détourage avant du volume de visibilité. Ne passe pas la rastérisation.
2 2 Le point est situé sur le bord avant de la limite du volume de visibilité. En cours de rastérisation.
3 5 Le point est situé entre le bord de détourage avant et le bord de détourage éloigné du volume de visibilité. En cours de rastérisation.
4 10 Le point est situé à l’extrémité de la limite du volume de visibilité. En cours de rastérisation.
5 20 Le point est situé au-delà du bord éloigné de la limite du volume de visibilité. Ne passe pas la rastérisation.

Multiplions tous les points par la matrice (8), puis convertissons les coordonnées homogènes résultantes en Coordonnées cartésiennes . Pour ce faire, nous devons calculer les valeurs de nouvelles composantes homogènes Et .
Point 1 :

Notez que la coordonnée homogène parfaitement positionné dans CVV, et surtout, le test de profondeur OpenGL est désormais possible, car la pseudo-profondeur satisfait pleinement aux exigences du test.

Avec coordonnées z Nous l'avons compris, passons aux coordonnées x Et oui. Comme indiqué précédemment, tous volume prometteur la visibilité doit s'inscrire dans le CVV. La longueur du bord CVV est de deux. En conséquence, la hauteur et la largeur du volume de visibilité en perspective doivent être compressées à deux unités conventionnelles.

Nous avons à notre disposition un coin fovy et l'ampleur aspect. Exprimons la hauteur et la largeur en utilisant ces valeurs.


Riz. 5. Volume de visibilité

De la fig. 5, il est clair que :

Nous pouvons maintenant obtenir la vue finale de la matrice de projection en perspective pour un système de coordonnées gaucher personnalisé fonctionnant avec CVV OpenGL :

Ceci termine la dérivation des matrices.

Quelques mots sur DirectX – le principal concurrent d'OpenGL. DirectX ne diffère d'OpenGL que par les dimensions du CVV et son positionnement. Dans DirectX, CVV est cuboïde avec longueurs axiales x Et ouiégal à deux, et le long de l'axe z la longueur est égale à un. Gamme x Et oui est [-1 1], et la plage zégal à . Quant au système de coordonnées CVV, DirectX, comme OpenGL, utilise un système de coordonnées gaucher.

Pour afficher les matrices de perspective pour un système de coordonnées droitier personnalisé, vous devez redessiner la Fig. 2, Fig. 3 et Fig. 4 en tenant compte de la nouvelle direction de l'axe Z. Les autres calculs sont complètement similaires, au signe près. Pour les matrices DirectX, les propriétés de pseudo-profondeur 3 et 4 sont modifiées pour s'adapter à la plage.

À ce stade, le sujet des matrices prometteuses peut être considéré comme clos.

Aujourd'hui, nous examinerons de plus près le dispositif de caméra virtuelle. Commençons par la photo.

Sur la figure, nous voyons l'espace de coordonnées de la caméra. La direction (« regard ») de la caméra coïncide toujours avec la direction positive de l'axe z, et la caméra elle-même est située à l'origine.

L'espace interne de la pyramide illustré sur la figure est la partie du monde virtuel que l'utilisateur verra.

Remarquez les trois avions. Le premier est situé à une distance de 1 le long de l’axe z. C'est l'avion le plus proche. Le joueur ne verra jamais ce qui se trouve devant lui. DANS dans ce cas la valeur de z est égale à un, mais d'une manière générale, cela peut être n'importe quoi. Un défaut d'affichage graphique est associé au plan proche. Ce défaut se manifeste principalement chez les tireurs (en raison de grande liberté caméras). Lorsque vous vous approchez trop près d’un objet, vous pouvez vous retrouver « à l’intérieur ». Depuis derniers jeux Ce défaut était particulièrement prononcé dans Left 4 Dead : lorsqu'une foule de zombies s'abattait sur le joueur, il était très souvent possible de regarder à l'intérieur d'autres personnages.

Le plan situé à une distance de 100 unités le long de l’axe z est appelé plan lointain. Là encore, la valeur peut être arbitraire. L'utilisateur ne verra jamais d'objets situés au-delà de ce plan.

Les six plans qui limitent l'espace que l'utilisateur verra sont appelés plans de détourage : gauche, droite, supérieur, inférieur, proche et lointain.

Le plan situé entre le proche et le lointain est la projection. Dans ce qui suit, nous placerons ce plan à z=1, c'est-à-dire il coïncidera avec le plus proche. Ici, j'ai séparé les plans de proximité et de projection pour montrer qu'ils ne sont pas la même chose. Le plan de projection concerne la dernière transformation de coordonnées : la transformation de espace tridimensionnel caméras - dans un espace bidimensionnel.

C'est grâce au plan de projection que l'utilisateur verra monde virtuel. En fait, c'est cet avion que l'utilisateur verra. Le plan de projection est directement lié à des concepts tels que les tampons de premier plan/arrière-plan, la fenêtre du programme et l'écran utilisateur. Tous ces concepts peuvent être considérés comme une image rectangulaire, représentée dans la mémoire de l'ordinateur par un tableau de nombres.

La conversion des coordonnées du monde tridimensionnel vers le plan de projection est la plus difficile de celles-ci. à l'heure actuelle ont été étudiés par nos soins.

Champ de vision/zone de vision

Dans la figure ci-dessus, le plan de projection (et donc l'image que verra l'utilisateur) a une largeur plus de hauteur. La largeur et la hauteur du plan de projection sont spécifiées à l'aide d'angles. Rencontrer différents noms ces angles : champ de vision ou zone de visualisation. En anglais - champs de vision.

Les zones de visualisation sont spécifiées par deux angles. Appelons-les : fovx - zone de visualisation horizontale, fovy - zone de visualisation verticale. Détails sur les zones de visualisation : ci-dessous.

Z-buffer / w-buffer / tampon de profondeur (z-buffer / w-buffer / tampon de profondeur)

Regardons l'image, qui montre deux triangles : à une distance de 25 et 50 unités de la caméra. La figure (a) montre l'emplacement des triangles dans l'espace (vue de dessus) et la figure (b) montre l'image finale :

Comme vous pouvez le deviner, l'image doit être dessinée en commençant par les éléments les plus éloignés et en terminant par les plus proches. La solution évidente consiste à calculer la distance entre l'origine (depuis la caméra) et chaque objet, puis à comparer. L'infographie utilise un mécanisme légèrement plus avancé. Ce mécanisme porte plusieurs noms : z-buffer, w-buffer, depth buffer. La taille du tampon z en termes de nombre d'éléments est la même que la taille des tampons d'arrière-plan et principaux. La composante z de l'objet le plus proche de la caméra est entrée dans le tampon z. Dans cet exemple, où le triangle bleu chevauche le triangle vert, les coordonnées z du bleu seront entrées dans le tampon de profondeur. Nous parlerons plus en détail des tampons z dans une leçon séparée.

Projection orthographique/parallèle

L'opération dans laquelle la dimension de l'espace diminue (il y avait un espace tridimensionnel, il est devenu bidimensionnel) est appelée projection. Tout d'abord, nous nous intéressons à la projection en perspective, mais nous ferons d'abord connaissance avec la projection parallèle (projection parallèle ou orthographique).

Pour calculer une projection parallèle, il suffit de supprimer les coordonnées supplémentaires. Si nous avons un point dans l'espace [ 3 3 3 ], alors avec une projection parallèle sur le plan z=1, il sera projeté dans le point .

Projection en perspective sur un plan de projection

Dans ce type de projection, toutes les lignes convergent en un point. C’est exactement ainsi que fonctionne notre vision. Et c'est à l'aide de la projection en perspective que le « look » de tous les jeux est modélisé.


Comparez cette image avec l’image montrant les coordonnées homogènes de la leçon précédente. Pour passer de l'espace tridimensionnel à l'espace bidimensionnel, vous devez diviser les deux premières composantes des vecteurs par la troisième : [ x/z y/z z/z ] = [ x/z y/z 1 ].

Comme je l'ai écrit ci-dessus, le plan de projection peut être situé n'importe où entre le proche et le lointain. Nous placerons toujours le plan de projection à z=1, mais dans ce didacticiel, nous examinerons d'autres options. Regardons l'image :


Notons la distance au plan de projection depuis l'origine des coordonnées par d. Nous considérerons deux cas : d=1 et d=5. Point important: la troisième composante de tous les vecteurs après projection doit être égale à d - tous les points sont situés dans le même plan z=d. Ceci peut être réalisé en multipliant toutes les composantes du vecteur par d : [ xd/z yd/z zd/z ]. Avec d=1, on obtient : [ x/z y/z 1 ], c'est la formule qui a été utilisée pour transformer des coordonnées homogènes.

Maintenant, si l'on déplace le plan de projection jusqu'au point z=5 (respectivement d=5), on obtient : [ xd/z yd/z zd/z ] = [ 5x/z 5y/z 5 ]. La dernière formule projette tous les vecteurs de l’espace dans un seul plan, où d=5.
Nous avons un petit problème ici. La formule précédente fonctionne avec des vecteurs tridimensionnels. Mais nous avons convenu d'utiliser Vecteurs 4D. Dans ce cas, le quatrième élément peut simplement être écarté. Mais nous ne le ferons pas, car son utilisation offre des capacités spécifiques dont nous parlerons plus tard.

Il faut trouver diviseur commun les troisième et quatrième composantes, une fois divisées par lesquelles la valeur d reste dans la troisième composante, et l'unité dans la quatrième. Ce diviseur est d/z. Maintenant, à partir du vecteur habituel [ x y z 1 ], nous devons préparer un vecteur pour la projection (division) [ x y z z/d ]. Cela se fait à l'aide de la matrice de transformation (vérifiez le résultat en multipliant n'importe quel vecteur par cette matrice) :


La dernière transformation n'est pas encore une projection. Ici, nous réduisons simplement tous les vecteurs à la forme dont nous avons besoin. Je vous rappelle que nous placerons le plan de projection à d=1, ce qui signifie que les vecteurs ressembleront à ceci : [ x y z z ].

Matrice de transformation de perspective

Nous examinerons la matrice de transformation de perspective utilisée dans DirectX :

Nous savons maintenant à quoi est destiné l'élément _34. Nous savons également que les éléments _11 et _22 redimensionnent l'image horizontalement et verticalement. Regardons ce qui se cache exactement derrière les noms xScale et yScale.

Ces variables dépendent des zones de visualisation dont nous avons discuté ci-dessus. En augmentant ou en diminuant ces angles, vous pouvez redimensionner (redimensionner ou zoomer) l'image - modifier la taille et le rapport hauteur/largeur du plan de projection. Le mécanisme de zoom rappelle vaguement le zoom des appareils photo/caméras - le principe est très similaire. Regardons l'image :


Divisons l'angle fov en deux parties et n'en considérons qu'une moitié. Ce que l'on voit ici : en augmentant l'angle fov/2 (et, par conséquent, l'angle fov), on augmente le sin de l'angle et on diminue le cos. Cela conduit à une augmentation du plan de projection et, par conséquent, à une diminution des objets projetés. L'angle idéal pour nous serait fov/2 = P/4. Je vous rappelle qu'un angle en P/4 radians est égal à 45 degrés. Dans ce cas, le fov sera égal à 90 degrés. Pourquoi un angle de 45 degrés est-il bon pour nous ? Dans ce cas, il n’y a pas de mise à l’échelle et cos(P/4)/sin(P/4)=1.

Nous pouvons maintenant facilement redimensionner l'image verticalement (horizontalement) en utilisant le sinus et le cosinus de la moitié de la zone de visualisation (la fonction cotangente en C++ est appelée cot) :

yÉchelle = cos(fovY/2)/sin(fovY/2) = cot(fovY/2)
DirectX utilise uniquement le champ de vision vertical (fovY) et la mise à l'échelle horizontale dépend de zone verticale vue et rapport hauteur/largeur.

Permettez-moi de vous rappeler que la fenêtre de nos programmes a une taille de 500x500. Rapport d'aspect : 1 pour 1. Par conséquent, les variables seront égales : xScale=1, yScale=1.

Rapport d’aspect standard moniteur/TV : 4:3. Ce ratio correspond aux résolutions d'écran : 640x480, 800x600, 1600x1200. Nous ne toucherons pas encore au mode plein écran, mais nous pouvons modifier la taille de la fenêtre du programme. Vous pouvez modifier la taille de la fenêtre (dans les paramètres actuels), par exemple en 640X480. Mais pour éviter que tous les objets ne soient étirés (les carrés ressembleront à des rectangles), n'oubliez pas de modifier les variables correspondantes dans la matrice de projection.

J'allais oublier, forum pour xScale en DirectX :

xScale = yScale / rapport hauteur/largeur
Les proportions sont définies simplement : 1/1, 4/3, 16/9 - ce sont les proportions standard.

Reste à découvrir la fonction des éléments _33, _34 de la matrice de transformation de perspective. zf est la coordonnée z du plan éloigné (de loin - loin) et zn est la coordonnée z du plan proche (de près - proche). Notez que l'élément _43 = _33 * -zn.

Le moyen le plus simple de comprendre exactement ce que font ces formules est d’utiliser des exemples. Multiplions le vecteur standard [ x y z w ] par la matrice présentée ci-dessus. Je vous recommande de le faire en prenant une feuille de papier et un crayon (j'espère que vous vous souvenez comment multiplier deux matrices). Les composantes vectorielles prendront la forme suivante.

1er = x*xÉchelle
2ème = y*yÉchelle
3ème = z*(zf/(zf-zn)) + w*(-(zn*zf)/(zf-zn)) = (zf/(zf-zn))*(z - w*zn)
4ème = (w*z)/j
Effectuons une transformation de projection (nous divisons tous les éléments en 4ème composant et supposons que d=1 et w=1) :

1er = (d*x*xScale)/(w*z) = (x*xScale)/z
2ème = (d*y*yScale)/(w*z) = (y*xScale)/z
3ème = (zf/(zf-zn))*(z - w*zn)*(w*d/z) = (zf/(zf-zn))*(1 - zn/z)
4ème = 1
En conséquence, nous avons reçu un vecteur de la forme :

[ x/(z*xScale) y/(z*yScale) (zf/(zf-zn))*(1-zn/z) 1 ]
Maintenant, si vous spécifiez des valeurs spécifiques pour zf et zn, vous trouverez ce qui suit (pour valeurs positives) : si le vecteur est situé avant le plan proche, alors la composante z après la transformation sera inférieur à zéro, si le vecteur est situé derrière le plan éloigné, alors la composante z sera supérieure à l'unité.

Il n'y a aucune différence entre l'emplacement exact des plans proche et lointain : zn=1, zf=10 ou zn=10 et zf=100 (ou toute autre valeur) - après la transformation, la zone visible sera située dans l'intervalle de zéro à un inclus.

C'est précisément à cela que sont destinées les formules des éléments _33, _34 de la matrice de projection : projeter la distance du plan proche au plan lointain dans le segment. Vérifiez cela en calculant les valeurs de plusieurs vecteurs pour valeurs spécifiques zn,zf (oui, sur un morceau de papier !!!).



Avez-vous aimé l'article? Partagez avec vos amis !