Perspektyvinės projekcijos matrica. Grafikos API perspektyvinės matricos arba velnias slypi detalėse

Paskutinėje paskaitoje kalbėjome apie svarbiausias afininėje geometrijoje naudojamas projekcijas. Dabar pereikime prie perspektyvinės geometrijos ir kelių naujų projekcijų tipų.

Nuotraukose, paveiksluose, ekranuose vaizdai mums atrodo natūralūs ir teisingi. Šie vaizdai vadinami perspektyva. Jų savybės yra tokios, kad tolimesni objektai vaizduojami mažesniu masteliu, lygiagrečiomis linijomis bendras atvejis nėra lygiagrečios. Dėl to vaizdo geometrija pasirodo gana sudėtinga, o iš baigto vaizdo sunku nustatyti tam tikrų objekto dalių dydį.

Įprasta perspektyvinė projekcija yra centrinė projekcija į plokštumą, kurios tiesūs spinduliai eina per tašką, projekcijos centrą. Vienas iš projektuojančių spindulių yra statmenas projekcijos plokštumai ir vadinamas pagrindiniu. Šio spindulio ir projekcijos plokštumos susikirtimo taškas yra pagrindinis paveikslo taškas.

Yra trys koordinačių sistemos. Paprastai programuotojas dirba ir saugo duomenis apie geometrinius objektus pasaulio koordinatėse. Siekiant padidinti tikroviškumą, ruošiantis rodyti vaizdą ekrane, duomenys apie objektus iš pasaulio koordinačių konvertuojami į peržiūros koordinates. Ir tik tuo metu, kai vaizdas rodomas tiesiai ekrano ekrane, jie pereina į ekrano koordinates, kurios yra ekrano pikselių skaičiai.

Pirmosios dvi sistemos gali būti naudojamos daugiamatėse koordinačių sistemose, tačiau pastarosios tik dvimatėse. Operacijos yra negrįžtamos, tai yra, neįmanoma atkurti trimačio vaizdo iš dvimačio projekcijos vaizdo.

Bendrosios perspektyvos transformacijos matrica

Šioje matricoje elementai a, d, e yra atsakingi už mastelio keitimą, m, n, L dėl poslinkio, p, q, r projekcijai, s visapusiškam mastelio keitimui, X sukimuisi.

Tam tikru momentu bet kuriam kompiuterinės grafikos kūrėjui kyla klausimas: kaip veikia šios perspektyvios matricos? Kartais labai sunku rasti atsakymą ir, kaip dažniausiai nutinka, dauguma kūrėjų pasiduoda įpusėjus užduočiai.

Tai nėra problemos sprendimas! Išsiaiškinkime tai kartu!

Būkime realistai su praktiniu šališkumu ir imkime testą OpenGL versijos 3.3. Nuo šios versijos kiekvienas kūrėjas privalo savarankiškai įdiegti modulį matricos operacijos. Puiku, štai ko mums reikia. Išskaidykime savo sudėtingą užduotį ir pabrėžkime pagrindinius dalykus. Kai kurie faktai iš OpenGL specifikacijos:

  • Matricos saugomos stulpeliuose (stulpelis-major);
  • Homogeninės koordinatės;
  • Kanoninis iškirpimo tūris (CVV) kairiarankėje koordinačių sistemoje.
Yra du būdai saugoti matricas: pagrindinė stulpelio dalis ir pagrindinė eilutė. Paskaitose apie tiesinė algebra naudojama pagrindinės eilutės schema. Autorius iš esmės Matricų atvaizdavimas atmintyje neturi reikšmės, nes matricą visada galima konvertuoti iš vieno atvaizdo į kitą paprastu perkėlimu. Ir kadangi nėra jokio skirtumo, visiems tolesniems skaičiavimams naudosime klasikines eilučių pagrindines matricas. Programuojant OpenGL yra nedidelė gudrybė, leidžianti išvengti matricų perkėlimo išlaikant klasikinius eilučių pagrindinius skaičiavimus. Matrica turi būti perkelta į atspalvio programą tokią, kokia yra, o atspalvyje daugyba turėtų būti atliekama ne tarp vektoriaus ir matricos, o tarp matricos ir vektoriaus.

Vienarūšės koordinatės nėra labai sudėtinga sistema su daugybe paprastos taisyklės konvertuojant įprastas Dekarto koordinates į vienarūšės koordinatės ir atgal. Vienalytė koordinatė yra matmenų eilutės matrica. Norint paversti Dekarto koordinatę į vienalytę koordinatę, būtina x, y Ir z padauginti iš bet kurio tikras numeris w(išskyrus 0). Tada turite įrašyti rezultatą pirmuosiuose trijuose komponentuose, o paskutinis komponentas bus lygus daugikliui w. Kitaip tariant:
- Dekarto koordinatės
w– realusis skaičius nelygus 0

- vienarūšės koordinatės

Maža gudrybė: jei w lygus vienetui, tada vertimui tereikia perkelti komponentus x, y Ir z ir priskirkite vieną paskutiniam komponentui. Tai yra, gaukite eilutės matricą:

Keletas žodžių apie nulinę kokybę w. Vienalyčių koordinačių požiūriu tai yra gana priimtina. Homogeninės koordinatės leidžia atskirti taškus ir vektorius. Dekarto koordinačių sistemoje toks padalijimas neįmanomas.

- taškas kur ( x, y, z) – Dekarto koordinatės

- vektorius, kur ( x, y, z) – spindulio vektorius

Viršūnės atvirkštinis vertimas iš homogeninių koordinačių į Dekarto koordinates atliekamas taip. Visi eilutės matricos komponentai turi būti padalyti iš paskutinio komponento. Kitaip tariant:

- vienarūšės koordinatės
- Dekarto koordinatės

