Programmeren met DirectX9: Objecten roteren. Transformatiematrix voor algemeen perspectief

Vandaag zullen we het apparaat van dichterbij bekijken virtuele camera. Laten we beginnen met de foto.

In de figuur zien we de coördinatenruimte van de camera. De richting ("look") van de camera valt altijd samen met de positieve richting van de z-as, en de camera zelf bevindt zich in de oorsprong.

De interne ruimte van de piramide, weergegeven in de figuur, is dat deel van de virtuele wereld dat de gebruiker zal zien.

Let op de drie vlakken. De eerste bevindt zich op een afstand van 1 langs de z-as. Dit is het nabije vlak. De speler zal nooit zien wat zich ervoor bevindt. IN in dit geval de waarde van z is gelijk aan één, maar over het algemeen kan dit van alles zijn. Eén defect in de grafische weergave houdt verband met het nabije vlak. Dit defect manifesteert zich vooral bij shooters (vanwege de grote vrijheid van de camera). Wanneer je te dicht bij een object komt, kun je ‘binnen’ terechtkomen. Van nieuwste spellen Dit defect was vooral uitgesproken in Left 4 dead: wanneer een menigte zombies op de speler viel, was het heel vaak mogelijk om in andere personages te kijken.

Het vlak dat zich op een afstand van 100 eenheden langs de z-as bevindt, wordt het verre vlak genoemd. Nogmaals, de waarde kan willekeurig zijn. De gebruiker zal nooit objecten zien die zich verder dan dit vlak bevinden.

De zes vlakken die de ruimte beperken die de gebruiker te zien krijgt, worden clipping-vlakken genoemd: links, rechts, boven, onder, dichtbij en ver weg.

Het vlak tussen dichtbij en veraf is projectie. In wat volgt plaatsen we dit vlak op z=1, d.w.z. het zal samenvallen met de dichtstbijzijnde. Hier heb ik de nabije en projectievlakken gescheiden om te laten zien dat ze niet hetzelfde zijn. Het projectievlak is bedoeld voor de uiteindelijke coördinatentransformatie: de transformatie van driedimensionale cameraruimte naar tweedimensionale ruimte.

Het is dankzij het projectievlak dat de gebruiker zal zien virtuele wereld. Eigenlijk is dit vliegtuig wat de gebruiker zal zien. Het projectievlak houdt rechtstreeks verband met concepten als voorgrond-/achtergrondbuffers, programmavenster en gebruikersscherm. Al deze concepten kunnen worden beschouwd als een rechthoekig beeld, dat in het computergeheugen wordt weergegeven door een reeks cijfers.

Het omzetten van coördinaten van de driedimensionale wereld naar het projectievlak is het moeilijkst op dit moment werden door ons bestudeerd.

Gezichtsveld

In de figuur hierboven heeft het projectievlak (en dus het beeld dat de gebruiker te zien krijgt) een breedte die groter is dan de hoogte. De breedte en hoogte van het projectievlak worden gespecificeerd met behulp van hoeken. Ontmoeten verschillende namen deze hoeken: gezichtsveld of kijkgebied. In het Engels - gezichtsvelden.

Kijkgebieden worden gespecificeerd door twee hoeken. Laten we ze noemen: fovx - horizontaal kijkgebied, fovy - verticaal kijkgebied. Details over kijkgebieden: hieronder.

Z-buffer / w-buffer / dieptebuffer (z-buffer / w-buffer / dieptebuffer)

Laten we naar de afbeelding kijken, waarop twee driehoeken te zien zijn: op een afstand van 25 en 50 eenheden van de camera. Figuur (a) toont de locatie van de driehoeken in de ruimte (bovenaanzicht), en figuur (b) toont het uiteindelijke beeld:

Zoals je misschien wel raadt, moet de afbeelding worden getekend, beginnend bij de meest afgelegen elementen en eindigend bij de dichtstbijzijnde. De voor de hand liggende oplossing: Bereken de afstand vanaf de oorsprong (vanaf de camera) tot elk object en vergelijk vervolgens. IN computergraphics er wordt een iets geavanceerder mechanisme gebruikt. Dit mechanisme heeft verschillende namen: z-buffer, w-buffer, dieptebuffer. De grootte van de z-buffer in termen van het aantal elementen is hetzelfde als de grootte van de achtergrond- en hoofdbuffers. De z-component van het object dat zich het dichtst bij de camera bevindt, wordt in de z-buffer ingevoerd. IN in dit voorbeeld, waar de blauwe driehoek de groene overlapt, worden de z-coördinaten van de blauwe in de dieptebuffer ingevoerd. We zullen in een aparte les meer in detail over z-buffers praten.

Orthografische / parallelle projectie

De handeling waarbij de dimensie van de ruimte afneemt (er was een driedimensionale ruimte, deze werd tweedimensionaal) wordt projectie genoemd. Allereerst zijn we geïnteresseerd in perspectiefprojectie, maar eerst zullen we kennis maken met parallelle (parallelle of orthografische projectie).

Om een ​​parallelle projectie te berekenen, volstaat het om de extra coördinaat weg te gooien. Als we een punt in de ruimte hebben [ 3 3 3 ], dan wordt dit met een parallelle projectie op het vlak z=1 in het punt geprojecteerd.

Perspectiefprojectie op een projectievlak

Bij dit type projectie komen alle lijnen samen in één punt. Dit is precies hoe onze visie werkt. En het is met behulp van perspectiefprojectie dat de ‘look’ in alle games wordt gemodelleerd.


Vergelijk dit plaatje met het plaatje met homogene coördinaten uit de vorige les. Om van een driedimensionale ruimte naar een tweedimensionale ruimte te gaan, moet je de eerste twee componenten van de vectoren delen door de derde: [ x/z y/z z/z ] = [ x/z y/z 1 ].

Zoals ik hierboven schreef, kan het projectievlak zich overal tussen dichtbij en veraf bevinden. We plaatsen het projectievlak altijd op z=1, maar in deze tutorial zullen we naar andere opties kijken. Laten we naar de foto kijken:


Laten we de afstand tot het projectievlak vanaf de oorsprong van de coördinaten aangeven als d. We zullen twee gevallen beschouwen: d=1 en d=5. Belangrijk punt: de derde component van alle vectoren na projectie moet gelijk zijn aan d - alle punten bevinden zich in hetzelfde vlak z=d. Dit kan worden bereikt door alle componenten van de vector te vermenigvuldigen met d: [ xd/z yd/z zd/z ]. Met d=1 krijgen we: [ x/z y/z 1 ], dit is de formule die werd gebruikt om homogene coördinaten te transformeren.

Als we nu het projectievlak verplaatsen naar het punt z=5 (respectievelijk d=5), krijgen we: [ xd/z yd/z zd/z ] = [ 5x/z 5y/z 5 ]. De laatste formule projecteert alle ruimtevectoren in één vlak, waarbij d=5.
We hebben hier een klein probleem. De vorige formule werkt met driedimensionale vectoren. Maar we hebben afgesproken om vierdimensionale vectoren te gebruiken. Het vierde onderdeel kan in dit geval eenvoudigweg worden weggegooid. Maar we zullen dit niet doen, omdat het gebruik ervan een aantal specifieke mogelijkheden biedt die we later zullen bespreken.

