Matrice de projection en perspective. Matrices de perspective dans l'API graphique ou le diable est dans les détails

Dans la dernière leçon, nous avons parlé des projections les plus importantes utilisées en géométrie affine. Passons maintenant à la géométrie de perspective et à plusieurs nouveaux types de projection.

Dans les photographies, les peintures et les écrans, les images nous semblent naturelles et correctes. Ces images sont appelées perspectives. Leurs propriétés sont telles que les objets plus éloignés sont représentés à plus petite échelle, des lignes parallèles cas général ne sont pas parallèles. De ce fait, la géométrie de l'image s'avère assez complexe, et il est difficile de déterminer la taille de certaines parties de l'objet à partir de l'image finale.

La projection en perspective habituelle est une projection centrale sur un plan avec des rayons droits passant par un point, le centre de la projection. L'un des rayons projetés est perpendiculaire au plan de projection et est appelé principal. Le point d'intersection de ce rayon et du plan de projection est le point principal de l'image.

Il existe trois systèmes de coordonnées. En règle générale, un programmeur travaille et stocke des données sur des objets géométriques en coordonnées mondiales. Pour augmenter le réalisme, lors de la préparation de l'affichage d'une image à l'écran, les données sur les objets à partir des coordonnées mondiales sont converties en coordonnées d'affichage. Et seulement au moment où l'image est affichée directement sur l'écran d'affichage, ils se déplacent vers les coordonnées d'écran, qui sont les numéros de pixels de l'écran.

Les deux premiers systèmes peuvent être utilisés dans des systèmes de coordonnées multidimensionnels, mais le second uniquement dans des systèmes bidimensionnels. Les opérations sont irréversibles, c'est-à-dire qu'il est impossible de restituer une image tridimensionnelle à partir d'une image de projection bidimensionnelle.

Matrice de transformation de perspective générale

Dans cette matrice les éléments un, d, e sont responsables de la mise à l'échelle, m, n, L pour le déplacement, p, q, r pour la projection, s pour une mise à l'échelle complète, X pour la rotation.

À 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 dans l'ensemble 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, pour tous les calculs ultérieurs, nous utiliserons des matrices classiques à 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 avec un centre à l'origine et une longueur d'arête é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 de l'espace modèle vers l'espace monde. Disons simplement qu'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 ceci 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 l'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);
  • Ratio d'aspect ( 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 prendre en compte 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. En figue. 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 se trouvant à 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, dans lequel F Et n ne peut pas être égal à zéro. On a:

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, dans lequel 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 :

Arrangement mutuel 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écoupage avant et le bord de découpage é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 des 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.

À projection centrale tous les rayons projetés traversent un certain point de l'espace - le centre de projection. Le dispositif physique qui met en œuvre la projection centrale est l’objectif. En observation visuelle, le rôle du cristallin est joué par l'œil. Dans l'objectif, les rayons reliant les points conjugués dans l'espace des objets et des images passent par le point principal arrière, qui est le centre de la projection (Fig. 1.5.3). De cette propriété fondamentale de la projection centrale découle une méthode mathématique de construction d'une image : les coordonnées de chaque point de l'image peuvent être calculées en déterminant le point d'intersection de la droite passant par le point objet et le centre de projection avec la projection. (image) surface. Si dans le système de coordonnées de l'objet sélectionné, les coordonnées des points et sont connues, ainsi que l'équation de la surface de l'image, alors les coordonnées du point de l'image sont déterminées à la suite de la résolution du système d'équations

Riz. 1.5.3. Schéma général de la projection centrale

La surface de projection peut être considérée comme plate dans la plupart des cas. Cette approximation est également assez précise pour l’œil. Bien que la surface sensible à la lumière de l'œil, la rétine, ait une forme presque sphérique, pour une zone de vision claire limitée par une taille angulaire de plusieurs degrés, elle peut être considérée comme plate.

