Over coördinatentransformatie van 3D-modellen
stof
Allereerst
Je ziet vaak 3D-beelden op tv-schermen en schermen in games, maar hoe geef je objecten weer die in de 3D-ruimte bestaan, zoals personages en gebouwen die op het scherm bewegen, op een 2D-scherm?
In 2D-spellen zijn er alleen tweedimensionale elementen van "X en Y" als coördinaatwaarden, en de weergave is ook 2D, dus als je een object tekent door de coördinatenpositie van X en Y op te geven, zul je intuïtief begrijpen hoe het op welke positie zal worden getekend.
In 3D is het echter niet zo eenvoudig. Zoals de naam al doet vermoeden, is 3D "3-dimensionaal" en heeft het drie coördinateninformatie: "X, Y en Z". Omdat de coördinaten afwijken van de weergave die 2D is, is het niet mogelijk om het object te tekenen zoals het is.
Wat u vervolgens moet doen, is "driedimensionale informatie omzetten in tweedimensionale informatie". Dit wordt gewoonlijk een 'coördinatentransformatie' genoemd. Houd er rekening mee dat deze coördinatentransformatie essentieel is voor 3D-programmering.
Er zijn verschillende soorten coördinatentransformaties voor het converteren van 3D naar 2D, maar er zijn drie hoofdtypen coördinatentransformaties die programmeurs hanteren: "wereldtransformatie", "weergavetransformatie" en "projectietransformatie". Hier zullen we alles uitleggen wat te maken heeft met coördinatentransformatie.
Linkshandige en rechtshandige coördinatensystemen
In 3D zijn er twee coördinatensystemen, het "linkshandige coördinatensysteem" en het "rechtse coördinatensysteem", die verschillende oriëntaties hebben voor elke coördinaat, zoals weergegeven in de onderstaande afbeelding.
Direct3D gebruikte voornamelijk een linkshandig coördinatensysteem, maar er zijn ook functies voor het berekenen van rechtshandige coördinatensystemen. XNA biedt echter alleen berekeningsmethoden voor rechtshandige coördinatensystemen. Dit lijkt in lijn te zijn met het feit dat andere toepassingen vaak rechtshandige coördinatensystemen gebruiken.
Alle XNA-tips op deze site maken gebruik van het rechtshandige coördinatensysteem.
Lokaal coördinatensysteem (modelcoördinatensysteem)
Elk model heeft een coördinatensysteem waarin de oorsprong centraal staat. Bij het maken van een model met modelleringssoftware denk ik dat het gemakkelijker te begrijpen is als je je voorstelt dat je het maakt met de oorsprong als middelpunt.
Wereld Coördinaten Systeem
Met het wereldcoördinatensysteem kunt u het model overal plaatsen. Als je niets doet in deze wereldtransformatie, wordt het model op dezelfde manier als de lokale coördinaten bij de oorsprong geplaatst. Plaatsing is niet alleen om van de oorsprong te gaan, maar ook om te roteren en te schalen.
Bekijk Coördinatensysteem
Zodra je het model op wereldcoördinaten hebt geplaatst, heb je informatie nodig over waar je naar kijkt en waar je naar de 3D-ruimte kijkt. Dit is wat we "view transformations" noemen. Weergavetransformaties worden over het algemeen vaak weergegeven als camera's.
De parameters die nodig zijn voor deze conversie zijn "camerapositie", "camera-aandachtspunt" en "opwaartse richting van de camera". De oriëntatie van de camera wordt bepaald door deze drie parameters. De onderstaande afbeelding toont de camera vanuit het perspectief van een derde partij.
De onderstaande figuur is eigenlijk gezien vanuit het oogpunt van de camera met de opstelling die wordt weergegeven in de bovenstaande afbeelding (op dit moment hebben we de coördinaten nog niet omgezet naar het scherm, dus het is slechts een afbeelding).
In de vorige uitleg lijkt het erop dat de camera is gepositioneerd en de coördinaten zijn getransformeerd, maar in de daadwerkelijke berekening worden de wereldcoördinaten omgezet volgens de positie en oriëntatie van de camera. Daarom is de oorsprong de positie van de camera zoals weergegeven in de onderstaande afbeelding.
Projectief coördinatensysteem
Als je eenmaal hebt besloten vanuit welke positie je de 3D-ruimte wilt bekijken, is de volgende stap het verwerken van de weergave van "kleine objecten die ver weg zijn" en "grote dingen die dichtbij zijn". Dit wordt een projectieve transformatie genoemd. Er zijn twee methoden voor projectietransformatie, "perspectiefprojectie" en "orthografische projectie", maar het veelgebruikte beeld van "perspectiefprojectie" is als volgt.
Perspectiefprojectie maakt gebruik van de volgende parameters: Kijkhoek, Beeldverhouding, Voorwaartse clippositie en Achterste clippositie. Het gebied met het label "frustum" in de bovenstaande afbeelding verschijnt eindelijk op het scherm.
"Kijkhoek" geeft het kijkbereik aan dat zichtbaar is vanaf de camera. Door de hoek te verkleinen, wordt ingezoomd, vergroot wordt uitgezoomd. De kijkhoek is de verticale waarde van het frustum.
Beeldverhouding wordt gebruikt om de horizontale beeldhoek te bepalen, terwijl de kijkhoek een verticale hoek is. De horizontale hoek wordt meestal bepaald door de "kijkhoek × beeldverhouding", en de beeldverhouding is in feite de waarde van de "breedte ÷ hoogte" van het scherm dat u probeert weer te geven. Als u deze waarde wijzigt, lijkt het weergegeven 3D-object horizontaal of verticaal uit te rekken.
De voorwaartse clippositie en de achterste clippositie worden opgegeven om te bepalen of het object aan de voor- of achterkant wordt weergegeven. Vanwege de aard van de computer is het niet mogelijk om tot oneindig weer te geven, dus stellen we een limiet in. Deze waarde is ook van invloed op de nauwkeurigheid van de Z-buffer, dus het wordt niet aanbevolen om deze op te nemen in het tekengebied buiten het bereik dat niet hoeft te worden weergegeven.
Het perspectivisch getransformeerde object wordt geconverteerd naar een ruimte zoals hieronder. Objecten die zich dicht bij de camera bevonden, worden ingezoomd en objecten die ver weg waren, worden verkleind.
Dit wordt geïllustreerd in een gemakkelijk te begrijpen diagram hieronder.
Als je het echt vanuit het oogpunt van de camera bekijkt, ziet het er als volgt uit.
Een andere methode van projectieve transformatie is orthografische projectie, waarbij een zichtbaar gebied zoals hieronder wordt geprojecteerd. Omdat de breedte en hoogte constant zijn, ongeacht de diepte, verandert de grootte van het object niet met de diepte.
Scherm Coördinaten Systeem
Na de projectietransformatie wordt deze omgezet naar de coördinaten van het werkelijke scherm. Ook al is het een scherm, de positie en het bereik van het scherm veranderen afhankelijk van de viewport-instellingen die op het apparaat zijn ingesteld. In het geval van games zijn de clientcoördinaten van het venster echter vaak de viewport zoals het is, dus ik denk niet dat je je al te veel zorgen hoeft te maken.
De coördinaten van het scherm (0, 0) worden omgerekend van de projectiecoördinaten (-1, 1, z). Op dezelfde manier worden de schermcoördinaten (breedte, hoogte) geconverteerd van de projectiecoördinaten (1, -1, z).