Svarbiausia žinoti, kad visi OpenGL karpymo ir rastravimo algoritmai veikia Dekarto koordinatėmis, bet prieš tai visos transformacijos atliekamos vienarūšėmis koordinatėmis. Perėjimas nuo vienalyčių koordinačių prie Dekarto koordinačių atliekamas techninėje įrangoje.

Kanoninis iškarpų tūris (CVV) yra viena mažiausiai dokumentuotų OpenGL dalių. Kaip matyti iš fig. 1 CVV yra ašies išlygiuotas kubas, kurio centras yra pradžioje ir kurio briaunos ilgis lygus dviem. Viskas, kas patenka į CVV sritį, yra rastruojama, viskas, kas yra už CVV, yra ignoruojama. Viskam, kas iš dalies nepatenka į CVV, taikomi genėjimo algoritmai. Svarbiausias dalykas, kurį reikia žinoti, yra tai, kad CVV koordinačių sistema yra kairiarankė!


Ryžiai. 1. Kanoninis OpenGL iškarpų tūris (CVV)

Kairiarankė koordinačių sistema? Kaip tai gali būti, nes OpenGL 1.0 specifikacijoje aiškiai nurodyta, kad naudojama dešiniarankė koordinačių sistema? Išsiaiškinkime.


Ryžiai. 2. Koordinačių sistemos

Kaip matyti iš fig. 2 koordinačių sistemos skiriasi tik ašies kryptimi Z. „OpenGL 1.0“ naudoja dešiniarankio vartotojo koordinačių sistemą. Tačiau CVV koordinačių sistema ir vartotojo koordinačių sistema yra du visiškai skirtingi dalykai. Be to, nuo 3.3 versijos nebėra tokio dalyko kaip standartinė sistema OpenGL koordinatės. Kaip minėta anksčiau, pats programuotojas diegia matricos operacijų modulį. Sukimosi matricų formavimas, projekcinių matricų formavimas, atvirkštinės matricos paieška, matricos daugyba minimalus rinkinys operacijos, įtrauktos į matricos operacijų modulį. Kyla du logiški klausimai. Jei matomumo tūris yra kubas, kurio briaunos ilgis lygus dviem, tai kodėl ekrane matoma kelių tūkstančių vienetų dydžio scena? Kuriame taške vartotojo koordinačių sistema konvertuojama į CVV koordinačių sistemą? Projekcinės matricos yra būtent tas dalykas, kuris sprendžia šiuos klausimus.

Pagrindinė to, kas pasakyta, mintis yra ta, kad pats kūrėjas gali laisvai pasirinkti vartotojo koordinačių sistemos tipą ir turi teisingai aprašyti projekcijų matricas. Tai užbaigia faktus apie OpenGL ir laikas viską sujungti.

Viena iš labiausiai paplitusių ir sunkiausiai suprantamų matricų yra perspektyvinės transformacijos matrica. Taigi kaip tai susiję su CVV ir vartotojo koordinačių sistema? Kodėl objektai mažėja, kai jų atstumas nuo stebėtojo didėja? Norėdami suprasti, kodėl objektai mažėja didėjant atstumui, pažvelkime į matricos transformacijas trimatis modelisžingsnis po žingsnio. Ne paslaptis, kad bet kurį trimatį modelį sudaro baigtinis viršūnių sąrašas, kurios visiškai nepriklausomai viena nuo kitos yra transformuojamos. Norėdami nustatyti trimatės viršūnės koordinatę dvimačio monitoriaus ekrane, turite:

  1. Konvertuoti Dekarto koordinatę į vienalytę koordinatę;
  2. Padauginkite homogeninę koordinatę iš modelio matricos;
  3. Rezultatas padauginamas iš peržiūros matricos;
  4. Gautą rezultatą padauginkite iš projekcijos matricos;
  5. Konvertuokite rezultatą iš homogeninių koordinačių į Dekarto koordinates.
Dekarto koordinačių konvertavimas į vienarūšes koordinates buvo aptartas anksčiau. Geometrinė reikšmė modelio matrica yra perkelti modelį iš vietinės koordinačių sistemos į pasaulinę koordinačių sistemą. Arba, kaip sakoma, perkelkite viršūnes iš modelio erdvės į pasaulio erdvę. Paprasčiau tariant, trimatis objektas, įkeltas iš failo, yra modelio erdvėje, kur matuojamos koordinatės paties objekto atžvilgiu. Toliau, naudojant modelio matricą, modelis išdėstomas, keičiamas mastelis ir pasukamas. Dėl to visos 3D modelio viršūnės gauna faktines vienarūšes koordinates 3D scenoje. Modelinė erdvė pasaulio erdvės atžvilgiu yra lokali. Iš modelio erdvės koordinatės perkeliamos į pasaulio erdvę (iš lokalios į globalią). Šiuo tikslu naudojama modelio matrica.