Je moet de gemeenschappelijke deler van de derde en vierde component vinden, wanneer gedeeld waardoor de waarde d in de derde component blijft, en eenheid in de vierde. Deze deler is d/z. Nu moeten we van de gebruikelijke vector [ x y z 1 ] een vector gereed maken voor projectie (deling) [ x y z z/d ]. Dit wordt gedaan met behulp van de transformatiematrix (controleer het resultaat door een willekeurige vector met deze matrix te vermenigvuldigen):


De laatste transformatie is nog geen projectie. Hier reduceren we eenvoudigweg alle vectoren tot de vorm die we nodig hebben. Laat me je eraan herinneren dat we het projectievlak op d=1 zullen plaatsen, wat betekent dat de vectoren er als volgt uit zullen zien: [ x y z z ].

Matrix veelbelovende transformatie

We zullen kijken naar de perspectieftransformatiematrix die in DirectX wordt gebruikt:

Nu weten we waarvoor element _34 bedoeld is. We weten ook dat de elementen _11 en _22 de afbeelding horizontaal en verticaal schalen. Laten we eens kijken wat er precies verborgen zit achter de namen xScale en yScale.

Deze variabelen zijn afhankelijk van de kijkgebieden die we hierboven hebben besproken. Door deze hoeken te vergroten of te verkleinen, kunt u het beeld schalen (schalen of zoomen) - de grootte en beeldverhouding van het projectievlak wijzigen. Het zoommechanisme doet vaag denken aan zoomcamera's/camera's - het principe is zeer vergelijkbaar. Laten we naar de foto kijken:


Laten we de hoek fov in twee delen verdelen en slechts één helft beschouwen. Wat we hier zien: door de hoek fov/2 te vergroten (en dienovereenkomstig de hoek fov), vergroten we de sin van de hoek en verlagen we cos. Dit leidt tot een toename van het projectievlak en dienovereenkomstig tot een afname van de geprojecteerde objecten. De ideale hoek voor ons zou fov/2 = P/4 zijn. Laat me je eraan herinneren dat een hoek in P/4 radialen gelijk is aan 45 graden. In dit geval is fov gelijk aan 90 graden. Waarom is een hoek van 45 graden goed voor ons? In dit geval is er geen sprake van schaling en is cos(P/4)/sin(P/4)=1.

Nu kunnen we de afbeelding eenvoudig verticaal (horizontaal) schalen met behulp van de sinus en cosinus van de helft van het weergavegebied (de cotangensfunctie in C++ wordt cot genoemd):

ySchaal = cos(fovY/2)/sin(fovY/2) = kinderbed(fovY/2)
DirectX gebruikt alleen het verticale gezichtsveld (fovY), en de horizontale schaling is afhankelijk van het verticale gezichtsveld en de beeldverhouding.

Ik wil u eraan herinneren dat het venster in onze programma's 500x500 groot is. Beeldverhouding: 1 op 1. Daarom zijn de variabelen gelijk: xScale=1, yScale=1.

Standaard monitor/tv-beeldverhouding: 4:3. Deze verhouding komt overeen met schermresoluties: 640x480, 800x600, 1600x1200. We zullen elkaar nog niet aanraken Volledig schermmodus, maar we kunnen de grootte van het programmavenster wijzigen. U kunt de venstergrootte (in de huidige parameters) wijzigen, bijvoorbeeld naar 640X480. Maar om te voorkomen dat alle objecten worden uitgerekt (de vierkanten zien eruit als rechthoeken), vergeet dan niet de overeenkomstige variabelen in de projectiematrix te wijzigen.

Ik was het bijna vergeten, forum voor xScale in DirectX:

xScale = yScale / beeldverhouding
De beeldverhoudingen worden eenvoudig ingesteld: 1/1, 4/3, 16/9 - dit zijn de standaardverhoudingen.

Rest ons nog het doel van de elementen _33, _34 van de perspectieftransformatiematrix te achterhalen. zf is de z-coördinaat van het verre vlak (van ver - ver), en zn is de z-coördinaat van het nabije vlak (van dichtbij - dichtbij). Merk op dat element _43 = _33 * -zn.

De eenvoudigste manier om precies te begrijpen wat deze formules doen, is met voorbeelden. Laten we de standaardvector [ x y z w ] vermenigvuldigen met de hierboven weergegeven matrix. Ik raad je aan dit te doen door een stuk papier en een potlood te nemen (ik hoop dat je onthoudt hoe je twee matrices moet vermenigvuldigen). De vectorcomponenten zullen de volgende vorm aannemen.

1e = x*xSchaal
2e = y*ySchaal
3e = z*(zf/(zf-zn)) + w*(-(zn*zf)/(zf-zn)) = (zf/(zf-zn))*(z - w*zn)
4e = (w*z)/d
Laten we een projectietransformatie uitvoeren (we verdelen alle elementen in de 4e component en nemen aan dat d=1 en w=1):

1e = (d*x*xSchaal)/(w*z) = (x*xSchaal)/z
2e = (d*y*ySchaal)/(w*z) = (y*xSchaal)/z
3e = (zf/(zf-zn))*(z - w*zn)*(w*d/z) = (zf/(zf-zn))*(1 - zn/z)
4e = 1
Als gevolg hiervan ontvingen we een vector van de vorm:

[ x/(z*xSchaal) y/(z*ySchaal) (zf/(zf-zn))*(1-zn/z) 1 ]
Als u nu specifieke waarden opgeeft voor zf en zn, vindt u het volgende (voor positieve waarden): als de vector zich vóór het nabije vlak bevindt, zal de z-component na de transformatie kleiner zijn dan nul, als de vector bevindt zich achter het verre vlak, dan zal de z-component grotere eenheden zijn.

Er is geen verschil waar de nabije en verre vlakken zich precies bevinden: zn=1, zf=10 of zn=10, en zf=100 (of andere waarden) - na de transformatie zal het zichtbare gebied zich in het interval bevinden van nul tot één, inclusief.

Dit is precies waarvoor de formules in de elementen _33, _34 van de projectiematrix bedoeld zijn: om de afstand van het nabije naar het verre vlak in het segment te projecteren. Controleer dit door de waarden van meerdere vectoren te berekenen voor specifieke waarden van zn,zf (ja, op een vel papier!!!).

IN bepaald moment Elke ontwikkelaar op het gebied van computergraphics heeft een vraag: hoe werken deze veelbelovende matrices? Soms is het antwoord erg moeilijk te vinden en, zoals meestal gebeurt, geeft de meerderheid van de ontwikkelaars halverwege de taak op.

Dit is geen oplossing voor het probleem! Laten we er samen achter komen!

Laten we realistisch zijn met een praktische inslag en als proefpersoon nemen OpenGL-versies 3.3. Vanaf deze versie is elke ontwikkelaar verplicht de module zelfstandig te implementeren matrixbewerkingen. Geweldig, dit is wat we nodig hebben. Laten we onze moeilijke taak ontleden en de belangrijkste punten benadrukken. Enkele feiten uit de OpenGL-specificatie:

  • Matrices worden opgeslagen in kolommen (column-major);
  • Homogene coördinaten;
  • Canoniek clippingvolume (CVV) in een linkshandig coördinatensysteem.
