Om koordinattransformation av 3D-modeller
substans
Först av allt
Du kanske ofta ser 3D-bilder på TV-skärmar och skärmar i spel, men hur visar du objekt som finns i 3D-rymden, till exempel karaktärer och byggnader som rör sig på skärmen, på en 2D-skärm?
I 2D-spel finns det bara tvådimensionella element av "X och Y" som koordinatvärden, och displayen är också 2D, så om du ritar ett objekt genom att ange koordinatpositionen för X och Y kommer du intuitivt att förstå hur det kommer att ritas vid vilken position.
Men i 3D är det inte så lätt. Som namnet antyder är 3D "3 dimension" och har tre koordinatinformation: "X, Y och Z". Eftersom koordinaterna skiljer sig från visningen som är 2D är det inte möjligt att rita objektet som det är.
Vad man sedan ska göra är att "omvandla tredimensionell information till tvådimensionell information". Detta kallas ofta för en "koordinattransformering". Tänk på att den här koordinatomvandlingen är viktig för 3D-programmering.
Det finns flera typer av koordinattransformationer för att konvertera 3D till 2D, men det finns tre huvudtyper av koordinattransformationer som programmerare hanterar: "world transformation", "view transformation" och "projection transformation". Här kommer vi att förklara allt som rör koordinattransformation.
Vänster- och högerhänta koordinatsystem
I 3D finns det två koordinatsystem, det "vänsterhänta koordinatsystemet" och det "högra koordinatsystemet", som har olika orienteringar för varje koordinat som visas i figuren nedan.
Direct3D använde sig i första hand av ett vänsterhänt koordinatsystem, men det finns även funktioner för beräkning för högerhänta koordinatsystem. XNA tillhandahåller dock endast beräkningsmetoder för högerhänta koordinatsystem. Detta verkar vara i linje med det faktum att andra applikationer ofta använder högerhänta koordinatsystem.
Alla XNA-tips på den här webbplatsen använder det högerhänta koordinatsystemet.
Lokalt koordinatsystem (modell koordinatsystem)
Varje modell har ett koordinatsystem centrerat på origo. När man skapar en modell med modelleringsprogram tror jag att det är lättare att förstå om man föreställer sig att man skapar den med ursprunget som centrum.
Världens koordinatsystem
Världskoordinatsystemet gör att du kan placera modellen var som helst. Om du inte gör något i denna världsomvandling kommer modellen att placeras vid origo på samma sätt som de lokala koordinaterna. Placering är inte bara att flytta från origo, utan också att rotera och skala.
Visa koordinatsystem
När du har placerat modellen i världskoordinater behöver du information om var du tittar och var du tittar i 3D-rymden. Detta är vad vi kallar "vytransformationer". Vytransformeringar representeras vanligtvis ofta som kameror.
Parametrarna som krävs för denna omvandling är "kameraposition", "kamerapunkt av intresse" och "kamera uppåtgående". Kamerans orientering bestäms av dessa tre parametrar. Bilden nedan visar kameran från ett tredjepartsperspektiv.
Figuren nedan ses faktiskt från kamerans synvinkel med arrangemanget som visas i figuren ovan (vid denna tidpunkt har vi ännu inte konverterat koordinaterna till skärmen, så det är bara en bild).
I den tidigare förklaringen verkar det som att kameran är placerad och koordinaterna transformeras, men i själva beräkningen konverteras världskoordinaterna enligt kamerans position och orientering. Därför är ursprunget kamerans position som visas i figuren nedan.
Projektivt koordinatsystem
När du har bestämt dig från vilken position du ska titta på 3D-rymden är nästa steg att bearbeta visningen av "små föremål som är långt borta" och "stora saker som är i närheten". Detta kallas för en projektiv transformation. Det finns två metoder för projektionstransformation, "perspektivprojektion" och "ortografisk projektion", men den vanliga bilden av "perspektivprojektion" är som följer.
Perspektivprojektion använder följande parametrar: Betraktningsvinkel, Bildförhållande, Klippposition framåt och Bakre klippposition. Området märkt "frustum" i figuren ovan kommer äntligen att visas på skärmen.
"Betraktningsvinkel" anger det betraktningsområde som är synligt från kameran. Om du minskar zoomar vinkeln in, ökar du zoomar ut. Betraktningsvinkeln kommer att vara det vertikala värdet för frustum.
Bildförhållande används för att bestämma den horisontella synvinkeln, medan betraktningsvinkeln är en vertikal vinkel. Den horisontella vinkeln bestäms vanligtvis av "betraktningsvinkeln × bildförhållandet", och bildförhållandet är i princip värdet på "bredden ÷ höjden" på skärmen du försöker visa. Om du ändrar det här värdet kommer det visade 3D-objektet att sträcka ut sig horisontellt eller vertikalt.
Position för klipp framåt och position för bakre klipp anges för att avgöra om objektet ska visas i det främre eller bakre intervallet. På grund av datorns beskaffenhet är det inte möjligt att visa upp till oändligheten, så vi kommer att sätta en gräns. Detta värde påverkar också noggrannheten hos Z-bufferten, så det rekommenderas inte att inkludera den i ritningsområdet utanför det område som inte behöver visas.
Det perspektivomformade objektet konverteras till ett utrymme som det nedan. Objekt som var nära kameran zoomas in och objekt som var långt borta skalas ned.
Detta illustreras i ett lättförståeligt diagram nedan.
Om du faktiskt tittar på det från kamerans synvinkel ser det ut som nedan.
En annan metod för projektiv transformation är ortografisk projektion, som projicerar ett synligt område som det nedan. Eftersom bredden och höjden är konstanta oavsett djup, ändras inte objektets storlek med djupet.
Skärmens koordinatsystem
Efter projektionstransformationen konverteras den till koordinaterna för den faktiska skärmen. Även om det är en skärm ändras skärmens position och räckvidd beroende på vilka visningsportinställningar som är inställda på enheten. Men när det gäller spel är klientkoordinaterna för fönstret ofta visningsområdet som det är, så jag tror inte att du behöver oroa dig för mycket.
Skärmens koordinater (0, 0) konverteras från projektionskoordinaterna (-1, 1, z). På samma sätt konverteras skärmens koordinater (bredd, höjd) från projektionskoordinaterna (1, -1, z).