Om koordinattransformation af 3D-modeller
stof
Først og fremmest
Du kan ofte se 3D-billeder på tv-skærme og skærme i spil, men hvordan viser du objekter, der findes i 3D-rum, såsom karakterer og bygninger, der bevæger sig rundt på skærmen, på en 2D-skærm?
I 2D-spil er der kun todimensionelle elementer af "X og Y" som koordinatværdier, og displayet er også 2D, så hvis du tegner et objekt ved at angive koordinatpositionen for X og Y, vil du intuitivt forstå, hvordan det vil blive tegnet i hvilken position.
Men i 3D er det ikke så let. Som navnet antyder, er 3D "3 dimension" og har tre koordinatoplysninger: "X, Y og Z". Da koordinaterne er forskellige fra displayet, der er 2D, er det ikke muligt at tegne objektet, som det er.
Derefter, hvad man skal gøre, er at "konvertere tredimensionel information til todimensionel information". Dette omtales almindeligvis som en "koordinattransformation". Husk, at denne koordinattransformation er afgørende for 3D-programmering.
Der er flere typer koordinattransformationer til konvertering af 3D til 2D, men der er tre hovedtyper af koordinattransformationer, som programmører håndterer: "verdenstransformation", "visningstransformation" og "projektionstransformation". Her vil vi forklare alt relateret til koordinattransformation.
Venstrehåndede og højrehåndede koordinatsystemer
I 3D er der to koordinatsystemer, "venstrehåndskoordinatsystemet" og "højrehåndskoordinatsystemet", som har forskellige orienteringer for hver koordinat som vist i figuren nedenfor.
Direct3D brugte primært et venstrehåndskoordinatsystem, men der er også funktioner til beregning for højrehåndede koordinatsystemer. XNA leverer dog kun beregningsmetoder til højrehåndede koordinatsystemer. Dette ser ud til at være i overensstemmelse med, at andre applikationer ofte bruger højrehåndede koordinatsystemer.
Alle XNA-spidserne på denne side bruger det højrehåndede koordinatsystem.
Lokalt koordinatsystem (modelkoordinatsystem)
Hver model har et koordinatsystem centreret om origo. Når man laver en model med modelleringssoftware, tror jeg, det er lettere at forstå, hvis man forestiller sig at skabe den med oprindelsen som centrum.
Verdens koordinatsystem
Verdenskoordinatsystemet giver dig mulighed for at placere modellen hvor som helst. Hvis man ikke gør noget i denne verdenstransformation, vil modellen blive placeret ved udgangspunktet på samme måde som de lokale koordinater. Placering er ikke kun at bevæge sig fra oprindelsen, men også at rotere og skalere.
Se koordinatsystem
Når du har placeret modellen i verdenskoordinater, har du brug for information om, hvor du kigger, og hvor du kigger på 3D-rummet. Det er det, vi kalder "synstransformationer". Visningstransformationer er generelt ofte repræsenteret som kameraer.
De parametre, der kræves til denne konvertering, er "kameraposition", "kameraets interessepunkt" og "kameraets opadgående retning". Kameraets orientering bestemmes af disse tre parametre. Figuren nedenfor viser kameraet fra et tredjepartsperspektiv.
Figuren nedenfor ses faktisk fra kameraets synspunkt med det arrangement, der er vist i figuren ovenfor (på dette tidspunkt har vi endnu ikke konverteret koordinaterne til skærmen, så det er bare et billede).
I den foregående forklaring ser det ud til, at kameraet er placeret og koordinaterne transformeres, men i selve beregningen konverteres verdenskoordinaterne i henhold til kameraets position og orientering. Derfor er oprindelsen kameraets position som vist i figuren nedenfor.
Projektivt koordinatsystem
Når du har besluttet, fra hvilken position du vil se 3D-rummet, er næste trin at behandle visningen af "små objekter, der er langt væk" og "store ting, der er i nærheden". Dette kaldes en projektiv transformation. Der er to metoder til projektionstransformation, "perspektivprojektion" og "ortografisk projektion", men det almindeligt anvendte "perspektivprojektion"-billede er som følger.
Perspektivprojektion bruger følgende parametre: Betragtningsvinkel, Billedformat, Fremadrettet klipposition og Bageste klipposition. Området mærket "frustum" i figuren ovenfor vises endelig på skærmen.
"Synsvinkel" angiver det visningsområde, der er synligt fra kameraet. Hvis vinklen formindskes, zoomes den ind, og hvis den øges, zoomes den ud. Synsvinklen vil være den lodrette værdi af frustum.
Aspect Ratio bruges til at bestemme den vandrette synsvinkel, hvorimod synsvinklen er en lodret vinkel. Den vandrette vinkel bestemmes normalt af "betragtningsvinkel × billedformat", og billedformatet er dybest set værdien af "bredden ÷ højden" på den skærm, du forsøger at vise. Hvis du ændrer denne værdi, vil det viste 3D-objekt se ud til at strække sig vandret eller lodret.
Positionen for fremadrettet klip og bageste klipposition er angivet for at bestemme, om objektet vises i det forreste eller bageste område. På grund af computerens art er det ikke muligt at vise op til uendeligt, så vi sætter en grænse. Denne værdi påvirker også nøjagtigheden af Z-bufferen, så det anbefales ikke at inkludere den i tegningsområdet ud over det område, der ikke behøver at blive vist.
Det perspektivtransformerede objekt konverteres til et rum som det nedenfor. Objekter, der var tæt på kameraet, zoomes ind, og objekter, der var langt væk, skaleres ned.
Dette er illustreret i et letforståeligt diagram nedenfor.
Hvis du rent faktisk ser på det fra kameraets synspunkt, ser det ud som nedenfor.
En anden metode til projektiv transformation er ortografisk projektion, som projicerer et synligt område som det nedenfor. Da bredden og højden er konstante uanset dybden, ændres objektets størrelse ikke med dybden.
Skærmkoordinatsystem
Efter projektionstransformationen konverteres den til koordinaterne på den faktiske skærm. Selvom det er en skærm, ændres skærmens position og rækkevidde afhængigt af de viewport-indstillinger, der er indstillet på enheden. Men i tilfælde af spil er vinduets klientkoordinater ofte visningsporten, som den er, så jeg tror ikke, du behøver at bekymre dig for meget.
Skærmens koordinater (0, 0) konverteres fra projektionskoordinaterne (-1, 1, z). På samme måde konverteres skærmkoordinaterne (bredde, højde) fra projektionskoordinaterne (1, -1, z).