Apie koordinačių transformaciją 3D modeliuose
medžiaga
visų pirma
Dažnai galite matyti 3D vaizdus televizoriaus ekranuose ir ekranus žaidimuose, bet kaip 2D ekrane rodyti objektus, esančius 3D erdvėje, pvz., Personažus ir pastatus, judančius ekrane?
2D žaidimuose yra tik dvimačiai "X ir Y" elementai kaip koordinačių vertės, o ekranas taip pat yra 2D, todėl, jei piešiate objektą nurodydami X ir Y koordinačių padėtį, intuityviai suprasite, kaip jis bus nupieštas, kurioje padėtyje.
Tačiau 3D formatu tai nėra taip paprasta. Kaip rodo pavadinimas, 3D yra "3 dimensija" ir turi tris koordinačių informaciją: "X, Y ir Z". Kadangi koordinatės skiriasi nuo ekrano, kuris yra 2D, neįmanoma piešti objekto tokio, koks jis yra.
Tada, ką daryti, yra "konvertuoti trimatę informaciją į dvimatę informaciją". Tai paprastai vadinama "koordinačių transformacija". Atminkite, kad ši koordinačių transformacija yra būtina 3D programavimui.
Yra keletas koordinačių transformacijų tipų, skirtų konvertuoti 3D į 2D, tačiau yra trys pagrindiniai koordinačių transformacijų tipai, kuriuos programuotojai tvarko: "pasaulio transformacija", "peržiūros transformacija" ir "projekcijos transformacija". Čia paaiškinsime viską, kas susiję su koordinuota transformacija.
Kairiarankių ir dešiniarankių koordinačių sistemos
3D formatu yra dvi koordinačių sistemos: "kairiarankių koordinačių sistema" ir "dešinės pusės koordinačių sistema", kurios turi skirtingas orientacijas kiekvienai koordinatei, kaip parodyta paveikslėlyje žemiau.
"Direct3D" pirmiausia naudojo kairiarankių koordinačių sistemą, tačiau yra ir funkcijų, skirtų apskaičiuoti dešiniarankių koordinačių sistemas. Tačiau XNA pateikia tik dešinės pusės koordinačių sistemų skaičiavimo metodus. Atrodo, kad tai atitinka faktą, kad kitose programose dažnai naudojamos dešiniarankių koordinačių sistemos.
Visi XNA patarimai šioje svetainėje naudoja dešinės rankos koordinačių sistemą.
Vietinė koordinačių sistema (pavyzdinė koordinačių sistema)
Kiekvienas modelis turi koordinačių sistemą, orientuotą į kilmę. Kuriant modelį su modeliavimo programine įranga, manau, lengviau suprasti, jei įsivaizduojate, kad jį kuriate su kilme kaip centru.
Pasaulio koordinačių sistema
Pasaulio koordinačių sistema leidžia įdėti modelį bet kur. Jei nieko nedarysite šioje pasaulio transformacijoje, modelis bus dedamas į kilmę taip pat, kaip ir vietinės koordinatės. Vieta yra ne tik judėti nuo kilmės, bet ir pasukti bei keisti mastelį.
Peržiūrėti koordinačių sistemą
Įdėję modelį į pasaulio koordinates, jums reikia informacijos apie tai, kur ieškote ir kur žiūrite į 3D erdvę. Tai mes vadiname "peržiūrų transformacijomis". Vaizdo transformacijos paprastai dažnai pateikiamos kaip fotoaparatai.
Šiai konversijai reikalingi parametrai yra "kameros padėtis", "kameros lankytinas taškas" ir "fotoaparato kryptis aukštyn". Fotoaparato orientaciją lemia šie trys parametrai. Žemiau esančiame paveikslėlyje parodyta kamera iš trečiosios šalies perspektyvos.
Žemiau pateiktas paveikslas iš tikrųjų matomas fotoaparato požiūriu su išdėstymu, parodytu aukščiau esančiame paveikslėlyje (šiuo metu mes dar nekonvertavome koordinačių į ekraną, todėl tai tik vaizdas).
Ankstesniame paaiškinime atrodo, kad fotoaparatas yra išdėstytas ir koordinatės transformuojamos, tačiau faktiniame skaičiavime pasaulio koordinatės konvertuojamos pagal fotoaparato padėtį ir orientaciją. Todėl kilmė yra fotoaparato padėtis, kaip parodyta paveikslėlyje žemiau.
Projekcinė koordinačių sistema
Kai nuspręsite, iš kurios pozicijos peržiūrėti 3D erdvę, kitas žingsnis yra apdoroti "mažų objektų, kurie yra toli" ir "didelių dalykų, kurie yra netoliese", rodymą. Tai vadinama projektine transformacija. Yra du projekcijos transformacijos metodai: "perspektyvinė projekcija" ir "ortografinė projekcija", tačiau dažniausiai naudojamas "perspektyvinės projekcijos" vaizdas yra toks.
Perspektyvinėje projekcijoje naudojami šie parametrai: žiūrėjimo kampas, kraštinių santykis, priekinė spaustuko padėtis ir galinio spaustuko padėtis. Sritis, aukščiau esančiame paveikslėlyje pažymėta "frustum", pagaliau pasirodys ekrane.
"Žiūrėjimo kampas" nurodo iš fotoaparato matomą žiūrėjimo diapazoną. Sumažinus kampą, priartinamas, padidinamas tolinimas. Žiūrėjimo kampas bus vertikali frustumo vertė.
Vaizdo santykis naudojamas horizontaliam matymo kampui nustatyti, o žiūrėjimo kampas yra vertikalus. Horizontalųjį kampą paprastai lemia "žiūrėjimo kampas × kraštinių santykis", o kraštinių santykis iš esmės yra ekrano, kurį bandote rodyti, "pločio ÷ aukščio" vertė. Jei pakeisite šią reikšmę, rodomas 3D objektas bus ištemptas horizontaliai arba vertikaliai.
Priekinės spaustuko padėtis ir galinio spaustuko padėtis yra nurodytos siekiant nustatyti, ar objektas rodomas priekyje, ar gale. Dėl kompiuterio pobūdžio neįmanoma rodyti iki begalybės, todėl nustatysime ribą. Ši vertė taip pat turi įtakos Z buferio tikslumui, todėl nerekomenduojama jo įtraukti į piešimo sritį už diapazono, kurio nereikia rodyti.
Perspektyvoje transformuotas objektas konvertuojamas į erdvę, panašią į žemiau esančią. Objektai, kurie buvo arti fotoaparato, priartinami, o toli buvę objektai sumažinami.
Tai parodyta toliau pateiktoje lengvai suprantamoje diagramoje.
Jei iš tikrųjų pažvelgsite į jį iš fotoaparato perspektyvos, jis atrodo taip, kaip nurodyta toliau.
Kitas projektinės transformacijos metodas yra ortografinė projekcija, kuri projektuoja matomą sritį, tokią kaip žemiau. Kadangi plotis ir aukštis yra pastovūs, nepriklausomai nuo gylio, objekto dydis nesikeičia su gyliu.
Ekrano koordinačių sistema
Po projekcijos transformacijos jis konvertuojamas į faktinio ekrano koordinates. Nors tai yra ekranas, ekrano padėtis ir diapazonas keičiasi priklausomai nuo įrenginyje nustatytų peržiūros srities nustatymų. Tačiau žaidimų atveju kliento lango koordinatės dažnai yra peržiūros sritis, kokia ji yra, todėl nemanau, kad jums reikia per daug nerimauti.
Ekrano koordinatės (0, 0) konvertuojamos iš projekcijos koordinačių (-1, 1, z). Panašiai ekrano koordinatės (plotis, aukštis) konvertuojamos iš projekcijos koordinačių (1, -1 ,z).