Dabar pereikime prie trečio žingsnio. Čia atsiranda vaizdo erdvė. Šioje erdvėje koordinatės matuojamos atsižvelgiant į stebėtojo padėtį ir orientaciją, tarsi jis būtų pasaulio centras. Vaizdo erdvė yra lokali pasaulio erdvės atžvilgiu, todėl koordinates reikia įvesti į ją (o ne išimti, kaip ankstesniu atveju). Tiesioginis matricos transformacija pašalina koordinates iš tam tikros vietos. Norint, priešingai, juos įvesti į ją, reikia invertuoti matricos transformaciją, todėl tipo transformacija aprašoma atvirkštine matrica. Kaip tai gauti atvirkštinė matrica? Pirma, gaukime tiesioginio stebėtojo matricą. Kas būdinga stebėtojui? Stebėtojas apibūdinamas koordinatėmis, kuriose jis yra, ir žiūrėjimo krypties vektoriais. Stebėtojas visada žiūri savo lokalios ašies kryptimi Z. Stebėtojas gali judėti scenoje ir suktis. Daugeliu atžvilgių tai primena modelio matricos reikšmę. Apskritai, taip yra. Tačiau stebėtojui mastelio keitimo operacija yra beprasmė, todėl tarp stebėtojo modelio matricos ir modelio matricos trimatis objektas Negalite dėti lygybės ženklo. Stebėtojo modelio matrica yra norima tiesioginė matrica. Invertuodami šią matricą, gauname vaizdo matricą. Praktiškai tai reiškia, kad visos globalių vienarūšių koordinačių viršūnės gaus naujas vienarūšes koordinates stebėtojo atžvilgiu. Atitinkamai, jei stebėtojas matė tam tikrą viršūnę, tada vienalytės koordinatės reikšmė z tam tikros viršūnės vaizdo erdvėje tikrai bus teigiamas skaičius. Jei viršūnė buvo už stebėtojo, tada jos vienalytės koordinatės reikšmė z erdvėje tikrai bus neigiamas skaičius.

Ketvirtas žingsnis yra labiausiai įdomus žingsnis. Ankstesni veiksmai buvo taip išsamiai aptarti sąmoningai, kad skaitytojas turėtų pilnas vaizdas apie visus ketvirtojo žingsnio operandus. Ketvirtajame žingsnyje vienarūšės koordinatės perkeliamos iš peržiūros erdvės į CVV erdvę. Dar kartą pabrėžiamas faktas, kad visos potencialiai matomos viršūnės turės teigiamą vienalytės koordinatės reikšmę z.

Apsvarstykite formos matricą:

Ir nurodykite vienalytė erdvė stebėtojas:

Padauginkime homogeninę koordinatę iš nagrinėjamos matricos:

Paverskime gautas vienarūšes koordinates į Dekarto koordinates:

Tarkime, kad erdvėje yra du taškai su tomis pačiomis koordinatėmis x Ir y, bet su skirtingomis koordinatėmis z. Kitaip tariant, vienas iš taškų atsilieka nuo kito. Dėl perspektyvos iškraipymo stebėtojas turi matyti abu taškus. Iš tikrųjų iš formulės aišku, kad dėl padalijimo iš koordinatės z, suspaudimas įvyksta iki pradžios taško. Kaip daugiau vertės z(kuo toliau taškas yra nuo stebėtojo), tuo stipresnis suspaudimas. Tai yra perspektyvinio efekto paaiškinimas.

OpenGL specifikacija teigia, kad karpymo ir rastravimo operacijos atliekamos Dekarto koordinatėmis, o vienarūšių koordinačių konvertavimo į Dekarto koordinates procesas atliekamas automatiškai.

Matrica (1) yra perspektyvinės projekcijos matricos šablonas. Kaip minėta anksčiau, projekcijos matricos užduotis susideda iš dviejų taškų: vartotojo koordinačių sistemos nustatymo (kairiarankių arba dešiniarankių), stebėtojo matomumo apimties perkėlimo į CVV. Išveskime kairiarankio vartotojo koordinačių sistemos perspektyvinę matricą.

Projekcijos matricą galima apibūdinti naudojant keturis parametrus (3 pav.):

  • Žiūrėjimo kampas radianais ( fovy);
  • Krašto santykis ( aspektas);
  • Atstumas iki artimiausios kirpimo plokštumos ( n);
  • Atstumas iki tolimosios kirpimo plokštumos ( f).


Ryžiai. 3. Perspektyvinis matomumo tūris

Panagrinėkime taško projekciją stebėtojo erdvėje į priekinį perspektyvinio matomumo tūrio ribą. Siekiant didesnio aiškumo, pav. 4 parodytas vaizdas iš šono. Taip pat reikia atsižvelgti į tai, kad vartotojo koordinačių sistema sutampa su CVV koordinačių sistema, tai yra, visur naudojama kairioji koordinačių sistema.


Ryžiai. 4. Projekcija savavališkas taškas

Remiantis savybėmis panašūs trikampiai galioja šios lygybės:

Išreikškime yꞌ ir xꞌ:

Iš esmės projekcijų taškų koordinatėms gauti pakanka išraiškų (2). Tačiau norint tinkamai ekranuoti trimačius objektus, reikia žinoti kiekvieno fragmento gylį. Kitaip tariant, būtina išsaugoti komponento vertę z. Tai vertė, naudojama OpenGL gylio testams. Fig. 3 aišku, kad vertė zꞌ netinka kaip fragmento gylis, nes gali visos taško projekcijos ta pati vertė zꞌ. Išeitis iš šios situacijos – pasitelkti vadinamąjį pseudogylį.

Pseudo-gylio savybės:

  1. Pseudogylis apskaičiuojamas pagal vertę z;
  2. Kuo taškas arčiau stebėtojo, tuo pseudodeptas turi mažesnę vertę;
  3. Visų taškų, esančių priekinėje matomumo tūrio plokštumoje, pseudogylio reikšmė yra -1;
  4. Visų taškų, esančių tolimojoje matomumo tūrio pjovimo plokštumoje, pseudogylio reikšmė yra 1;
  5. Visų matomumo tūrio viduje esančių fragmentų pseudogylio reikšmė yra intervale [-1 1].
Išveskime formulę, pagal kurią bus skaičiuojamas pseudogylis. Paimkime šią išraišką kaip pagrindą:

Šansai a Ir b reikia paskaičiuoti. Tam pasitelkiame 3 ir 4 pseudogylių savybes. Gauname dviejų lygčių su dviem nežinomaisiais sistemą:

Sudėkime abi sistemos dalis ir gautą rezultatą padauginkime iš sandaugos fn, kuriame f Ir n negali būti lygus nuliui. Mes gauname:

Atidarykime skliaustus ir perdėkime terminus taip, kad tik dalis su A, o dešinėje tik su b:

Pakeiskime (6) į (5). Paverskime išraišką į paprastą trupmeną:

Padauginkite abi puses iš -2fn, kuriame f Ir n negali būti lygus nuliui. Pateikime panašius, pertvarkykime terminus ir išreikškime b:

Pakeiskime (7) į (6) ir išreikškime a:

Atitinkamai komponentai a Ir b yra lygūs:

Dabar pakeiskime gautus koeficientus į ruošinio matricą (1) ir pažiūrėkime, kas atsitiks su koordinate z savavališkam taškui stebėtojo vienalytėje erdvėje. Pakeitimas atliekamas taip:

Tegul atstumas iki priekinės pjovimo plokštumos n yra lygus 2, o atstumas iki tolimosios kirpimo plokštumos f lygus 10. Apsvarstykite penkis taškus stebėtojo vienalytėje erdvėje:

Abipusis susitarimas matomumo taškai ir apimtis
Taškas Reikšmė apibūdinimas
1 1 Taškas yra priešais matomumo apimties priekinę pjovimo plokštumą. Nepraleidžia rastrizacijos.
2 2 Taškas yra matomumo garsumo ribos priekiniame krašte. Vykdoma rastracija.
3 5 Taškas yra tarp priekinio kirpimo krašto ir tolimojo matomumo apimties nukirpimo krašto. Vykdoma rastracija.
4 10 Taškas yra tolimajame matomumo garsumo ribos krašte. Vykdoma rastracija.
5 20 Taškas yra už tolimojo matomumo garsumo ribos krašto. Nepraleidžia rastrizacijos.

Padauginkime visus taškus iš matricos (8), o gautas vienarūšes koordinates paverskime į Dekarto koordinatės . Norėdami tai padaryti, turime apskaičiuoti naujų vienarūšių komponentų vertes Ir .
1 punktas:

Atkreipkite dėmesį, kad vienalytė koordinatė absoliučiai teisingai išdėstyta CVV, o svarbiausia, dabar galima atlikti OpenGL gylio testą, nes pseudogylis visiškai atitinka testo reikalavimus.

Su koordinatėmis z Supratome, pereikime prie koordinačių x Ir y. Kaip minėta anksčiau, viskas daug žadantis tūris matomumas turi tilpti į CVV. CVV krašto ilgis yra du. Atitinkamai, perspektyvinio matomumo tūrio aukštis ir plotis turi būti suspausti iki dviejų įprastinių vienetų.

Mes turime kampelį fovy ir dydis aspektas. Išreikškime aukštį ir plotį naudodami šias reikšmes.


Ryžiai. 5. Matomumo apimtis

Iš pav. 5 aišku, kad:

Dabar galime gauti galutinį perspektyvinės projekcijos matricos vaizdą pasirinktai kairiarankei koordinačių sistemai, veikiančiai su CVV OpenGL:

Tai užbaigia matricų išvedimą.

Keletas žodžių apie „DirectX“ – pagrindinį „OpenGL“ konkurentą. DirectX nuo OpenGL skiriasi tik CVV matmenimis ir jo padėtimi. „DirectX“ CVV yra stačiakampis su ašiniais ilgiais x Ir y lygus dviem, ir išilgai ašies z ilgis lygus vienetui. diapazonas x Ir y yra [-1 1], o diapazonas z lygus . Kalbant apie CVV koordinačių sistemą, „DirectX“, kaip ir „OpenGL“, naudoja kairiąją koordinačių sistemą.

Norėdami parodyti pasirinktinės dešiniarankės koordinačių sistemos perspektyvines matricas, turite perbraižyti Fig. 2, 3 ir 4 pav., atsižvelgiant į naują ašies kryptį Z. Tolesni skaičiavimai yra visiškai panašūs, iki ženklo. „DirectX“ matricoms 3 ir 4 pseudo-gylio savybės yra modifikuojamos, kad atitiktų diapazoną.

Šiuo metu perspektyvių matricų temą galima laikyti uždaryta.

At centrinė projekcija visi projektuojantys spinduliai praeina per tam tikrą erdvės tašką – projekcijos centrą. Fizinis prietaisas, įgyvendinantis centrinę projekciją, yra objektyvas. Vizualiniame stebėjime lęšio vaidmenį atlieka akis. Objektyve spinduliai, jungiantys konjuguotus taškus objektų ir vaizdų erdvėje, praeina pro galinį pagrindinį tašką, kuris yra projekcijos centras (1.5.3 pav.). Iš šios pagrindinės centrinės projekcijos savybės seka matematinis vaizdo konstravimo metodas: kiekvieno vaizdo taško koordinates galima apskaičiuoti nustatant tiesės, einančios per objekto tašką ir projekcijos centrą, susikirtimo tašką su projekcija. (vaizdo) paviršius. Jei pasirinktoje objekto koordinačių sistemoje yra žinomos taškų ir koordinatės, taip pat vaizdo paviršiaus lygtis, tai vaizdo taško koordinatės nustatomos sprendžiant lygčių sistemą.

Ryžiai. 1.5.3. Bendra centrinės projekcijos schema

Daugeliu atvejų projekcinis paviršius gali būti laikomas plokščiu. Šis apytikslis skaičiavimas taip pat yra gana tikslus akiai. Nors šviesai jautrus akies paviršius, tinklainė, yra beveik sferinės formos, aiškaus matymo srityje, kurią riboja kelių laipsnių kampinis dydis, jis gali būti laikomas plokščiu.