Er zijn twee manieren om matrices op te slaan: kolom-major en rij-major. In hoorcolleges lineaire algebra wordt gebruik gemaakt van het rij-majoorschema. Over het algemeen doet de representatie van matrices in het geheugen er niet toe, omdat een matrix altijd door eenvoudige transpositie van het ene type representatie naar het andere kan worden geconverteerd. En aangezien er geen verschil is, zullen we voor alle volgende berekeningen klassieke rij-major-matrices gebruiken. Bij OpenGL-programmering Er is een kleine truc waarmee je kunt weigeren matrices te transponeren terwijl je klassieke rij-hoofdberekeningen behoudt. De matrix moet ongewijzigd naar het shader-programma worden overgebracht en in de shader moet de vermenigvuldiging niet tussen een vector en een matrix worden uitgevoerd, maar tussen een matrix en een vector.

Homogene coördinaten zijn geen erg lastig systeem met een aantal eenvoudige regels over het omzetten van conventionele cartesiaanse coördinaten in homogene coördinaten en vice versa. Een homogene coördinaat is een rijmatrix met dimensie . Om een ​​cartesiaanse coördinaat om te zetten in een homogene coördinaat is dit noodzakelijk X, j En z vermenigvuldigen met een willekeurig reëel getal w(behalve 0). Vervolgens moet u het resultaat in de eerste drie componenten schrijven, en het laatste component is gelijk aan de vermenigvuldiger w. Met andere woorden:
- Cartesische coördinaten
w– reëel getal niet gelijk aan 0

- homogene coördinaten

Een kleine truc: als w gelijk is aan één, dan is het enige dat nodig is voor de vertaling het overbrengen van de componenten X, j En z en wijs er één toe aan het laatste onderdeel. Dat wil zeggen: verkrijg een rijmatrix:

Een paar woorden over nulkwaliteit w. Vanuit het oogpunt van homogene coördinaten is dit heel acceptabel. Met homogene coördinaten kunt u onderscheid maken tussen punten en vectoren. In een cartesiaans coördinatensysteem is een dergelijke verdeling onmogelijk.

- punt waar ( x, y, z) – Cartesiaanse coördinaten

- vector, waarbij ( x, y, z) – straalvector

De omgekeerde vertaling van een hoekpunt van homogene coördinaten naar cartesiaanse coördinaten wordt als volgt uitgevoerd. Alle componenten van een rijmatrix moeten gedeeld worden door de laatste component. Met andere woorden:

- homogene coördinaten
- Cartesische coördinaten

Het belangrijkste dat u moet weten is dat alle OpenGL-algoritmen voor knippen en rasteren in cartesiaanse coördinaten werken, maar daarvoor worden alle transformaties in homogene coördinaten uitgevoerd. De overgang van homogene coördinaten naar cartesiaanse coördinaten wordt hardwarematig uitgevoerd.

Canonical clipping volume (CVV) is een van de minst gedocumenteerde delen van OpenGL. Zoals blijkt uit Fig. 1 CVV is een op de as uitgelijnde kubus, gecentreerd op de oorsprong en met een randlengte gelijk aan twee. Alles wat binnen het CVV-gebied valt, is onderhevig aan rastering, alles wat buiten het CVV-gebied valt, wordt genegeerd. Alles wat gedeeltelijk buiten de CVV valt, is onderworpen aan snoei-algoritmen. Het belangrijkste dat u moet weten is dat het CVV-coördinatensysteem linkshandig is!


Rijst. 1. Canoniek OpenGL-knipvolume (CVV)

Linkshandig coördinatensysteem? Hoe kan dit, aangezien de specificatie voor OpenGL 1.0 duidelijk vermeldt dat het gebruikte coördinatensysteem rechtshandig is? Laten we het uitzoeken.


Rijst. 2. Coördinatiesystemen

Zoals blijkt uit Fig. De 2 coördinatensystemen verschillen alleen in de richting van de as Z. OpenGL 1.0 gebruikt feitelijk rechtshandig gebruikerssysteem coördinaten Maar het CVV-coördinatensysteem en het gebruikerscoördinatensysteem zijn twee totaal verschillende dingen. Bovendien bestaat er vanaf versie 3.3 niet meer zoiets als standaard systeem OpenGL-coördinaten. Zoals eerder vermeld, implementeert de programmeur zelf de matrixbewerkingsmodule. Vorming van rotatiematrices, vorming van projectiematrices, zoeken naar een inverse matrix, vermenigvuldiging van matrices - dit is de minimale reeks bewerkingen die is opgenomen in de module Matrixbewerkingen. Er rijzen twee logische vragen. Als het zichtbaarheidsvolume een kubus is met een randlengte gelijk aan twee, waarom is er dan een scène van enkele duizenden groot zichtbaar op het scherm? Op welk punt wordt het gebruikerscoördinatensysteem omgezet naar het CVV-coördinatensysteem? Projectiematrices zijn precies de entiteit die zich met deze kwesties bezighoudt.

Het belangrijkste idee van het bovenstaande is dat de ontwikkelaar zelf vrij is om het type gebruikerscoördinatensysteem te kiezen en de projectiematrices correct moet beschrijven. Hiermee zijn de feiten over OpenGL voltooid en is het tijd om alles op een rij te zetten.

Een van de meest voorkomende en moeilijk te begrijpen matrices is de perspectieftransformatiematrix. Dus hoe verhoudt dit zich tot CVV en het gebruikerscoördinatensysteem? Waarom worden objecten kleiner naarmate hun afstand tot de waarnemer groter wordt? Om te begrijpen waarom objecten kleiner worden naarmate de afstand groter wordt, gaan we naar matrixtransformaties kijken driedimensionaal model stap voor stap. Het is geen geheim dat elk driedimensionaal model bestaat uit een eindige lijst van hoekpunten die volledig onafhankelijk van elkaar matrixtransformaties ondergaan. Om de coördinaat van een driedimensionaal hoekpunt op een tweedimensionaal beeldscherm te bepalen, moet u:

  1. Converteer Cartesiaanse coördinaat naar homogene coördinaat;
  2. Vermenigvuldig de homogene coördinaat met de modelmatrix;
  3. Het resultaat wordt vermenigvuldigd met de weergavematrix;
  4. Vermenigvuldig het resultaat met de projectiematrix;
  5. Converteer het resultaat van homogene coördinaten naar cartesiaanse coördinaten.
De conversie van cartesiaanse coördinaten naar homogene coördinaten is eerder besproken. De geometrische betekenis van de modelmatrix is ​​het overbrengen van het model van een lokaal coördinatensysteem naar mondiaal systeem coördinaten Of, zoals ze zeggen, verplaats de hoekpunten uit de modelruimte naar de wereldruimte. Laten we het simpel zeggen: een driedimensionaal object dat vanuit een bestand wordt geladen, bevindt zich in de modelruimte, waar de coördinaten worden gemeten ten opzichte van het object zelf. Vervolgens wordt het model met behulp van de modelmatrix gepositioneerd, geschaald en geroteerd. Als gevolg hiervan krijgen alle hoekpunten van het 3D-model daadwerkelijke homogene coördinaten in de 3D-scène. Modelruimte ten opzichte van de wereldruimte is lokaal. Vanuit de modelruimte worden coördinaten overgebracht naar de wereldruimte (van lokaal naar mondiaal). Hiervoor wordt gebruik gemaakt van een modelmatrix.

