Par 3D modeļu koordinātu transformāciju
viela
vispirms
Var bieži redzēt 3D attēlus TV ekrānos un displejos spēlēs, bet kā 2D ekrānā parādīt objektus, kas pastāv 3D telpā, piemēram, rakstzīmes un ēkas, kas pārvietojas ekrānā?
2D spēlēs ir tikai divdimensiju "X un Y" elementi kā koordinātu vērtības, un displejs ir arī 2D, tādēļ, ja jūs zīmējat objektu, norādot X un Y koordinātu pozīciju, jūs intuitīvi sapratīsit, kā tas tiks uzzīmēts kurā pozīcijā.
Tomēr 3D formātā tas nav tik vienkārši. Kā norāda nosaukums, 3D ir "3 dimensijas", un tam ir trīs koordinātu informācija: "X, Y un Z". Tā kā koordinātas atšķiras no displeja, kas ir 2D, objektu nav iespējams uzzīmēt tādu, kāds tas ir.
Tad tas, ko darīt, ir "pārveidot trīsdimensiju informāciju divdimensiju informācijā". To parasti dēvē par "koordinātu transformāciju". Paturiet prātā, ka šī koordinātu transformācija ir būtiska 3D programmēšanai.
3D konvertēšanai uz 2D ir vairāki koordinātu transformāciju veidi, taču ir trīs galvenie koordinātu transformāciju veidi, kurus apstrādā programmētāji: "pasaules transformācija", "skata transformācija" un "projekcijas transformācija". Šeit mēs izskaidrosim visu, kas saistīts ar koordinātu transformāciju.
Kreisās un labās puses koordinātu sistēmas
3D ir divas koordinātu sistēmas, "kreisās puses koordinātu sistēma" un "labās puses koordinātu sistēma", kurām katrai koordinātai ir atšķirīgas orientācijas, kā parādīts zemāk redzamajā attēlā.
Direct3D galvenokārt izmantoja kreisās puses koordinātu sistēmu, bet ir arī funkcijas labās puses koordinātu sistēmu aprēķināšanai. Tomēr XNA nodrošina tikai aprēķina metodes labās puses koordinātu sistēmām. Tas, šķiet, atbilst faktam, ka citās lietojumprogrammās bieži tiek izmantotas labās puses koordinātu sistēmas.
Visi XNA padomi šajā vietnē izmanto labās puses koordinātu sistēmu.
Lokālā koordinātu sistēma (modeļa koordinātu sistēma)
Katram modelim ir koordinātu sistēma, kuras centrā ir izcelsme. Veidojot modeli ar modelēšanas programmatūru, es domāju, ka to ir vieglāk saprast, ja iedomājaties to izveidot ar izcelsmi kā centru.
Pasaules koordinātu sistēma
Pasaules koordinātu sistēma ļauj novietot modeli jebkurā vietā. Ja jūs neko nedarīsiet šajā pasaules transformācijā, modelis tiks novietots sākumā tāpat kā vietējās koordinātas. Izvietojums ir ne tikai pārvietoties no sākuma, bet arī pagriezt un mērogot.
Skatīt koordinātu sistēmu
Kad esat ievietojis modeli pasaules koordinātās, jums ir nepieciešama informācija par to, kur meklējat un kur skatāties 3D telpā. To mēs saucam par "skatu transformācijām". Skata transformācijas parasti tiek attēlotas kā kameras.
Šai konvertēšanai nepieciešamie parametri ir "kameras pozīcija", "kameras interešu punkts" un "kameras augšupvērstais virziens". Kameras orientāciju nosaka šie trīs parametri. Zemāk redzamajā attēlā ir parādīta kamera no trešās puses perspektīvas.
Zemāk redzamais attēls faktiski ir redzams no kameras viedokļa ar izkārtojumu, kas parādīts iepriekš redzamajā attēlā (šajā brīdī mēs vēl neesam pārveidojuši koordinātas uz ekrānu, tāpēc tas ir tikai attēls).
Iepriekšējā skaidrojumā šķiet, ka kamera ir novietota un koordinātas tiek pārveidotas, bet faktiskajā aprēķinā pasaules koordinātas tiek pārveidotas atbilstoši kameras novietojumam un orientācijai. Tāpēc izcelsme ir kameras novietojums, kā parādīts attēlā zemāk.
Projektīvā koordinātu sistēma
Kad esat izlēmis, no kuras pozīcijas apskatīt 3D telpu, nākamais solis ir apstrādāt "mazu objektu, kas atrodas tālu" un "lielu lietu, kas atrodas tuvumā", parādīšanu. To sauc par projektīvo transformāciju. Ir divas projekcijas transformācijas metodes: "perspektīvas projekcija" un "ortogrāfiskā projekcija", bet parasti izmantotais "perspektīvas projekcijas" attēls ir šāds.
Perspektīvas projekcijā tiek izmantoti šādi parametri: skata leņķis, malu attiecība, klipa pozīcija uz priekšu un aizmugurējā klipa pozīcija. Apgabals, kas iepriekš redzamajā attēlā apzīmēts ar "frustum", beidzot parādīsies ekrānā.
"Skata leņķis" norāda no kameras redzamo skata diapazonu. Samazinot leņķi, tas tiek tuvināts, palielinot to, tas tiek tuvināts. Skata leņķis būs frustum vertikālā vērtība.
Malu attiecība tiek izmantota, lai noteiktu horizontālo skata leņķi, savukārt skata leņķis ir vertikāls leņķis. Horizontālo leņķi parasti nosaka "skata leņķis × malu attiecība", un malu attiecība būtībā ir tā ekrāna "platuma ÷ augstuma" vērtība, kuru mēģināt parādīt. Ja maināt šo vērtību, parādītais 3D objekts izstiepsies horizontāli vai vertikāli.
Ir norādīta priekšgala klipa pozīcija un aizmugurējā klipa pozīcija, lai noteiktu, vai objekts tiek rādīts priekšējā vai aizmugurējā diapazonā. Datora rakstura dēļ nav iespējams parādīt līdz bezgalībai, tāpēc mēs noteiksim ierobežojumu. Šī vērtība ietekmē arī Z-bufera precizitāti, tāpēc nav ieteicams to iekļaut zīmēšanas laukumā ārpus diapazona, kas nav jāparāda.
Perspektīvas pārveidotais objekts tiek pārveidots par tādu telpu kā zemāk esošā. Objekti, kas atradās tuvu kamerai, tiek tuvināti, un objekti, kas atradās tālu, tiek samazināti.
Tas ir parādīts zemāk redzamajā viegli saprotamā diagrammā.
Ja jūs faktiski skatāties uz to no kameras viedokļa, tas izskatās šādi.
Vēl viena projektīvās transformācijas metode ir ortogrāfiskā projekcija, kas projicē redzamu zonu, piemēram, zemāk redzamo. Tā kā platums un augstums ir nemainīgi neatkarīgi no dziļuma, objekta lielums nemainās līdz ar dziļumu.
Ekrāna koordinātu sistēma
Pēc projekcijas pārveidošanas tas tiek pārveidots par faktiskā ekrāna koordinātām. Lai gan tas ir ekrāns, displeja novietojums un diapazons mainās atkarībā no ierīcē iestatītajiem skatloga iestatījumiem. Tomēr spēļu gadījumā loga klienta koordinātas bieži vien ir skatu laukums, kā tas ir, tāpēc es nedomāju, ka jums ir jāuztraucas pārāk daudz.
Ekrāna koordinātas (0, 0) tiek konvertētas no projekcijas koordinātām (-1, 1, z). Līdzīgi ekrāna koordinātas (platums, augstums) tiek pārveidotas no projekcijas koordinātām (1, -1 ,z).