Remiantis optikos dėsniais, norint gauti ryškų vaizdą, šviesai jautrus paviršius turi būti statmenas objektyvo optinei ašiai ir tam tikru atstumu nuo projekcijos centro, kuris paprastai imamas. lygus židinio nuotoliui. Tiesą sakant, vaizdas yra vaizdo atstumu nuo projekcijos centro, kuris visada yra didesnis nei židinio nuotolis. Tačiau, jei objektas pašalinamas iš objektyvo per atstumą , tada skirtumas tarp nuotraukos ir židinio nuotolis nereikšmingas. Taigi vaizdo plokštumos padėtis yra lengvai fiksuojama projekcijos centro ir objektyvo optinės ašies atžvilgiu. Jei objektyvas sukasi taip, kad tam tikri objektai patenka į jo matymo lauką, tada vaizdo plokštuma turi suktis kartu su juo.

Jei atsižvelgsime į pastebėtas centrinės projekcijos ypatybes realiuose vaizdo formavimo įrenginiuose, tai ryšys tarp taškų koordinačių objektų erdvėje ir vaizdų erdvės gali būti išreikštas kitokia forma nei lygčių sistemoje ( 1.5.7). Supažindinkime su vaizdo plokštumos koordinačių sistema, susijusia objektyvo koordinačių sistema ir objekto erdvės koordinačių sistema (1.5.4 pav.). Centrinės projekcijos ypatumą galima išreikšti taip: vektoriai ir jungiantys projekcijos centrą su konjuguotais taškais ir yra kolinearūs. tai reiškia

kur yra konstanta tam tikrai taškų porai ir .

Ryžiai. 1.5.4. Vaizdo plokštumos sukimosi schema

Atsižvelgiant į tai, kad filmavimo kamera gali būti pasukama kampais ir ašių atžvilgiu, iš (1.5.8) gauname

, (1.5.8)

kur yra projektavimo centro koordinatės sistemoje; – projektavimo centro koordinates sistemoje.

Jei atsižvelgsime į tai, kad projekcijos paviršius yra plokščias, sistemos kilmė, kaip taisyklė, sutampa su pagrindiniu vaizdo plokštumos tašku, esančiu atstumu nuo, tada

. (1.5.9)

Pašalinus (1.5.9) konstantą, padalijus pirmąją ir antrąją eilutes iš trečiosios, gauname lygtis, susijusias su konjuguotų taškų koordinates sistemose ir:

Iš sistemos (1.5.10), naudojant vaizdo taškų koordinates, galite nustatyti konjuguotų taškų koordinates objekto erdvėje, jei pateikiama stebimo paviršiaus lygtis . Tada pagal taško koordinates paviršiaus lygtis ir žinomas apšvietimo sąlygas, galima nustatyti taškų atributus (ryškumą, spalvą) ir apskaičiuoti atitinkamus vaizdo taškinius požymius. Čia trumpai aprašyta vaizdo sintezės procedūra paremta spindulio, sklindančio iš vaizdo erdvės į objekto erdvę, sekimu, t.y. priešinga spindulių eigai kryptimi tikroji sistema. Kompiuterinėje grafikoje šį metodą vadiname atvirkštinio spindulio sekimo metodu.

Būdingas centrinės projekcijos bruožas yra reikšmingas objektų, esančių skirtingais atstumais nuo projekcijos centro, vaizdo masto skirtumas. Taip yra dėl sumažėjimo kampiniai matmenys objektas (ir atitinkamai sumažėjus linijiniams matmenims vaizdo plokštumoje), tolstant nuo fotografavimo scenos. 1.5.5 paveiksle parodytas fotografavimo rezultatas juostos pavidalu su periodiškai pasikartojančių stačiakampių raštu. Keičiant juostos plotį ir stačiakampių dydį sukuriamas erdvės gylio jausmas. Iš esmės vaizdą galima apskaičiuoti, pavyzdžiui, naudojant (1.5.12) formules, tačiau jis gali būti sukonstruotas pakankamai tiksliai, jei nurodote spindulių išnykimo tašką. Skaičiavimai naudojant spindulių išnykimo taško koordinates yra daug paprastesni. Todėl šis metodas plačiai naudojamas imituojant vizualiai stebimą aplinką vaizdo treniruokliuose.

Šiandien atidžiau pažvelgsime į virtualios kameros įrenginį. Pradėkime nuo paveikslėlio.

Paveiksle matome kameros koordinačių erdvę. Kameros kryptis („žiūrėjimas“) visada sutampa su teigiama z ašies kryptimi, o pati kamera yra pradinėje vietoje.

Paveikslėlyje parodyta piramidės vidinė erdvė yra ta virtualaus pasaulio dalis, kurią matys vartotojas.

Atkreipkite dėmesį į tris plokštumus. Pirmasis yra 1 atstumu išilgai z ašies. Tai artimiausias lėktuvas. Žaidėjas niekada nepamatys to, kas yra prieš jį. IN tokiu atveju z reikšmė lygi vienetui, bet paprastai ji gali būti bet kokia. Vienas grafinio ekrano defektas yra susijęs su artimąja plokštuma. Šis trūkumas pirmiausia pasireiškia šauliuose (dėl didelė laisvė fotoaparatai). Kai priartėsite prie objekto per arti, galite atsidurti „viduje“. Iš naujausi žaidimaiŠis defektas ypač išryškėjo Left 4 dead: kai ant grotuvo krisdavo zombių minia, labai dažnai būdavo galima pažvelgti į kitų veikėjų vidų.

Plokštuma, esanti 100 vienetų atstumu išilgai z ašies, vadinama tolimąja plokštuma. Vėlgi, vertė gali būti savavališka. Vartotojas niekada nematys objektų, esančių toliau nei ši plokštuma.