Laten we nu verder gaan met stap drie. Hier komt de kijkruimte in beeld. In deze ruimte worden coördinaten gemeten ten opzichte van de positie en oriëntatie van de waarnemer alsof hij het middelpunt van de wereld is. De weergaveruimte is lokaal ten opzichte van de wereldruimte, dus de coördinaten moeten erin worden ingevoerd (en niet eruit worden gehaald, zoals in het vorige geval). Directe matrixtransformatie verwijdert coördinaten uit een bepaalde ruimte. Om ze daarentegen erin te introduceren, is het noodzakelijk om de matrixtransformatie om te keren, daarom wordt de typetransformatie beschreven door de inverse matrix. Hoe je dit kunt krijgen omgekeerde matrix? Laten we eerst de directe waarnemersmatrix nemen. Wat kenmerkt een waarnemer? De waarnemer wordt beschreven door de coördinaat waarin hij zich bevindt en de kijkrichtingsvectoren. De waarnemer kijkt altijd in de richting van zijn lokale as Z. De waarnemer kan zich rond de scène bewegen en bochten maken. In veel opzichten lijkt dit op de betekenis van de modelmatrix. In grote lijnen is dit hoe het is. Voor een waarnemer is de schaalbewerking echter zinloos en daarom kan er geen gelijkteken worden geplaatst tussen de modelmatrix van de waarnemer en de modelmatrix van een driedimensionaal object. De modelmatrix van de waarnemer is de gewenste directe matrix. Door deze matrix om te keren, verkrijgen we de weergavematrix. In de praktijk betekent dit dat alle hoekpunten in globale homogene coördinaten nieuwe homogene coördinaten zullen krijgen ten opzichte van de waarnemer. Dienovereenkomstig, als de waarnemer een bepaald hoekpunt zag, dan is de waarde van de homogene coördinaat z van een bepaald hoekpunt in de weergaveruimte zal er zeker zijn positief getal. Als het hoekpunt zich achter de waarnemer bevond, dan is de waarde van zijn homogene coördinaat z in zicht zal de ruimte zeker een negatief getal zijn.

Stap vier is de meest interessante stap. De voorgaande stappen zijn met opzet zo gedetailleerd besproken dat de lezer een compleet beeld krijgt van alle operanden van de vierde stap. Bij de vierde stap worden homogene coördinaten overgebracht van de weergaveruimte naar de CVV-ruimte. Opnieuw wordt het feit benadrukt dat alle potentieel zichtbare hoekpunten een positieve waarde van de homogene coördinaat zullen hebben z.

Beschouw een matrix van de vorm:

En een punt in de homogene ruimte van de waarnemer:

Laten we de homogene coördinaat vermenigvuldigen met de betreffende matrix:

Laten we de resulterende homogene coördinaten omzetten in cartesiaanse coördinaten:

Laten we zeggen dat er twee punten in de kijkruimte zijn met dezelfde coördinaten X En j, maar met verschillende coördinaten z. Met andere woorden: het ene punt ligt achter het andere. Vanwege perspectiefvervorming moet de waarnemer beide punten zien. Uit de formule blijkt inderdaad duidelijk dat het gevolg is van deling door de coördinaat z, vindt compressie plaats tot aan het oorsprongspunt. Hoe hoger de waarde z(hoe verder het punt van de waarnemer verwijderd is), de sterkere compressie. Dit is de verklaring voor het perspectiefeffect.

De OpenGL-specificatie stelt dat knip- en rasterbewerkingen worden uitgevoerd in cartesiaanse coördinaten, en dat het proces van het converteren van homogene coördinaten naar cartesiaanse coördinaten automatisch wordt uitgevoerd.

Matrix (1) is een sjabloon voor een perspectiefprojectiematrix. Zoals eerder vermeld, bestaat de taak van de projectiematrix uit twee punten: het instellen van een gebruikerscoördinatensysteem (linkshandig of rechtshandig), het overbrengen van het zichtbaarheidsvolume van de waarnemer naar CVV. Laten we een perspectiefmatrix afleiden voor een linkshandig coördinatensysteem.

De projectiematrix kan worden beschreven met met behulp van vier parameters (Fig. 3):

  • Kijkhoek in radialen ( fovy);
  • Beeldverhouding ( aspect);
  • Afstand tot het dichtstbijzijnde uitknipvlak ( N);
  • Afstand tot het verre uitknipvlak ( F).


Rijst. 3. Perspectiefvolume van zichtbaarheid

Laten we eens kijken naar de projectie van een punt in de ruimte van de waarnemer op de voorkant van de afsnijding van het perspectiefvolume van zichtbaarheid. Voor meer duidelijkheid, in afb. 4 toont een zijaanzicht. Er moet ook rekening mee worden gehouden dat het gebruikerscoördinatensysteem samenvalt met het CVV-coördinatensysteem, dat wil zeggen dat het linkshandige coördinatensysteem overal wordt gebruikt.


Rijst. 4. Een willekeurig punt projecteren

Op basis van de eigenschappen van gelijkvormige driehoeken zijn de volgende gelijkheden waar:

Laten we yꞌ en xꞌ uitdrukken:

In principe zijn uitdrukkingen (2) voldoende om de coördinaten van de projectiepunten te verkrijgen. Om driedimensionale objecten goed te kunnen screenen, moet u echter de diepte van elk fragment kennen. Met andere woorden, het is noodzakelijk om de waarde van de component op te slaan z. Dit is de waarde die wordt gebruikt voor OpenGL-dieptetests. In afb. 3 Het is duidelijk dat de waarde zꞌ is niet geschikt als fragmentdiepte, omdat alle puntprojecties dat wel kunnen dezelfde waarde zꞌ. De uitweg uit deze situatie is het gebruik van de zogenaamde pseudo-diepte.

Pseudo-diepte eigenschappen:

  1. Pseudodiepte wordt berekend op basis van de waarde z;
  2. Hoe dichter het punt bij de waarnemer ligt, hoe minder waarde de pseudodiepte heeft;
  3. Alle punten die op het voorste vlak van het zichtvolume liggen, hebben een pseudo-dieptewaarde van -1;
  4. Alle punten die op het verste snijvlak van het zichtvolume liggen, hebben een pseudo-dieptewaarde van 1;
  5. Alle fragmenten die binnen het zichtbaarheidsvolume liggen, hebben een pseudo-dieptewaarde in het bereik [-1 1].
Laten we de formule afleiden waarmee pseudo-diepte wordt berekend. Laten we de volgende uitdrukking als basis nemen:

Kansen A En B hoeft te worden berekend. Om dit te doen, gebruiken we de eigenschappen van pseudo-diepten 3 en 4. We verkrijgen een systeem van twee vergelijkingen met twee onbekenden:

Laten we beide delen van het systeem optellen en het resultaat vermenigvuldigen met het product fn, terwijl F En N kan niet gelijk zijn aan nul. Wij krijgen:

Laten we de haakjes openen en de termen herschikken zodat alleen het gedeelte met A, en aan de rechterkant alleen met B:

Laten we (6) vervangen door (5). Laten we de uitdrukking omzetten in een eenvoudige breuk:

Vermenigvuldig beide zijden met -2fn, terwijl F En N kan niet gelijk zijn aan nul. Laten we soortgelijke voorstellen, de termen herschikken en uitdrukken B:

Laten we (7) vervangen door (6) en dit uitdrukken A:

Dienovereenkomstig de componenten A En B zijn gelijk:

Laten we nu de verkregen coëfficiënten vervangen door de werkstukmatrix (1) en kijken wat er met de coördinaat gebeurt z voor een willekeurig punt in de homogene ruimte van de waarnemer. De vervanging wordt als volgt uitgevoerd:

Houd de afstand tot het voorste snijvlak aan N gelijk is aan 2, en de afstand tot het verre uitknipvlak F is gelijk aan 10. Beschouw vijf punten in de homogene ruimte van de waarnemer:

De relatieve positie van het punt en het zichtbaarheidsvolume
Punt Betekenis Beschrijving
1 1 Het punt bevindt zich vóór het voorste snijvlak van het zichtvolume. Komt niet door de rasterisatie.
2 2 Het punt bevindt zich op de voorrand van de zichtbaarheidsvolume-afsnijding. Rasterisatie ondergaan.
3 5 Het punt bevindt zich tussen de voorste bijsnijdrand en de verste bijsnijdrand van het zichtbaarheidsvolume. Rasterisatie ondergaan.
4 10 Het punt bevindt zich aan de uiterste rand van de zichtvolumegrens. Rasterisatie ondergaan.
5 20 Het punt bevindt zich voorbij de uiterste rand van de zichtvolumegrens. Komt niet door de rasterisatie.

Laten we alle punten vermenigvuldigen met matrix (8) en vervolgens de resulterende homogene coördinaten omzetten in Cartesische coördinaten . Om dit te doen, moeten we de waarden van nieuwe homogene componenten berekenen En .
Punt 1:

Merk op dat de homogene coördinaat absoluut correct gepositioneerd in CVV, en het allerbelangrijkste: de OpenGL-dieptetest is nu mogelijk, omdat de pseudo-diepte volledig voldoet aan de testvereisten.

Met coördinaat z We zijn er achter, laten we verder gaan met de coördinaten X En j. Zoals eerder vermeld moet het gehele perspectiefvolume van zichtbaarheid in de CVV passen. De lengte van de CVV-rand is twee. Dienovereenkomstig moeten de hoogte en breedte van het perspectiefvolume van zichtbaarheid worden gecomprimeerd tot twee conventionele eenheden.

Wij beschikken over een hoek fovy en omvang aspect. Laten we de hoogte en breedte uitdrukken met behulp van deze waarden.


Rijst. 5. Zichtvolume

Vanaf afb. 5 Het is duidelijk dat:

Nu kunnen we het definitieve beeld krijgen van de perspectiefprojectiematrix voor een aangepast linkshandig coördinatensysteem dat werkt met CVV OpenGL:

Hiermee is de afleiding van matrices voltooid.

Een paar woorden over DirectX - de belangrijkste concurrent van OpenGL. DirectX verschilt alleen van OpenGL in de afmetingen van de CVV en de positionering ervan. In DirectX is een CVV een rechthoekig parallellepipedum met lengtes langs de assen X En j gelijk aan twee, en langs de as z lengte is gelijk aan één. Bereik X En j is [-1 1], en het bereik z gelijk aan. Wat het CVV-coördinatensysteem betreft, gebruikt DirectX, net als OpenGL, een linkshandig coördinatensysteem.

Om perspectiefmatrices weer te geven voor een aangepast rechtshandig coördinatensysteem, moet u Fig. 2, Fig. 3 en Fig. 4 rekening houdend met de nieuwe asrichting Z. Verdere berekeningen zijn volledig vergelijkbaar, tot aan het teken. Voor DirectX-matrices worden de pseudo-diepte-eigenschappen 3 en 4 aangepast aan het bereik.

Op dit punt kan het onderwerp veelbelovende matrices als gesloten worden beschouwd.

In computergraphics worden de concepten van verschillende matrices gedefinieerd. Dit zijn de Wereldmatrix, de Kijkmatrix en de Projectiematrix. Met behulp van deze matrices in broncode Het programma voert matrixtransformaties uit op modellen. Matrixtransformaties impliceren de vermenigvuldiging van elk hoekpunt van een object met een van de matrices, of beter gezegd de opeenvolgende vermenigvuldiging van alle hoekpunten van een object met elk van de drie matrices. Met deze aanpak kunt u het model correct weergeven in de driedimensionale ruimte van uw tweedimensionale monitor. De techniek waarbij het model door de drie genoemde matrices wordt geleid, vertegenwoordigt de essentie van het mechanisme voor het werken met grafische gegevens in het driedimensionale vlak van de monitor.

Wereldmatrix

Wereldmatrix – hiermee kunt u verschillende matrixtransformaties (transformatie en schaling) van een object in het wereldcoördinatensysteem uitvoeren. Wereld systeem coördinaten is van hemzelf lokaal systeem coördinaten van dit voorwerp, die is begiftigd met elk object dat, laten we zeggen, door de wereldmatrix is ​​gegaan, aangezien elk hoekpunt deelneemt aan het product van deze matrix.

Het nieuwe lokale coördinatensysteem vereenvoudigt affiene transformaties van een object in de ruimte aanzienlijk. Bijvoorbeeld om een ​​object van links te verplaatsen bovenste hoek display naar de rechter benedenhoek van het display, dat wil zeggen: om het spelobject in de ruimte te verplaatsen, hoeft u het alleen maar te verplaatsen lokaal punt referentie, coördinatensysteem naar een nieuwe locatie. Als er geen wereldmatrix zou zijn, zou dit object hoekpunt voor punt moeten worden overgedragen. Daarom passeert elk object, of beter gezegd alle hoekpunten van dit object, de wereldtransformatiematrix.

Zoals gezegd kan de wereldtransformatie van de hoekpunten van een object bestaan ​​uit elke combinatie van rotatie, translatie en schaling. In wiskundige notatie ziet de rotatie van een hoekpunt langs de X-as er als volgt uit:


Wereldmatrix

waarbij cos de rotatiehoek in radialen is.

Het roteren van een hoekpunt rond de Y-as ziet er als volgt uit:


Een hoekpunt rond de Y-as roteren

En rotatie rond de Z-as vindt plaats volgens de volgende formule:


rotatie rond de Z-as

Met hoekpuntvertaling kunt u dit hoekpunt met de coördinaten x, y, z naar verplaatsen nieuw punt met nieuwe coördinaten x1, y1, z1. In wiskundige notatie ziet het er als volgt uit:

X1 = x + Tx y1 = y + Ty z1 = z + Tz

De vertaling van een hoekpunt in matrixnotatie ziet er als volgt uit:


Vertaling van een hoekpunt in matrixnotatie

waarbij Tx, Ty en Tz de offsetwaarden zijn langs de X-, Y- en Z-assen.

Je kunt een hoekpunt in de ruimte schalen (verwijderen of inzoomen) met de coördinaten x, y, z naar een nieuw punt met nieuwe waarden x1, y1, z1 met behulp van de volgende notatie:

X1 = x * S y1 = y * S z1 = z * S

In matrixnotatie wordt dit als volgt uitgedrukt:


Schaal hoekpunt

waarbij Sx, Sy, Sz de waarden zijn van de rek- of compressiecoëfficiënten langs de X-, Y-, Z-assen.

Alle bovenstaande bewerkingen kunnen handmatig worden uitgevoerd in de broncode van het programma, dat wil zeggen dat de gegeven invoer kan worden berekend zoals ik ze zojuist heb beschreven. Maar natuurlijk doet niemand dit (bijna niemand), omdat DirectX een groot aantal methoden heeft die alle bovenstaande bewerkingen voor u zullen uitvoeren.

Bekijk Matrix

Bekijk matrix – specificeert de locatie van de camera in de ruimte en is de tweede matrix waarmee de hoekpunten van het object worden vermenigvuldigd. Deze matrix helpt bij het bepalen van de kijkrichting van een 3D-scène. Een driedimensionale scène is alles wat u op het beeldscherm ziet. Het is net als in een theater waar je in een portier of in de galerij zit en de actie op het podium bekijkt. Zittend in de portier heb je dus één cameralocatie, en zitten in de galerij is compleet anders.

Met deze matrix kun je feitelijk het genre van het spel bepalen. Zo is de first-person DOOM-game de eerste rij van een portier in een theater, terwijl de Warcraft-game een galerij op het balkon is. De weergavematrix is ​​ontworpen om de positie van de camera in de ruimte te bepalen, en je kunt de camerapositie naar links, rechts, omhoog, omlaag verplaatsen, weg bewegen, inzoomen, enzovoort.

Projectiematrix

Een projectiematrix is ​​een complexere matrix die een projectie creëert driedimensionaal voorwerp op het vlak van een tweedimensionaal beeldscherm. Met behulp van deze matrix worden de voor- en achterknipgebieden van de driedimensionale ruimte bepaald, waardoor u de knipruimte van objecten die onzichtbaar zijn op het scherm kunt aanpassen en tegelijkertijd de belasting van de videokaartprocessor kunt verminderen. De figuur toont het mechanisme van het projecteren van een object in een vlak en het afsnijden van de ruimte.


Projectiematrix

In de laatste lezing hebben we gesproken over de belangrijkste projecties die in de affiene meetkunde worden gebruikt. Laten we nu verder gaan met de perspectiefgeometrie en verschillende nieuwe soorten projectie.

Op foto's, schilderijen en schermen komen beelden voor ons natuurlijk en correct over. Deze afbeeldingen worden perspectief genoemd. Hun eigenschappen zijn zodanig dat verder weg gelegen objecten op kleinere schaal worden afgebeeld, parallelle lijnen zijn over het algemeen niet parallel. Als gevolg hiervan blijkt de geometrie van het beeld behoorlijk complex te zijn, en afgewerkt beeld het is moeilijk om de grootte van bepaalde delen van een object te bepalen.

De gebruikelijke perspectiefprojectie is een centrale projectie op een vlak met rechte stralen die door een punt gaan, het midden van de projectie. Eén van de projecterende stralen staat loodrecht op het projectievlak en wordt de hoofdstraal genoemd. Het snijpunt van deze straal en het projectievlak is het hoofdpunt van de afbeelding.

Er zijn drie coördinatensystemen. Normaal gesproken werkt een programmeur met gegevens over geometrische objecten en slaat deze op in wereldcoördinaten. Om het realisme te vergroten, worden bij het voorbereiden van de weergave van een afbeelding op het scherm gegevens over objecten uit wereldcoördinaten omgezet naar weergavecoördinaten. En pas op het moment dat het beeld direct op het beeldscherm wordt weergegeven, verplaatsen ze zich naar schermcoördinaten, dit zijn de pixelnummers van het scherm.

De eerste twee systemen kunnen worden gebruikt in multidimensionale coördinatensystemen, maar de laatste alleen in tweedimensionale. De bewerkingen zijn onomkeerbaar, dat wil zeggen dat het onmogelijk is om een ​​driedimensionaal beeld te herstellen uit een tweedimensionaal projectiebeeld.

Transformatiematrix voor algemeen perspectief

In deze matrix de elementen A, D, e zijn verantwoordelijk voor schaalvergroting, M, N, L voor verplaatsing, P, Q, R voor projectie, S voor uitgebreide schaling, X voor rotatie.

Voor een gedetailleerde beschrijving van het volgen van puntkenmerken, camerakalibratie en reconstructietechnieken driedimensionale objecten het is noodzakelijk om een ​​prospectief ontwerpmodel te introduceren en te beschrijven geometrische eigenschappen deze transformatie. De punten van verschillende beelden verkregen met behulp van perspectiefprojectie hebben een speciale relatie met elkaar, die wordt beschreven door epipolaire geometrie. De modellen van deze relaties moeten in detail worden onderzocht, omdat Bijna alle driedimensionale reconstructiemethoden vereisen de evaluatie van overeenkomstige modellen en vertrouwen op hun eigenschappen.

Het is noodzakelijk om afzonderlijk de veronderstelling te noteren dat alle bronbeelden dezelfde scène vastleggen, d.w.z. elke afbeelding is een weergave van de scène van een specifieke camera. Daarom wordt voor het gemak van de beschrijving het concept van een weergave geïntroduceerd, als een afbeelding met een bijbehorend cameramodel waaruit deze is verkregen.

Perspectief projectie

Het perspectiefprojectiemodel komt overeen met een ideale pinhole-camera. Dit model sluit nauw aan bij het beeldconstructieproces van de meeste moderne foto- en videocamera's. Vanwege de beperkingen van de moderne optica wijkt het daadwerkelijke proces echter enigszins af van het pinhole-cameramodel. Verschillen tussen het werkelijke proces en het model worden vervormingen genoemd en worden afzonderlijk gemodelleerd.

Het model van de eenvoudigste gaatjescamera is handig omdat het volledig wordt beschreven door het projectiecentrum en de positie van het beeldvlak. Daarom kan de projectie van elk scènepunt in het beeld worden gevonden als het snijpunt van de straal die het midden van de projectie en het scènepunt verbindt met het beeldvlak.

Het eenvoudigste model van perspectiefprojectie

Laten we het eenvoudigste geval bekijken waarin het midden van de cameraprojectie (focus) op de oorsprong van het coördinatensysteem wordt geplaatst en het beeldvlak samenvalt met het Z=1-vlak. Laat (X,Y,Z) de coördinaten zijn van een punt in de driedimensionale ruimte, en (x,y) de projectie van dit punt op afbeelding I. De perspectiefprojectie wordt in dit geval beschreven door de volgende vergelijkingen:

In matrixvorm met behulp van homogene coördinaten worden deze vergelijkingen als volgt herschreven:

(2.2)

Het vlak dat zich op een afstand van 1 van het midden van de projectie en loodrecht op de optische as bevindt, wordt het ideale beeldvlak genoemd. De optische as snijdt het ideale beeldvlak in een punt c, het hoofdpunt genoemd. Een illustratie van het eenvoudigste geval van perspectiefprojectie wordt getoond in Fig. 1.

Interne camerakalibratie

Het eenvoudigste geval van perspectiefprojectie komt vrijwel altijd niet overeen met de echte camera. De afstand van het projectiecentrum tot het beeldvlak, d.w.z. de brandpuntsafstand, aangegeven met f, is doorgaans niet gelijk aan 1. Ook mogen de coördinaten van een punt in het beeldvlak niet samenvallen met absolute coördinaten. Bij gebruik digitale camera wordt de relatie tussen de coördinaten van een punt in de afbeelding en de absolute coördinaten van een punt op een ideaal vlak bepaald door de vorm en grootte van de pixels van de matrix.

Laten we de pixelafmetingen van een digitale cameramatrix aangeven als p x , p y , de pixelhellingshoek als α en het hoofdpunt als , figuur 2. Vervolgens worden de coördinaten van het punt (x,y) in de afbeelding dat overeenkomt met het punt (x R, y R) op het ideale vlak bepaald door de uitdrukking:

(2.3)

Als f x ,f y de brandpuntsafstand f is, gemeten in pixelbreedtes en -hoogtes, en tan(α)*f/p y wordt aangegeven als s, dan wordt formule 2.3 omgezet in:

(2.4)

De K-matrix wordt de interne kalibratiematrix van de camera genoemd. In de meeste gevallen is de pixelhoek bij echte digitale camera's bijna recht, d.w.z. parameter s=0, en de breedte en hoogte van de pixel zijn gelijk. Het principepunt bevindt zich meestal in het midden van het beeld. Daarom kan matrix K worden geschreven als:

(2.5)

Deze aanname over de vorm van de K-matrix wordt veel gebruikt om algoritmen voor het bepalen van de interne kalibratie van de camera te vereenvoudigen, evenals bij synthetische beeldmodellering die nodig is om de kwaliteit en efficiëntie van 3D-reconstructiemethoden te evalueren.

Externe camerakalibratie

Laat M een scènepunt zijn in de driedimensionale ruimte. Elke beweging is een Euclidische transformatie van de ruimte en wordt daarom in homogene coördinaten uitgedrukt als:

(2.6)

waarbij R de rotatiematrix is, T= T is de translatievector.

De beweging van de camera ten opzichte van de scène is gelijk aan de omgekeerde beweging van de punten van de scène ten opzichte van de camera, en is daarom gelijk aan:

(2.7)

waarbij R, T de rotatiematrix en de camerabewegingsvector ten opzichte van de scène is. Matrix C wordt matrix genoemd externe kalibratie camera's. De matrix C -1 wordt de matrix genoemd camerabewegingen. De externe camerakalibratiematrix vertaalt dus de coördinaten van de scènepunten van het scènecoördinatensysteem naar het coördinatensysteem dat bij de camera hoort.

Compleet perspectiefprojectiemodel

Uit uitdrukkingen 2.1, 2.4, 2.7 kunnen we een uitdrukking afleiden voor een willekeurige perspectiefprojectie voor elke camera met een willekeurige oriëntatie en positie in de ruimte:

In een meer beknopte vorm, rekening houdend met de vorige notatie, kan deze formule als volgt worden geschreven:

De matrix P wordt de cameraprojectiematrix genoemd.

Laten we, naar analogie met de algemene perspectieftransformatie, eerst het eenvoudigste geval van een perspectieftransformatie van een vlak bekijken. Laat het vlak p samenvallen met het vlak Z=0, dan zijn de homogene driedimensionale coördinaten van elk van zijn punten M=. Voor elke camera met een projectiematrix P wordt de perspectieftransformatie van het vlak beschreven door een 3*3-matrix:


Aangezien elk vlak in de driedimensionale ruimte kan worden overgebracht naar het Z = 0-vlak door de Euclidische transformatie van rotatie en translatie, wat overeenkomt met het vermenigvuldigen van de cameramatrix P met de transformatiematrix L, kan de perspectiefweergave van een willekeurig vlak in ruimte wordt beschreven door lineaire transformatie met een 3*3-matrix.

Perspectiefvlaktransformatie wordt ook wel genoemd homografie. In matrixvorm wordt de perspectieftransformatie van het vlak geschreven als m=HM.

Geometrie van twee afbeeldingen

De scène die in alle bronbeelden is vastgelegd, wordt als bewegingloos beschouwd. Daarom kan de relatieve positie van de projecties van de scènepunten op verschillende frames niet op willekeurige wijze veranderen. De beperkingen die worden opgelegd aan de locatie van puntprojecties zijn uiteraard afhankelijk van de parameters van de camera's en hun positie ten opzichte van elkaar. Daarom levert het definiëren van modellen van dergelijke beperkingen enige informatie op over de relatieve posities van de camera's waarvan de beelden zijn verkregen.

Perspectiefvlaktransformatie

Als de middelpunten van de twee camera's samenvallen, worden de punten op de beeldvlakken van beide camera's in elkaar vertaald door een perspectieftransformatie van het vlak. In dit geval is de transformatie van punten tussen afbeeldingen niet afhankelijk van de vorm van de driedimensionale scène, maar alleen van de relatieve positie van de beeldvlakken.

Als de hele scène of een deel ervan een vlak is, dan staan ​​de afbeeldingen erop verschillende soorten met niet-samenvallende cameracentra kunnen door een homografische transformatie in elkaar worden omgezet. Laat p het waargenomen vlak zijn, en H 1 de homografische transformatie tussen vlak p en het beeld ik 1, H 2 - homografietransformatie tussen vlak p en beeld ik 2. Dan de homografietransformatie H 12 tussen afbeeldingen ik 1 En ik 2 kan als volgt worden uitgevoerd:

H 12 is niet afhankelijk van de parametrisering van het vlak p, en dus ook niet van het coördinatensysteem in de ruimte

De meeste methoden voor het bepalen van de coördinaten van 3D-punten op basis van hun projecties en methoden voor het reconstrueren van een 3D-scène zijn gebaseerd op de aanname dat het cameracentrum tussen weergaven beweegt. Daarom zullen deze methoden, als de middelpunten van camera's van verschillende typen samenvallen, onjuiste resultaten opleveren. Dergelijke cameraconfiguraties moeten op een speciale manier worden gedetecteerd en afgehandeld.

Omdat de homografietransformatie in homogene coördinaten wordt geschreven, wordt de matrix H op schaal gedefinieerd. Het heeft 8 vrijheidsgraden en wordt geparametriseerd door 8 variabelen. Elk bekend paar overeenkomstige punten m 1 En m2 in de eerste en tweede afbeelding geeft respectievelijk 2 lineaire vergelijkingen uit de elementen van de matrix H. Daarom zijn 4 bekende paren corresponderende punten voldoende om een ​​systeem van lineaire vergelijkingen van 8 vergelijkingen met 8 onbekenden samen te stellen. Volgens dit systeem kan de homografie H op unieke wijze worden bepaald als geen drie van de punten op dezelfde lijn liggen.