Conformément aux lois de l'optique, pour obtenir une image nette, il est nécessaire que la surface photosensible soit perpendiculaire à l'axe optique de la lentille et située à une certaine distance du centre de projection, qui est généralement pris égale à la distance focale. En effet, l'image se situe à une distance image du centre de projection, qui est toujours supérieure à la distance focale. Cependant, si l'objet est éloigné de l'objectif, la différence entre une image et distance focale insignifiant. Ainsi, la position du plan image est facilement fixée par rapport au centre de projection et à l'axe optique de l'objectif. Si l'objectif tourne de telle sorte que certains objets tombent dans son champ de vision, alors le plan image doit tourner avec lui.

Si l'on prend en compte les caractéristiques notées de la projection centrale dans les dispositifs de formation d'images réels, alors la connexion entre les coordonnées des points dans l'espace des objets et l'espace des images peut être exprimée sous une forme différente que dans le système d'équations ( 1.5.7). Introduisons un système de coordonnées pour le plan image, un système de coordonnées d'objectif associé et un système de coordonnées d'espace objet (Fig. 1.5.4). La particularité de la projection centrale peut s'exprimer ainsi : les vecteurs reliant le centre de la projection aux points conjugués sont colinéaires. cela implique

où est une constante pour une paire de points donnée et .

Riz. 1.5.4. Schéma des rotations du plan image

Considérant que la caméra de tournage peut être tournée selon des angles et par rapport aux axes, de (1.5.8) on obtient

, (1.5.8)

où sont les coordonnées du centre de conception dans le système ; – coordonnées du centre de conception dans le système.

Si l'on tient compte du fait que la surface de projection est plate, l'origine du système coïncide généralement avec le point principal du plan de l'image, situé à distance de, alors

. (1.5.9)

En éliminant la constante de (1.5.9) en divisant la première et la deuxième droite par la troisième, on obtient des équations reliant les coordonnées des points conjugués dans les systèmes et :

A partir du système (1.5.10) utilisant les coordonnées des points image, vous pouvez déterminer les coordonnées des points conjugués dans l'espace objet si l'équation de la surface observée est donnée . Alors, d’après les coordonnées du point, l’équation de la surface et des conditions d'éclairage connues, des attributs de point (luminosité, couleur) peuvent être déterminés et les attributs de point d'image correspondants peuvent être calculés. La procédure de synthèse d'image brièvement décrite ici est basée sur le suivi d'un rayon émanant de l'espace image dans l'espace objet, c'est-à-dire dans la direction opposée au cours des rayons dans système réel. En infographie, nous appelons cette approche la méthode de lancer de rayons inverse.

Un trait caractéristique de la projection centrale est une différence significative dans l'échelle de l'image des objets situés à différentes distances du centre de projection. Cela est dû à une diminution dimensions angulaires objet (et, par conséquent, avec une diminution des dimensions linéaires dans le plan de l'image) lorsqu'on s'éloigne de la scène de prise de vue. La figure 1.5.5 montre le résultat de la prise de vue d'un objet sous la forme d'une bande sur laquelle est appliqué un motif de rectangles se répétant périodiquement. Changer la largeur de la bande et la taille des rectangles crée une sensation de profondeur dans l'espace. En principe, l'image peut être calculée, par exemple, à l'aide des formules (1.5.12), mais elle peut être construite avec un degré de précision suffisant si l'on précise le point de fuite des rayons. Les calculs utilisant les coordonnées du point de fuite des rayons sont beaucoup plus simples. Par conséquent, cette approche est largement utilisée lors de la simulation d’un environnement visuellement observé dans des simulateurs vidéo.

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é appareils photo). 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. ce moment ont été étudiés par nos soins.

Champ 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. DANS infographie un mécanisme légèrement plus avancé est utilisé. 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).

Calculer 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 ce dessin avec le dessin montrant des 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 tutoriel 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.

Besoin de 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 parlé 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 la 4ème composante 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 moins que 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 !!!).

Œ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 Pour le poète - compréhensions : 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 bibliotheque 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

Avez-vous aimé l'article? Partage avec tes amis!