Šešios plokštumos, ribojančios erdvę, kurią matys vartotojas, vadinamos iškirpimo plokštumos: kairė, dešinė, viršutinė, apatinė, artima ir toli.

Plokštuma, esanti tarp artimo ir tolimojo, yra projekcija. Toliau šią plokštumą pastatysime ties z=1, t.y. jis sutaps su artimiausiu. Čia atskyriau artimąją ir projekcinę plokštumas, kad parodyčiau, jog jos nėra tas pats dalykas. Projekcijos plokštuma skirta paskutinei koordinačių transformacijai: transformacijai iš trimatė erdvė kameros – į dvimatę erdvę.

Būtent projekcijos plokštumos dėka vartotojas matys Virtualus pasaulis. Tiesą sakant, ši plokštuma yra tai, ką vartotojas matys. Projekcijos plokštuma yra tiesiogiai susijusi su tokiomis sąvokomis kaip priekinio plano / fono buferiai, programos langas ir vartotojo ekranas. Visos šios sąvokos gali būti laikomos stačiakampiu paveikslėliu, kurį kompiuterio atmintyje vaizduoja skaičių masyvas.

Paversti koordinates iš trimačio pasaulio į projekcijos plokštumą yra sunkiausia Šis momentas buvome studijuoti.

Matymo laukas / matymo sritis

Aukščiau pateiktame paveikslėlyje projekcijos plokštuma (taigi ir vaizdas, kurį matys vartotojas) yra pločio daugiau aukščio. Projekcijos plokštumos plotis ir aukštis nurodomi naudojant kampus. Susitikti skirtingi vardaišie kampai: matymo laukas arba žiūrėjimo sritis. Anglų kalba – matymo laukai.

Žiūrėjimo sritys nurodomos dviem kampais. Pavadinkime juos: fovx – horizontali žiūrėjimo zona, fovy – vertikali žiūrėjimo zona. Išsami informacija apie žiūrėjimo sritis: žemiau.

Z-buferis / w-buferis / gylio buferis (z-buferis / w-buferis / gylio buferis)

Pažiūrėkime į paveikslėlį, kuriame pavaizduoti du trikampiai: 25 ir 50 vienetų atstumu nuo fotoaparato. (a) paveiksle pavaizduota trikampių vieta erdvėje (vaizdas iš viršaus), o (b) paveiksle – galutinis vaizdas:

Kaip galima numanyti, vaizdą reikia piešti pradedant nuo tolimiausių elementų ir baigiant artimiausiais. Akivaizdus sprendimas yra apskaičiuoti atstumą nuo pradžios (nuo fotoaparato) iki kiekvieno objekto ir tada palyginti. IN Kompiuterinė grafika naudojamas kiek pažangesnis mechanizmas. Šis mechanizmas turi kelis pavadinimus: z-buffer, w-buffer, gylio buferis. Z-buferio dydis elementų skaičiaus atžvilgiu yra toks pat kaip fono ir pagrindinių buferių dydis. Arčiausiai fotoaparato esančio objekto z komponentas įvedamas į z buferį. Šiame pavyzdyje, kur mėlynas trikampis sutampa su žaliu trikampiu, mėlynos spalvos z koordinatės bus įvestos į gylio buferį. Išsamiau apie z-buferius kalbėsime atskiroje pamokoje.

Ortografinė / lygiagreti projekcija

Operacija, kurios metu erdvės matmuo mažėja (buvo trimatė erdvė, ji tapo dvimatė), vadinama projekcija. Pirmiausia mus domina perspektyvinė projekcija, bet pirmiausia susipažinsime su lygiagrečia (lygiagrečia arba ortografine projekcija).

Suskaičiuoti lygiagreti projekcija pakanka atmesti papildomą koordinatę. Jei erdvėje turime tašką [ 3 3 3 ], tai su lygiagrečia projekcija į plokštumą z=1, jis bus projektuojamas į tašką .

Perspektyvinė projekcija į projekcijos plokštumą

Tokio tipo projekcijoje visos tiesės susilieja viename taške. Būtent taip veikia mūsų vizija. Ir būtent perspektyvinės projekcijos pagalba modeliuojama „išvaizda“ visuose žaidimuose.


Palyginkite šį paveikslėlį su paveikslėliu, kuriame pavaizduotos vienalytės ankstesnės pamokos koordinatės. Norint pereiti iš trimatės erdvės į dvimatę erdvę, pirmąsias dvi vektorių komponentes reikia padalyti iš trečiosios: [ x/z y/z z/z ] = [ x/z y/z 1 ].

Kaip rašiau aukščiau, projekcinė plokštuma gali būti bet kur tarp arti ir toli. Mes visada pastatysime projekcijos plokštumą ties z=1, tačiau šioje pamokoje apžvelgsime kitas parinktis. Pažiūrėkime į paveikslėlį:


Atstumą iki projekcijos plokštumos nuo koordinačių pradžios pažymėkime d. Nagrinėsime du atvejus: d=1 ir d=5. Svarbus punktas: trečioji visų vektorių dedamoji po projekcijos turi būti lygi d - visi taškai yra toje pačioje plokštumoje z=d. Tai galima pasiekti visus vektoriaus komponentus padauginus iš d: [ xd/z yd/z zd/z ]. Su d=1 gauname: [ x/z y/z 1 ], tai formulė, kuri buvo naudojama vienarūšėms koordinatėms transformuoti.

Dabar, jei projekcijos plokštumą perkeltume į tašką z=5 (atitinkamai d=5), gautume: [ xd/z yd/z zd/z ] = [ 5x/z 5y/z 5 ]. Paskutinė formulė projektuoja visus erdvės vektorius į vieną plokštumą, kur d=5.
Čia turime mažą problemą. Ankstesnė formulė veikia su trimačiais vektoriais. Bet sutarėme naudoti 4D vektoriai. Ketvirtasis komponentas šiuo atveju gali būti tiesiog išmestas. Bet mes to nedarysime, nes jo naudojimas suteikia tam tikrų specifinių galimybių, kurias aptarsime vėliau.