Fundamentele matrix

Laten we eens kijken naar het geval waarin de middelpunten van de twee soorten camera's niet samenvallen. Laten C 1 En C 2- middelpunten van twee camera's, M - 3-dimensionaal punt van de scène, m 1 En m2- projecties van punt M op respectievelijk het eerste en het tweede beeld. Laat P een vlak zijn dat door het punt M en de middelpunten van de camera's gaat C 1 En C 2. Vlak P snijdt de beeldvlakken van het eerste en tweede aanzicht langs rechte lijnen ik 1 En ik 2. Sinds de stralen C 1 M En C 2 M in het vlak P liggen, dan is het duidelijk dat de punten m 1 En m2 liggen op rechte lijnen ik 1 En ik 2 respectievelijk. We kunnen een meer algemene verklaring geven dat de projecties van elk punt M" dat in het vlak Π ligt op beide afbeeldingen op rechte lijnen moeten liggen ik 1 En ik 2. Deze lijnen worden epipolaire lijnen genoemd. Het vlak P wordt het epipolaire vlak genoemd.

Twee weergaven van dezelfde scène worden een stereopaar en een segment genoemd C 1 C 2, het verbinden van de middelpunten van de camera's wordt de basis van het stereopaar (basislijn) of stereobasis genoemd. Elk epipolair vlak passeert het segment C 1 C 2. Laten C 1 C 2 snijdt de eerste en tweede afbeelding op punten e 1 En e 2 respectievelijk. Punten e 1 En e 2 worden epipolaire punten of epipolen genoemd. Alle epipolaire lijnen snijden elkaar in punten e 1 En e 2 in respectievelijk de eerste en tweede afbeelding. De reeks epipolaire vlakken is een straal die elkaar snijdt langs de stereobasis C 1 C 2. De vele epipolaire lijnen in beide afbeeldingen vertegenwoordigen ook bundels rechte lijnen die elkaar kruisen e 1 En e 2 .

Punten m 1 En m2 worden corresponderend genoemd als het projecties zijn van hetzelfde scènepunt M. Epipolaire lijnen ik 1 En ik 2 worden corresponderend genoemd als ze in hetzelfde epipolaire vlak P liggen. Als het epipolaire vlak P door een punt gaat m 1, dan de epipolaire lijnen ik 1 En ik 2, die erin liggen, worden corresponderend met het punt genoemd m 1.

Beperking op de positie van de overeenkomstige punten m 1 En m2, die volgt uit de epipolaire meetkunde, kan als volgt worden geformuleerd: punt m2, corresponderend m 1, moet op de epipolaire lijn liggen ik 2, corresponderend m 1. Deze aandoening wordt de epipolaire beperking genoemd. In homogene coördinaten is dit de voorwaarde dat een punt M ligt op de lijn l geschreven als lTm=0. De epipolaire lijn loopt ook door het epipolaire punt. Vergelijking van een lijn die door punten gaat m 1 En e 1 kan worden geschreven als:

l 1 ∼ x m 1,

Waar X- een antisymmetrische matrix met dimensie 3*3 zodat, xm1- vectorproduct m 1 En e 1.

Voor de overeenkomstige epipolaire lijnen ik 1 En ik 2 rechts:

Waar P+- pseudo-inversie van matrix P.

De matrix F wordt de fundamentele matrix genoemd. Zij vertegenwoordigt lineaire operator, overeenkomend met elk punt m 1 de overeenkomstige epipolaire lijn ik 2. Voor elk paar overeenkomstige punten m 1 En m2 rechts

mT 2 Fm 1 =0

Dit is een formulering van de epipolaire beperking via de fundamentele matrix.

De fundamentele matrix heeft 7 vrijheidsgraden. Elk paar overeenkomstige punten m 1 En m2 definieert één lineaire vergelijking voor de elementen van de matrix, zodat deze kan worden berekend op basis van de bekende 7 paren overeenkomstige punten.

De epipolaire beperking is geldig voor elk paar corresponderende punten op ideale vlakken van twee typen. Als de interne kalibratiematrices bekend zijn K1 En K2 camera's van beide typen, dan wordt de epipolaire beperking voor de overeenkomstige punten op ideale vlakken geschreven als:

De matrix E wordt genoemd significant matrix. Er kan worden aangetoond dat de essentiële matrix ook kan worden verkregen uit de relatieve posities van de camera's.

Laten P1 =(I|0) En P 2 =(R|-RT)- twee ontwerpmatrices met kalibratie K = I. Vervolgens worden de ontwerpvergelijkingen voor het ideale vlak van beide camera's geschreven in de vorm:

Laten we de epipolaire lijn in de tweede weergave vinden die overeenkomt met het punt m" 1 op de eerste. Om dit te doen, volstaat het om op het tweede zicht twee punten te projecteren die op de straal liggen (C 1, m" 1) naar het tweede beeld, bijvoorbeeld het midden van de eerste camera (0,0,0,1)T en een punt op het oneindigheidsvlak (x" 1 ,y" 1 ,z" 1 ,0) T. De projecties van deze punten zijn -RT, en R(x" 1 ,y" 1 ,z" 1 ,0) T. Epipolaire lijnvergelijking ik 2, het passeren van beide punten wordt gegeven als een vectorproduct:

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

In matrixvorm is een vector geen product T×(x" 1 ,y" 1 ,z" 1) T kan worden geschreven met behulp van de matrix S:

Vervolgens wordt de epipolaire beperking op punten in het ideale vlak geschreven als:

Het uitdrukken van de essentiële matrix in termen van de externe kalibratieparameters van de twee camera's wordt gebruikt om de relatieve posities van de camera's te berekenen.

Geometrische eigenschappen van drie of meer afbeeldingen

Laten C 1,C 2 En C 3- centra van drie aanzichten van dezelfde driedimensionale scène. In dit geval worden epipolaire beperkingen opgelegd aan de overeenkomstige punten van elk paar soorten. Als de projecties van twee punten bekend zijn m 1 En m2 naar het eerste en tweede aanzicht, dan kan de positie van de projectie op het derde beeld worden gevonden als het snijpunt van twee epipolaire aanzichten die overeenkomen met de punten m 1 En m2.

Volgens twee bekende projecties m 1 En m2 Met behulp van twee afbeeldingen met een bekende kalibratie kan de positie van punt M in de ruimte worden bepaald. Als de kalibratie van het derde beeld bekend is, kan daarom de projectie van punt M op het derde beeld worden bepaald door een eenvoudige projectie.

Er kunnen ook beperkingen worden geschreven die worden opgelegd aan de positie van overeenkomstige punten in meer dan twee afbeeldingen lineaire vorm. Voor drie typen zijn deze beperkingen geschreven in de vorm van een trifocale tensor, voor vier typen - in de vorm van een quadrifocale tensor. Het berekenen van deze beperkingen is echter gelijk aan het berekenen van de maatstaf van alle drie of vier aanzichten in de projectieve ruimte. Dit soort beperkingen worden in dit werk niet gebruikt en worden daarom niet in meer detail besproken.