Reikia surasti bendras daliklis trečiasis ir ketvirtasis komponentai, padalijus iš kurių d reikšmė išlieka trečiajame komponente, o vienybė ketvirtajame. Šis daliklis yra d/z. Dabar iš įprasto vektoriaus [ x y z 1 ] turime gauti vektorių, paruoštą projekcijai (dalybai) [ x y z z/d ]. Tai atliekama naudojant transformacijos matricą (patikrinkite rezultatą padaugindami bet kurį vektorių iš šios matricos):


Paskutinė transformacija dar nėra projekcija. Čia mes tiesiog sumažiname visus vektorius iki mums reikalingos formos. Priminsiu, kad projekcijos plokštumą pastatysime ties d=1, vadinasi, vektoriai atrodys taip: [ x y z z ].

Perspektyvinės transformacijos matrica

Pažiūrėsime į perspektyvos transformacijos matricą, naudojamą DirectX:

Dabar mes žinome, kam yra skirtas elementas _34. Taip pat žinome, kad elementai _11 ir _22 padidina vaizdo mastelį horizontaliai ir vertikaliai. Pažiūrėkime, kas tiksliai slepiasi už pavadinimų xScale ir yScale.

Šie kintamieji priklauso nuo žiūrėjimo sričių, kurias aptarėme aukščiau. Didindami arba mažindami šiuos kampus, galite pakeisti vaizdą (mastelį arba priartinti) – pakeisti projekcijos plokštumos dydį ir kraštinių santykį. Priartinimo mechanizmas miglotai primena kamerų/kamerų priartinimą – principas labai panašus. Pažiūrėkime į paveikslėlį:


Padalinkime kampą fov į dvi dalis ir apsvarstykime tik vieną pusę. Ką mes matome čia: padidindami kampą fov/2 (ir atitinkamai kampą fov), padidiname kampo nuodėmę ir sumažiname cos. Tai padidina projekcijos plokštumą ir atitinkamai sumažina projektuojamų objektų skaičių. Idealus kampas mums būtų fov/2 = P/4. Leiskite jums priminti, kad kampas P/4 radianais yra lygus 45 laipsnių. Šiuo atveju fov bus lygus 90 laipsnių. Kodėl mums tinka 45 laipsnių kampas? Šiuo atveju mastelio keitimo nėra, o cos(P/4)/sin(P/4)=1.

Dabar galime lengvai pakeisti vaizdo mastelį vertikaliai (horizontaliai), naudodami pusės žiūrėjimo ploto sinusus ir kosinusus (kotangento funkcija C++ kalboje vadinama cot):

yScale = cos(fovY/2)/sin(fovY/2) = cot(fovY/2)
„DirectX“ naudoja tik vertikalų matymo lauką (fovY), o horizontalus mastelio keitimas priklauso nuo vertikali zona vaizdas ir kraštinių santykis.

Priminsiu, kad mūsų programų langas yra 500x500 dydžio. Kraštinių santykis: nuo 1 iki 1. Todėl kintamieji bus lygūs: xScale=1, yScale=1.

Standartinis monitoriaus/televizoriaus formato santykis: 4:3. Šis santykis atitinka ekrano skiriamąją gebą: 640x480, 800x600, 1600x1200. Viso ekrano režimo dar neliesime, bet galime pakeisti programos lango dydį. Galite pakeisti lango dydį (esamuose parametruose), pavyzdžiui, į 640x480. Bet kad visi objektai nebūtų ištempti (kvadratai atrodys kaip stačiakampiai), nepamirškite pakeisti atitinkamų kintamųjų projekcijos matricoje.

Aš beveik pamiršau, forumas xScale „DirectX“:

xScale = yMastelis / formato santykis
Kraštinių santykiai nustatomi paprastai: 1/1, 4/3, 16/9 – tai standartiniai.

Belieka išsiaiškinti perspektyvinės transformacijos matricos elementų _33, _34 paskirtį. zf yra tolimosios plokštumos z koordinatė (iš toli - toli), o zn yra artimos plokštumos z koordinatė (iš arti - arti). Atkreipkite dėmesį, kad elementas _43 = _33 * -zn.

Lengviausias būdas tiksliai suprasti, ką šios formulės veikia, yra pavyzdžiai. Standartinį vektorių [ x y z w ] padauginkime iš aukščiau pateiktos matricos. Rekomenduoju tai padaryti paėmus popieriaus lapą ir pieštuką (tikiuosi prisiminsite, kaip padauginti dvi matricas). Vektoriaus komponentai bus tokios formos.

1 = x*xSkalė
2 = y*ySkalė
3-ioji = z*(zf/(zf-zn)) + w*(-(zn*zf)/(zf-zn)) = (zf/(zf-zn))*(z – w*zn)
4-oji = (w*z)/d
Atlikime projekcijos transformaciją (visus elementus padalijame į 4-ąjį komponentą ir darome prielaidą, kad d=1 ir w=1):

1-oji = (d*x*xmastelė)/(w*z) = (x*xskalė)/z
2-oji = (d*y*yScale)/(w*z) = (y*xScale)/z
3 = (zf/(zf-zn))*(z – w*zn)*(w*d/z) = (zf/(zf-zn))*(1 – zn/z)
4 = 1
Dėl to mes gavome formos vektorių:

[ x/(z*xScale) y/(z*yScale) (zf/(zf-zn))*(1-zn/z) 1 ]
Dabar, jei nurodysite konkrečias zf ir zn reikšmes, rasite šiuos dalykus (skirta teigiamas vertes): jei vektorius yra prieš artimiausią plokštumą, tai z komponentas po transformacijos bus mažiau nei nulis, jei vektorius yra už tolimosios plokštumos, tada z komponentas bus didesnis už vienetą.

Nėra skirtumo, kur tiksliai yra artimos ir tolimosios plokštumos: zn=1, zf=10 arba zn=10, ir zf=100 (ar bet kokios kitos reikšmės) – po transformacijos matoma sritis atsidurs intervale nuo nulio iki vieno, imtinai.

Būtent tam skirtos formulės projekcinės matricos elementuose _33, _34 - projektuoti atstumą nuo artimos iki tolimos plokštumos į atkarpą. Patikrinkite tai apskaičiuodami kelių vektorių reikšmes konkrečios vertės zn,zf (taip, ant popieriaus!!!).

Metų darbai. Vološinas Maksimilianas. POETĖS VALORAS. 1. Redaguokite eilėraštį kaip siuntimo į užsienį tekstą: Sausumas, aiškumas, spaudimas – kiekvienas žodis yra budrus.

Raidė po raidės pjaustyti ant kieto ir ankšto akmens: Nei taupiai tariant, tuo intensyvesnė jų jėga. Valingas minties užtaisas prilygsta tylioms strofoms.

Iš žodyno ištrinkite žodžius „Grožis“, „Įkvėpimas“ - šlykštų rimuotojų žargoną. Blaivus, sunkus amatas yra poeto įkvėpimas ir garbė: kurčnebylioje materijoje sustiprinti transcendentinį budrumą. Vološinas M.A. Biblioteka: Oryol regioninė mokslinė universali biblioteka viešoji biblioteka juos. I.A. Bunina. - M., ; Pasirinkti kūriniai: 2 tomais.

M., ; Raudoni dūmai: istorijos. - M., ; Gladyševas iš žvalgybos kompanijos: istorijos. - M., ; Ešelonas; Neišvengiamybė: romanai. Jis daug vertė marių ir udmurtų poetus. Kartkartėmis išbandydavau jėgas ir prozoje. Op. Maksimilianas Aleksandrovičius Vološinas () - vienas iš didžiausi poetai pirmasis XX amžiaus trečdalis. Tai talentingas menininkas, daugialypis tekstų autorius, pro taką nuo simbolistinių, ezoterinių eilėraščių iki pilietinės-žurnalistinės ir mokslinės-filosofinės poezijos, per antroposofinius polinkius - iki „Dievo miesto idealo“.

Siūlomas leidinys leidžia skaitytojui susipažinti ne tik su geriausiais poetiniai kūriniai Vološinas, bet ir – su savo dauguma įdomių darbų estetikoje, memuarinėje prozoje, publicistikoje ir laiškuose, susijusiuose su dramatiškais šalių gyvenimo įvykiais. Autorius. Vološinas Maksimilianas. Visi autorės eilėraščiai. Darbas. Poeto narsumas. 2. Žvaigždės. Sukurkite mėgstamus autorių ir eilėraščių rinkinius!

Kalbėkitės su bendraminčiais! Rašykite atsiliepimus, dalyvaukite poezijos dvikovose ir konkursuose! Prisijunk prie geriausių! Dėkojame, kad prisijungėte prie Poembook! Jūsų el. paštu išsiųstas laiškas su prieigos prie paskyros duomenimis!

Turite prisijungti per 24 valandas. Priešingu atveju paskyra bus ištrinta! Užsiregistravę vartotojai gauna daug privalumų: skelbkite poeziją – realizuokite savo talentą! Sukurkite mėgstamus autorių ir eilėraščių rinkinius! Kalbėkitės su bendraminčiais! Rašykite atsiliepimus, dalyvaukite poezijos dvikovose ir konkursuose!. Maksimilianas Vološinas. Apibūdinimas. Maksimilianas Aleksandrovičius Vološinas yra vienas didžiausių XX amžiaus pirmojo trečdalio poetų.

Tai talentingas menininkas, daugialypis lyrikas, nuo simbolistinių, ezoterinių eilėraščių perėjęs prie pilietinės-žurnalistinės ir mokslinės-filosofinės poezijos, per antroposofinius polinkius - iki „Dievo miesto idealo“. Siūlomas leidinys suteikia skaitytojui galimybę susipažinti ne tik su geriausiais Vološino poetiniais kūriniais, bet ir su įdomiausiais estetikos, memuarinės prozos, publicistikos ir su drama susijusiais laiškais.

Pasirinkti darbai ir laiškai. M. A. Vološinas. Kaina. patrinti. Maksimilianas Aleksandrovičius Vološinas yra vienas didžiausių XX amžiaus pirmojo trečdalio poetų. Tai talentingas menininkas, daugialypis lyrikas, nuo simbolistinių, ezoterinių eilėraščių perėjęs prie pilietinės-žurnalistinės ir mokslinės-filosofinės poezijos, per antroposofinius polinkius - iki „Dievo miesto idealo“.

Vološinas M.A., Poeto narsumas: rinktiniai kūriniai ir laiškai. serija: Nauja biblioteka Rusų klasika: privalomas egzempliorius Paradas, miestas, puslapis, Knygos aprašymas. Maksimilianas Aleksandrovičius Vološinas () yra vienas didžiausių XX amžiaus pirmojo trečdalio poetų. Tai talentingas menininkas, įvairiapusis lyrikas, nuėjęs kelią nuo simbolinių, ezoterinių eilėraščių iki pilietinės-žurnalistinės ir mokslinės-filosofinės poezijos, per antroposofinius polinkius - į „Dievo miesto idealą“.

KategorijosĮrašo navigacija

Ar jums patiko straipsnis? Pasidalinkite su draugais!