Tabia za kijiometri za picha nyingi. Matrices ya mtazamo katika API ya michoro au shetani yuko katika maelezo

KATIKA muda fulani kutoka kwa msanidi programu yeyote katika eneo hilo michoro za kompyuta Swali linatokea: je, matrices haya ya kuahidi hufanyaje kazi? Wakati mwingine jibu ni gumu sana kupata na, kama kawaida, watengenezaji wengi hukata tamaa katikati ya kazi.

Hili si suluhisho la tatizo! Hebu tufikirie pamoja!

Wacha tuwe wa kweli na upendeleo wa vitendo na tuchukue kama somo la mtihani Matoleo ya OpenGL 3.3. Kuanzia toleo hili, kila msanidi anahitajika kutekeleza moduli kwa uhuru shughuli za matrix. Kubwa, hii ndiyo tunayohitaji. Wacha tutenganishe kazi yetu ngumu na tuangazie mambo makuu. Baadhi ya ukweli kutoka kwa vipimo vya OpenGL:

  • Matrices huhifadhiwa kwenye nguzo (safu-kubwa);
  • Kuratibu za homogeneous;
  • Kiasi cha upunguzaji cha kanuni (CVV) katika mfumo wa kuratibu wa mkono wa kushoto.
Kuna njia mbili za kuhifadhi matrices: safu-kuu na safu-kuu. Katika mihadhara ya algebra ya mstari, mpango wa safu-kuu hutumiwa. Kwa kiasi kikubwa, uwakilishi wa matrices katika kumbukumbu haijalishi, kwa sababu matrix inaweza daima kubadilishwa kutoka kwa aina moja ya uwakilishi hadi nyingine kwa uhamisho rahisi. Na kwa kuwa hakuna tofauti, basi kwa mahesabu yote yanayofuata tutatumia matrices ya mstari-kuu. Katika Programu ya OpenGL Kuna hila kidogo ambayo hukuruhusu kukataa kupitisha matiti huku ukidumisha hesabu kuu za safu mlalo. Matrix lazima ihamishwe kwa mpango wa shader kama ilivyo, na katika shader kuzidisha kunapaswa kufanywa sio kati ya vekta na tumbo, lakini kati ya tumbo na vekta.

Viwianishi vya homogeneous sio mfumo mgumu sana na idadi ya sheria rahisi juu ya kubadilisha kuratibu za kawaida za Cartesian kuwa kuratibu zenye homogeneous na kinyume chake. Kuratibu homogeneous ni matriki ya safu mlalo ya mwelekeo. Ili kubadilisha uratibu wa Cartesian kuwa uratibu wa homogeneous, ni muhimu x, y Na z zidisha kwa nambari yoyote halisi w(isipokuwa 0). Ifuatayo, unahitaji kuandika matokeo katika vipengele vitatu vya kwanza, na sehemu ya mwisho itakuwa sawa na kuzidisha. w. Kwa maneno mengine:
- Kuratibu za Cartesian
w- nambari halisi sio sawa na 0

- kuratibu za homogeneous

Hila kidogo: Ikiwa w sawa na moja, basi kinachohitajika kwa tafsiri ni kuhamisha vijenzi x, y Na z na gawa moja kwa sehemu ya mwisho. Hiyo ni, pata matrix ya safu:

Maneno machache kuhusu ubora wa sifuri w. Kutoka kwa mtazamo wa kuratibu za homogeneous, hii inakubalika kabisa. Kuratibu za homogeneous hukuruhusu kutofautisha kati ya alama na vekta. Katika mfumo wa kuratibu wa Cartesian, mgawanyiko huo hauwezekani.

- mahali ambapo ( x, y, z) - Kuratibu za Cartesian

- vekta, wapi ( x, y, z) - vekta ya radius

Tafsiri ya nyuma ya vertex kutoka kwa kuratibu zenye homogeneous hadi kuratibu za Cartesian hufanywa kama ifuatavyo. Vipengele vyote vya safu ya safu lazima zigawanywe na sehemu ya mwisho. Kwa maneno mengine:

- kuratibu za homogeneous
- Kuratibu za Cartesian

Jambo kuu unalohitaji kujua ni kwamba algorithms zote za kukatwa kwa OpenGL na uboreshaji hufanya kazi katika kuratibu za Cartesian, lakini kabla ya hapo mabadiliko yote yanafanywa kwa kuratibu za homogeneous. Mpito kutoka kwa kuratibu za homogeneous hadi kuratibu za Cartesian hufanyika katika vifaa.

Canonical clipping volume (CVV) ni mojawapo ya sehemu zisizo na kumbukumbu za OpenGL. Kama inavyoonekana kutoka kwa Mtini. 1 CVV ni mchemraba uliopangiliwa kwa mhimili unaozingatia asili na wenye urefu wa kingo sawa na mbili. Kila kitu kinachoanguka ndani ya eneo la CVV kinakabiliwa na rasterization, kila kitu kilicho nje ya CVV kinapuuzwa. Kitu chochote ambacho kinaanguka nje ya CVV kinategemea kanuni za kupogoa. Jambo muhimu zaidi unalohitaji kujua ni kwamba mfumo wa kuratibu wa CVV ni mkono wa kushoto!


Mchele. 1. Kiwango cha kunakilia cha OpenGL cha kisheria (CVV)

Mfumo wa kuratibu wa mkono wa kushoto? Hii inawezaje kuwa, kwa kuwa vipimo vya OpenGL 1.0 vinasema wazi kuwa mfumo wa kuratibu unaotumika ni wa mkono wa kulia? Hebu tufikirie.


Mchele. 2. Kuratibu mifumo

Kama inavyoonekana kutoka kwa Mtini. Mifumo 2 ya kuratibu hutofautiana tu katika mwelekeo wa mhimili Z. OpenGL 1.0 hutumia mkono wa kulia mfumo wa mtumiaji kuratibu Lakini mfumo wa kuratibu wa CVV na mfumo wa kuratibu wa mtumiaji ni vitu viwili tofauti kabisa. Kwa kuongezea, kama toleo la 3.3, hakuna kitu kama vile mfumo wa kawaida Viratibu vya OpenGL. Kama ilivyoelezwa hapo awali, programu mwenyewe hutumia moduli ya shughuli za matrix. Uundaji wa matrices ya mzunguko, uundaji wa matrices ya makadirio, tafuta matrix inverse, kuzidisha kwa matrices - hii ni seti ya chini ya shughuli iliyojumuishwa katika moduli ya shughuli za matrix. Maswali mawili ya kimantiki yanazuka. Ikiwa kiasi cha mwonekano ni mchemraba wenye urefu wa kingo sawa na mbili, basi kwa nini onyesho la ukubwa wa vitengo elfu kadhaa linaonekana kwenye skrini? Je, ni wakati gani mtumiaji huratibu mfumo hubadilisha kuwa mfumo wa kuratibu wa CVV? Matrices ya makadirio ndiyo huluki inayoshughulikia masuala haya.

Wazo kuu la hapo juu ni kwamba msanidi programu mwenyewe yuko huru kuchagua aina ya mfumo wa kuratibu wa mtumiaji na lazima aeleze kwa usahihi matrices ya makadirio. Hii inakamilisha ukweli kuhusu OpenGL na ni wakati wa kuweka kila kitu pamoja.

Moja ya matrices ya kawaida na ngumu kuelewa ni matrix mabadiliko ya kuahidi. Kwa hivyo inahusiana vipi na CVV na mfumo wa kuratibu wa mtumiaji? Kwa nini vitu vinakuwa vidogo kadri umbali wao kutoka kwa mwangalizi unavyoongezeka? Ili kuelewa ni kwa nini vitu vinakuwa vidogo kadiri umbali unavyoongezeka, hebu tuangalie mabadiliko ya matrix mfano wa pande tatu hatua kwa hatua. Sio siri kuwa modeli yoyote ya pande tatu ina orodha fupi ya wima ambayo hupitia mabadiliko ya matriki bila kujitegemea. Ili kuamua uratibu wa kipeo chenye mwelekeo-tatu kwenye skrini ya kufuatilia yenye pande mbili, unahitaji:

  1. Badilisha uratibu wa Cartesian kuwa uratibu wa homogeneous;
  2. Zidisha uratibu wa homogeneous kwa matrix ya mfano;
  3. Matokeo yanazidishwa na matrix ya kutazama;
  4. Zidisha matokeo kwa matrix ya makadirio;
  5. Badilisha tokeo kutoka kwa viwianishi vyenye usawa hadi viwianishi vya Cartesian.
Ubadilishaji wa viwianishi vya Cartesian kuwa viwianishi vya homogeneous ulijadiliwa hapo awali. Maana ya kijiometri ya matrix ya mfano ni kuhamisha modeli kutoka kwa mfumo wa kuratibu wa ndani hadi mfumo wa kimataifa kuratibu Au, kama wanasema, sogeza wima kutoka kwa nafasi ya mfano hadi kwenye nafasi ya ulimwengu. Hebu tuweke kwa urahisi, kitu cha tatu-dimensional kilichopakiwa kutoka kwa faili iko kwenye nafasi ya mfano, ambapo kuratibu hupimwa kuhusiana na kitu yenyewe. Ifuatayo, kwa kutumia matrix ya mfano, mfano umewekwa, kupunguzwa na kuzungushwa. Kwa hivyo, wima zote za muundo wa 3D hupokea viwianishi halisi vya homogeneous katika eneo la 3D. Nafasi ya mfano inayohusiana na nafasi ya ulimwengu ni ya ndani. Kutoka kwa nafasi ya mfano, kuratibu huhamishiwa kwenye nafasi ya dunia (kutoka ya ndani hadi ya kimataifa). Kwa kusudi hili, matrix ya mfano hutumiwa.

Sasa tuendelee hadi hatua ya tatu. Hapa ndipo nafasi ya kutazama inapotumika. Katika nafasi hii, kuratibu hupimwa kuhusiana na nafasi na mwelekeo wa mwangalizi kana kwamba alikuwa katikati ya dunia. Nafasi ya kutazama ni ya karibu na nafasi ya ulimwengu, kwa hivyo kuratibu lazima ziingizwe ndani (na sio kuchukuliwa nje, kama ilivyo katika kesi iliyopita). Ubadilishaji wa matrix ya moja kwa moja huondoa kuratibu kutoka kwa nafasi fulani. Ili kuwaanzisha ndani yake, kinyume chake, ni muhimu kugeuza mabadiliko ya matrix, kwa hiyo mabadiliko ya aina yanaelezewa na matrix inverse. Jinsi ya kupata hii matrix ya kinyume? Kwanza, hebu tupate matrix ya mwangalizi wa moja kwa moja. Mtazamaji ana sifa gani? Mtazamaji anaelezewa na kuratibu ambayo iko na vectors ya mwelekeo wa kutazama. Mtazamaji daima anaangalia katika mwelekeo wa mhimili wake wa ndani Z. Mtazamaji anaweza kuzunguka eneo la tukio na kufanya zamu. Kwa njia nyingi, hii inafanana na maana ya matrix ya mfano. Kwa kiasi kikubwa, hivi ndivyo ilivyo. Walakini, kwa mtazamaji, operesheni ya kuongeza alama haina maana, kwa hivyo, kati ya mfano wa matrix ya mwangalizi na matrix ya mfano. kitu chenye pande tatu Huwezi kuweka ishara sawa. Matrix ya mfano ya mwangalizi ni matrix ya moja kwa moja inayotakiwa. Kwa kugeuza matrix hii, tunapata matrix ya kutazama. Kwa mazoezi, hii ina maana kwamba wima zote katika kuratibu za homogeneous za kimataifa zitapokea kuratibu mpya za homogeneous kuhusiana na mwangalizi. Ipasavyo, ikiwa mwangalizi aliona vertex fulani, basi thamani ya kuratibu homogeneous z ya vertex iliyotolewa katika nafasi ya kutazama hakika kutakuwa nambari chanya. Ikiwa vertex ilikuwa nyuma ya mwangalizi, basi thamani ya uratibu wake wa homogeneous z kwa mtazamo nafasi itakuwa dhahiri kuwa nambari hasi.

Hatua ya nne ni hatua ya kuvutia zaidi. Hatua za awali zilijadiliwa kwa kina hivyo kwa makusudi ili msomaji awe na picha kamili ya uendeshaji wote wa hatua ya nne. Katika hatua ya nne, kuratibu za homogeneous huhamishwa kutoka nafasi ya kutazama hadi nafasi ya CVV. Kwa mara nyingine tena, ukweli unasisitizwa kwamba wima zote zinazoweza kuonekana zitakuwa na thamani chanya ya uratibu wa homogeneous. z.

Fikiria matrix ya fomu:

Na hoja katika nafasi ya mtazamaji yenye usawa:

Wacha tuzidishe uratibu wa homogeneous na matrix inayohusika:

Wacha tubadilishe viwianishi vinavyotokana na homogeneous kuwa kuratibu za Cartesian:

Wacha tuseme kuna vidokezo viwili kwenye nafasi ya kutazama na kuratibu sawa x Na y, lakini kwa kuratibu tofauti z. Kwa maneno mengine, moja ya pointi iko nyuma ya nyingine. Kutokana na upotoshaji wa mtazamo, mtazamaji lazima aone pointi zote mbili. Hakika, ni wazi kutoka kwa formula kwamba kutokana na mgawanyiko na kuratibu z, compression hutokea kwa uhakika wa asili. Thamani ya juu z(kadiri hoja inavyotoka kwa mtazamaji), the compression yenye nguvu. Hii ni maelezo ya athari ya mtazamo.

Vipimo vya OpenGL vinasema kuwa shughuli za kukatwa na kusawazisha hufanywa katika kuratibu za Cartesian, na mchakato wa kubadilisha viwianishi vya homogeneous kuwa viwianishi vya Cartesian hufanywa kiotomatiki.

Matrix (1) ni kiolezo cha matrix ya makadirio ya mtazamo. Kama ilivyoelezwa hapo awali, kazi ya matrix ya makadirio ina pointi mbili: kuweka mfumo wa kuratibu wa mtumiaji (mkono wa kushoto au wa kulia), kuhamisha kiasi cha mwonekano wa mwangalizi kwa CVV. Wacha tupate matrix ya mtazamo wa mfumo wa kuratibu wa mtumiaji wa mkono wa kushoto.

Matrix ya makadirio inaweza kuelezewa na kwa msaada wa wanne vigezo (Kielelezo 3):

  • Kuangalia pembe katika radiani ( fovy);
  • Uwiano wa kipengele ( kipengele);
  • Umbali wa ndege iliyo karibu ya kunasa ( n);
  • Umbali wa ndege ya kukata mbali ( f).


Mchele. 3. Kiasi cha mtazamo wa mwonekano

Wacha tuzingatie makadirio ya nukta kwenye nafasi ya mwangalizi kwenye ukingo wa mbele wa mkato wa kiasi cha mtazamo wa mwonekano. Kwa uwazi zaidi, katika Mtini. 4 inaonyesha mtazamo wa upande. Inapaswa pia kuzingatiwa kuwa mfumo wa kuratibu wa mtumiaji unafanana na mfumo wa kuratibu wa CVV, yaani, mfumo wa kuratibu wa kushoto hutumiwa kila mahali.


Mchele. 4. Kupanga hatua ya kiholela

Kulingana na sifa za pembetatu zinazofanana, usawa ufuatao ni kweli:

Hebu tueleze yꞌ na xꞌ:

Kimsingi, misemo (2) inatosha kupata kuratibu za alama za makadirio. Hata hivyo, ili uangalie vizuri vitu vya tatu-dimensional, unahitaji kujua kina cha kila kipande. Kwa maneno mengine, ni muhimu kuhifadhi thamani ya sehemu z. Hii ndiyo thamani inayotumika kwa majaribio ya kina ya OpenGL. Katika Mtini. 3 ni wazi kwamba thamani zꞌ haifai kama kina cha kipande, kwa sababu makadirio yote ya uhakika yanaweza thamani sawa zꞌ. Njia ya nje ya hali hii ni kutumia kinachojulikana kama kina cha pseudo.

Sifa za kina bandia:

  1. Kina bandia kinakokotolewa kulingana na thamani z;
  2. Karibu na uhakika ni mwangalizi, thamani ndogo ya pseudodepth ina;
  3. Pointi zote zilizo kwenye ndege ya mbele ya kiasi cha mwonekano zina thamani ya kina ya pseudo -1;
  4. Pointi zote ziko kwenye ndege ya kukata mbali ya kiasi cha kuonekana ina thamani ya kina ya 1;
  5. Vipande vyote vilivyo ndani ya kiasi cha mwonekano vina thamani ya kina bandia katika safu [-1 1].
Wacha tupate fomula ambayo kina cha pseudo kitahesabiwa. Wacha tuchukue usemi ufuatao kama msingi:

Odd a Na b inahitaji kuhesabiwa. Ili kufanya hivyo, tunatumia mali ya kina cha 3 na 4. Tunapata mfumo wa equations mbili na haijulikani mbili:

Hebu tuongeze sehemu zote mbili za mfumo na kuzidisha matokeo kwa bidhaa fn, ambapo f Na n haiwezi kuwa sawa na sifuri. Tunapata:

Wacha tufungue mabano na tupange upya masharti ili sehemu tu nayo A, na upande wa kulia tu na b:

Wacha tubadilishe (6) hadi (5). Wacha tubadilishe usemi kuwa sehemu rahisi:

Zidisha pande zote mbili -2fn, ambapo f Na n haiwezi kuwa sawa na sifuri. Wacha tuwasilishe zinazofanana, panga upya masharti na ueleze b:

Wacha tubadilishe (7) hadi (6) na tueleze a:

Ipasavyo vipengele a Na b ni sawa:

Sasa hebu tubadilishe mgawo uliopatikana kwenye matrix ya kazi (1) na tuone kinachotokea kwa kuratibu. z kwa hatua ya kiholela katika nafasi ya mwangalizi ya homogeneous. Uingizwaji unafanywa kama ifuatavyo:

Acha umbali wa ndege ya kukata mbele n ni sawa na 2, na umbali wa ndege ya kukata kwa mbali f sawa na 10. Fikiria pointi tano katika nafasi ya mtazamaji yenye usawa:

Nafasi ya jamaa ya uhakika na kiasi cha mwonekano
Nukta Maana Maelezo
1 1 Hatua iko mbele ya ndege ya mbele ya kukata kiasi cha mwonekano. Haipitishi rasterization.
2 2 Hatua iko kwenye makali ya mbele ya kupunguzwa kwa kiasi cha mwonekano. Inapitia rasterization.
3 5 Sehemu hiyo iko kati ya ukingo wa mbele wa kukata na ukingo wa mbali wa kiasi cha mwonekano. Inapitia rasterization.
4 10 Hatua iko kwenye ukingo wa mbali wa kukatwa kwa kiasi cha mwonekano. Inapitia rasterization.
5 20 Hatua iko zaidi ya makali ya mbali ya kupunguzwa kwa kiasi cha mwonekano. Haipitishi rasterization.

Wacha tuzidishe alama zote kwa matrix (8), na kisha tubadilishe viwianishi vya homogeneous Kuratibu za Cartesian . Ili kufanya hivyo, tunahitaji kuhesabu maadili ya vipengele vipya vya homogeneous Na .
Pointi 1:

Kumbuka kwamba kuratibu homogeneous kwa usahihi kabisa katika nafasi ya CVV, na muhimu zaidi, mtihani wa kina wa OpenGL sasa unawezekana, kwa sababu kina cha uwongo kinakidhi kikamilifu mahitaji ya mtihani.

Pamoja na kuratibu z Tulifikiria, wacha tuendelee kwenye kuratibu x Na y. Kama ilivyoelezwa hapo awali, kiasi cha mtazamo mzima wa mwonekano lazima ufanane na CVV. Urefu wa makali ya CVV ni mbili. Ipasavyo, urefu na upana wa kiasi cha mtazamo wa mwonekano lazima ushinikizwe kwa vitengo viwili vya kawaida.

Tunayo kona fovy na ukubwa kipengele. Wacha tuonyeshe urefu na upana kwa kutumia maadili haya.


Mchele. 5. Kiasi cha mwonekano

Kutoka Mtini. 5 ni wazi kwamba:

Sasa tunaweza kupata mwonekano wa mwisho wa matrix ya makadirio ya mtazamo kwa mfumo maalum wa kuratibu wa mkono wa kushoto unaofanya kazi na CVV OpenGL:

Hii inakamilisha utengenezaji wa matrices.

Maneno machache kuhusu DirectX - mshindani mkuu wa OpenGL. DirectX inatofautiana na OpenGL tu katika vipimo vya CVV na nafasi yake. Katika DirectX, CVV ni parallelepiped ya mstatili yenye urefu pamoja na shoka zake x Na y sawa na mbili, na kando ya mhimili z urefu ni sawa na moja. Masafa x Na y ni [-1 1], na masafa z sawa na. Kama ilivyo kwa mfumo wa kuratibu wa CVV, DirectX, kama OpenGL, hutumia mfumo wa kuratibu wa mkono wa kushoto.

Ili kuonyesha hesabu za mtazamo kwa mfumo maalum wa kuratibu wa mkono wa kulia, unahitaji kuchora upya Mtini. 2, Kielelezo 3 na Kielelezo 4 kwa kuzingatia mwelekeo mpya wa mhimili Z. Mahesabu zaidi yanafanana kabisa, hadi ishara. Kwa matrices ya DirectX, sifa za pseudo-deep 3 na 4 zinarekebishwa ili kuendana na safu.

Katika hatua hii, mada ya matrices ya kuahidi inaweza kuchukuliwa kuwa imefungwa.

Injini haisogei meli.
Meli inabaki mahali na
injini huhamisha ulimwengu
Karibu naye.

Futurama

Hii ni moja ya masomo muhimu zaidi. Isome kwa makini angalau mara nane.

Kuratibu za homogeneous

Katika masomo ya awali tulidhani kwamba vertex iko kwenye kuratibu (x, y, z). Hebu tuongeze kuratibu moja zaidi - w. Kuanzia sasa na kuendelea, wima zetu zitakuwa kwenye kuratibu (x, y, z, w)

Hivi karibuni utaelewa ni nini, lakini kwa sasa ichukue kuwa rahisi:

  • Ikiwa w==1, basi vekta (x,y,z,1) ndio nafasi katika nafasi
  • Ikiwa w==0, basi vekta (x,y,z,0) ndio mwelekeo.

Kumbuka hii kama axiom bila uthibitisho !!!

Na hii inatupa nini? Kweli, hakuna kitu cha kuzunguka. Ikiwa unazunguka hatua au mwelekeo, utapata matokeo sawa. Lakini ikiwa unazunguka hoja (unapohamisha hatua kwa mwelekeo fulani), basi kila kitu kinabadilika sana. Je, "mwelekeo wa kusonga" unamaanisha nini? Hakuna maalum.

Viwianishi vya homogeneous huturuhusu kufanya kazi na maunzi moja kwa visa vyote viwili.

Matrices ya Mabadiliko

Utangulizi wa Matrices

Ili kuiweka kwa urahisi, matrix ni safu ya nambari zilizo na idadi maalum ya safu na safu.

Kwa mfano, matrix 2 kwa 3 ingeonekana kama hii:

Katika picha za 3D karibu kila mara tunatumia matrices 4x4. Hii inaturuhusu kubadilisha wima zetu (x,y,z,w). Ni rahisi sana - tunazidisha vekta ya msimamo kwa matrix ya mabadiliko.

Matrix*Vertex = kipeo kilichobadilishwa

Kila kitu sio cha kutisha kama inavyoonekana. Elekeza kidole chako cha kushoto kwa a na kidole chako cha kulia kwa x. Hii itakuwa shoka. Sogeza kidole chako cha kushoto chini hadi nambari inayofuata, b, na kidole chako cha kulia hadi nambari inayofuata, y. Tumeipata. Kwa mara nyingine tena - cz. Na kwa mara nyingine tena - dw. Sasa tunajumlisha nambari zote zinazotokana - ax+by +cz +dw. Tumepokea x yetu mpya. Rudia vivyo hivyo kwa kila mstari na utapata vekta mpya (x,y,z,w).

Walakini, hii ni operesheni ya kuchosha, kwa hivyo acha kompyuta itufanyie.

Katika C++ kwa kutumia maktaba ya GLM:

glm::mat4 myMatrix;


glm::vec4 myVector;



glm:: vec 4 ilibadilishwaVector = myMatrix * myVector; // Usisahau kuhusu utaratibu !!! Hii ni muhimu sana!!!

Katika GLSL:

mat4 myMatrix;


vec4 myVector;


// jaza matrix na vekta na maadili yetu ... tunaruka hii


vec 4 ilibadilishwaVector = myMatrix * myVector; // sawa kabisa na katika GLM

(Kwa sababu fulani inaonekana kwangu kuwa hukunakili kipande hiki cha msimbo kwenye mradi wako na ujaribu... njoo, jaribu, inavutia!)

Matrix ya Mwendo

Matrix ya uhamishaji labda ndio matrix rahisi kuliko yote. Huyu hapa:


Hapa X, Y, Z ndio maadili tunayotaka kuongeza kwenye nafasi yetu ya vertex.

Kwa hivyo, ikiwa tunahitaji kusonga vekta (10,10,10,1) kwa alama 10, kwenye nafasi X, basi:
(Ijaribu mwenyewe, tafadhali!)

...Na tunapata (20,10,10,1) katika vekta ya homogeneous. Kama natumai unakumbuka, 1 inamaanisha kuwa vekta inawakilisha msimamo, sio mwelekeo.

Sasa wacha tujaribu kubadilisha mwelekeo (0,0,-1,0) kwa njia ile ile:

Na mwisho tulipata vector sawa (0,0,-1,0).
Kama nilivyosema, hakuna maana katika kusonga mwelekeo.

Je, tunawekaje hili?

Katika C++ kwa kutumia GLM:

#pamoja na // baada ya


glm::mat4 myMatrix = glm::tafsiri (10.0f, 0.0f, 0.0f);


glm::vec4 myVector(10.0f, 10.0f, 10.0f, 0.0f);


glm:: vec 4 ilibadilishwaVector = myMatrix * myVector; // na tutapata matokeo gani?


Na katika GLSL: Katika GLSL, mara chache mtu yeyote hufanya hivi. Mara nyingi hutumia kitendakazi cha glm::translate(). Kwanza, huunda matrix katika C ++, na kisha kuituma kwa GLSL, na kuzidisha moja tu kunafanywa hapo:

vec4 transformedVector = myMatrix * myVector;

Matrix ya Utambulisho

Hii matrix maalum. Yeye hafanyi chochote. Lakini ninaitaja kwa sababu ni muhimu kujua kuwa kuzidisha A kwa 1.0 husababisha A:

glm::mat4 myIdentityMatrix = glm::mat4(1.0f);

Kuongeza Matrix

Matrix ya kuongeza kiwango pia ni rahisi sana:

Kwa hivyo ikiwa unataka kuongeza vekta mara mbili (msimamo au mwelekeo, haijalishi) kwa pande zote:

Lakini uratibu wa w haujabadilika. Ukiuliza: "Kuongeza mwelekeo ni nini?" Sio muhimu mara nyingi, lakini wakati mwingine ni muhimu.

(kumbuka kuwa kuongeza matrix ya utambulisho na (x,y,z) = (1,1,1))

C++:

// Tumia#pamoja na Na#pamoja na


glm::mat4 myScalingMatrix = glm::scale(2.0f, 2.0f ,2.0f);

Matrix ya Mzunguko

Lakini matrix hii ni ngumu sana. Kwa hiyo, sitakaa juu ya maelezo ya utekelezaji wake wa ndani. Ikiwa unataka kweli, ni bora kusoma (Maswali Yanayoulizwa Mara kwa Mara ya Matrices na Quaternions)

KATIKANA++:

// Tumia#pamoja na Na#pamoja na


glm::vec3 myRotationAxis(??, ??, ??);


glm::zungusha (pembe_katika_digrii, myRotationAxis);

Mabadiliko ya Pamoja

Sasa tunajua jinsi ya kuzungusha, kusonga na kuongeza vekta zetu. Itakuwa nzuri kujua jinsi ya kuweka yote pamoja. Hii inafanywa kwa urahisi kwa kuzidisha matrices kwa kila mmoja.

TransformedVector = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;

Na kuagiza tena !!! Kwanza unahitaji kurekebisha ukubwa, kisha tembeza na kisha tu uhamishe.

Ikiwa tutatumia mabadiliko kwa mpangilio tofauti, hatutapata matokeo sawa. Jaribu hii:

  • Chukua hatua mbele (usipige kompyuta kwenye meza) na ugeuke kushoto
  • Pinduka kushoto na upige hatua moja mbele.

Ndiyo, unapaswa kukumbuka daima utaratibu wa vitendo wakati wa kudhibiti, kwa mfano, tabia ya mchezo. Kwanza, ikiwa ni lazima, tunafanya kuongeza, kisha kuweka mwelekeo (mzunguko) na kisha uende. Wacha tuangalie mfano mdogo (niliondoa mzunguko ili kufanya mahesabu rahisi):

Njia mbaya:

  • Sogeza meli hadi (10,0,0). Kituo chake sasa kiko 10 X kutoka katikati.
  • Tunaongeza ukubwa wa meli yetu kwa mara 2. Kila kuratibu huzidishwa na 2 kuhusiana na kituo ambacho ni mbali ... Na mwisho tunapata meli ya ukubwa unaohitajika lakini kwa nafasi ya 2 * 10 = 20. Ambayo sio hasa tuliyotaka.

Njia sahihi:

  • Tunaongeza saizi ya meli kwa mara 2. Sasa tuna meli kubwa iko katikati.
  • Tunasonga meli. Saizi ya meli haijabadilika na iko ndani mahali pazuri.
Kuzidisha kwa tumbo-tumbo hufanywa kwa njia sawa na kuzidisha kwa vekta ya matrix. Hatutaingia kwa undani, na wacha wale wanaotamani wasome hii kutoka kwa vyanzo maalum. Tutategemea tu maktaba ya GLM.
BC++:
glm::mat4 myModelMatrix = myTranslationMatrix * myRotationMatrix * myScaleMatrix;
glm::vec4 myTransformedVector = myModelMatrix * myOriginalVector;
Katika GLSL:
mat4 kubadilisha = mat2 * mat1;
vec4 out_vec = kubadilisha * in_vec;

Mfano, Mtazamo na Matrices ya Makadirio

Kwa mfano, tunadhania kwamba tayari tunajua jinsi ya kuchora modeli yetu tunayopenda ya 3D ya programu ya Blender - mkuu wa Suzanne tumbili - katika OpenGL.

Model, View na Projection Matrices ni njia rahisi sana ya kutenganisha mabadiliko. Ikiwa unataka kweli, huna haja ya kuzitumia (hatukuzitumia katika somo la 1 na 2). Lakini ninapendekeza sana kuwatumia. Ni kwamba karibu maktaba zote za 3D, michezo, n.k. huzitumia kutenganisha mabadiliko.

Mifano ya Matrix

Mfano huu, kama pembetatu yetu tunayopenda, inafafanuliwa na seti ya wima. Viwianishi vya X, Y, Z vinatolewa kulingana na katikati ya kitu. Kwa hivyo, ikiwa vertex iko kwenye kuratibu (0,0,0), basi iko katikati ya kitu kizima.

Sasa tunayo fursa ya kusonga mfano wetu. Kwa mfano, kwa sababu mtumiaji anaidhibiti kwa kutumia kibodi na panya. Hii ni rahisi sana kufanya: kipimo*zungusha*sogeza na ndivyo ilivyo. Unaweka matrix yako kwa wima zote katika kila fremu (katika GLSL, si C++) na kila kitu kinasonga. Kila kitu ambacho hakisogei iko katikati ya "ulimwengu".

Vipeo viko kwenye anga ya dunia.Mshale mweusi kwenye mchoro unaonyesha jinsi tunavyosonga kutoka anga ya mfano hadi anga ya dunia (Vipeo vyote vilibainishwa kuhusiana na katikati ya kielelezo, lakini vikawa na uhusiano na katikati ya dunia)

Mabadiliko haya yanaweza kuwakilishwa na mchoro ufuatao:


Tazama Matrix

Hebu tusome tena nukuu ya Futurama:

“Injini haisogezi meli. Meli inabaki mahali pake, na injini husogeza ulimwengu kuizunguka."


Vile vile vinaweza kutumika kwa kamera. Ikiwa unataka kupiga picha ya mlima kutoka kwa pembe fulani, unaweza kuhamisha kamera ... au mlima. KATIKA maisha halisi hii haiwezekani, lakini ni rahisi sana na rahisi katika graphics za kompyuta.

Kwa chaguo-msingi, kamera yetu iko katikati ya Kuratibu za Ulimwengu. Ili kusonga ulimwengu wetu tunahitaji kuunda matrix mpya. Kwa mfano, tunahitaji kusogeza kamera yetu vitengo 3 kulia (+X). Hii ni sawa na kusogeza dunia nzima vitengo 3 kwenda kushoto (-X). Na wakati akili zako zinayeyuka, wacha tujaribu:


// Tumia #include na #pamoja


glm::mat4 ViewMatrix = glm::tafsiri(-3.0f, 0.0f ,0.0f);

Picha iliyo hapa chini inaonyesha hili: tunasonga kutoka anga ya Ulimwengu (wima zote zimefafanuliwa kuhusiana na katikati ya dunia kama tulivyofanya katika sehemu iliyotangulia) hadi nafasi ya Kamera (wima zote zimefafanuliwa kuhusiana na kamera).

Na kabla ya kichwa chako kulipuka kabisa, angalia kipengele hiki kizuri kutoka kwa GLM yetu nzuri ya zamani:

glm::mat4 CameraMatrix = glm::LookAt(


cameraPosition, // Nafasi ya kamera katika kuratibu za ulimwengu


kameraTarget, // hatua tunayotaka kuangalia katika kuratibu za ulimwengu


upVector// uwezekano zaidi glm:: vec3(0,1,0), na (0,-1,0) itaonyesha kila kitu kichwa chini, ambacho wakati mwingine ni kizuri pia.


Hapa kuna kielelezo cha hapo juu:


Lakini kwa furaha yetu, hiyo sio yote.

Matrix ya makadirio

Sasa tuna kuratibu katika nafasi ya kamera. Hii inamaanisha kuwa baada ya mabadiliko haya yote, kipeo kinachotokea kuwa x==0 na y==0 kitatolewa katikati ya skrini. Lakini hatuwezi kutumia tu Viwianishi vya X,Y kuelewa wapi kuteka vertex: umbali wa kamera (Z) lazima pia uzingatiwe! Ikiwa tuna wima mbili, basi moja yao itakuwa karibu na katikati ya skrini kuliko nyingine, kwani ina mratibu mkubwa wa Z.

Hii inaitwa makadirio ya mtazamo:


Na kwa bahati nzuri kwetu, matrix ya 4x4 pia inaweza kuwakilisha mabadiliko ya kuahidi:

glm::mat4 projectionMatrix = glm::mtazamo(


FoV, // Sehemu ya Mtazamo wa Mlalo kwa digrii. Au ukubwainakaribia. Vipikana kwamba « lenzi» juukamera. Kwa kawaida kati ya 90 (upana zaidi, kama jicho la samaki) na 30 (kama glasi ndogo ya kijasusi)


4.0 f / 3.0 f, // Uwiano wa kipengele. Inategemea saizi ya dirisha lako. Kwa mfano, 4/3 == 800/600 == 1280/960, inaonekana inajulikana, sivyo?


0.1 f, // Karibu na uga wa kunakili. Lazima iwekwe kubwa iwezekanavyo, vinginevyo kutakuwa na matatizo kwa usahihi.


100.0 f // Uga wa kunakili mbali. Inahitajika kuiweka ndogo iwezekanavyo.


);

Wacha turudie kile tulichofanya hivi punde:

Tumeondoka kwenye nafasi ya kamera (wima zote zimetolewa katika viwianishi vinavyohusiana na kamera) hadi kwenye nafasi moja (wima zote ziko kwenye viwianishi vya mchemraba mdogo (-1,1). Kila kitu kilicho kwenye mchemraba kimewashwa. skrini.)

Na mchoro wa mwisho:


Hapa kuna picha nyingine ili kuifanya iwe wazi zaidi kile kinachotokea tunapozidisha upuuzi huu wote wa makadirio. Kabla ya kuzidisha kwa matriki ya makadirio, tuna vitu vya bluu vilivyofafanuliwa katika nafasi ya kamera na kitu chekundu ambacho kinawakilisha uga wa mwonekano wa kamera: nafasi inayoangukia kwenye lenzi ya kamera:

Baada ya kuzidisha kwa matrix ya makadirio, tunapata yafuatayo:

Katika picha iliyotangulia, uwanja wa kutazama umegeuka kuwa mchemraba bora (na viwianishi vya vertex kutoka -1 hadi 1 pamoja na shoka zote), na vitu vyote vimeharibika kwa mtazamo. Vitu vyote vya bluu ambavyo viko karibu na kamera vimekuwa vikubwa, na vilivyo mbali zaidi vimekuwa vidogo. Kama vile katika maisha!

Huu ndio mtazamo tulio nao kutoka kwa "lenzi":

Hata hivyo, ni mraba, na tunahitaji kutumia mabadiliko mengine ya hisabati ili kufanana na picha kwa ukubwa wa dirisha.

Makadirio ya mtazamo

Tumepitia makadirio muhimu yaliyotumika katika jiometri ya kuunganisha. Wacha sasa tuendelee kuzingatia jiometri ya mtazamo na aina kadhaa mpya za makadirio.

Katika picha, uchoraji, na skrini, picha zinaonekana asili na sahihi kwetu. Picha hizi huitwa mtazamo. Sifa zao ni kwamba vitu vya mbali zaidi vinaonyeshwa kwa kiwango kidogo, mistari inayofanana kwa ujumla hailingani. Matokeo yake, jiometri ya picha inageuka kuwa ngumu kabisa, na picha iliyokamilika ni vigumu kuamua ukubwa wa sehemu fulani za kitu.

Makadirio ya mtazamo wa kawaida ni makadirio ya kati kwenye ndege yenye miale ya moja kwa moja inayopita kwenye sehemu - katikati ya makadirio. Moja ya miale inayojitokeza ni ya kawaida kwa ndege ya makadirio na inaitwa moja kuu. Hatua ya makutano ya ray hii na ndege ya makadirio ni hatua kuu ya picha.

Kuna mifumo mitatu ya kuratibu. Kwa kawaida, programu hufanya kazi na kuhifadhi data kuhusu vitu vya kijiometri katika kuratibu za dunia. Ili kuongeza ukweli, wakati wa kuandaa kuonyesha picha kwenye skrini, data kuhusu vitu kutoka kwa kuratibu za ulimwengu inabadilishwa ili kutazama kuratibu. Na tu wakati picha inaonyeshwa moja kwa moja kwenye skrini ya kuonyesha, huhamia kwenye kuratibu za skrini, ambazo ni nambari za pixel za skrini.

Mifumo miwili ya kwanza inaweza kutumika katika mifumo ya kuratibu ya pande nyingi, lakini ya mwisho tu katika mifumo miwili-dimensional. Shughuli hazibadiliki, yaani, haiwezekani kurejesha picha ya tatu-dimensional kutoka kwa picha ya makadirio ya pande mbili.

Katika tumbo hili vipengele a, d, e wanawajibika kwa kuongeza, m, n, L- kwa kuhama, uk, q, r- kwa makadirio, s- kwa upanuzi kamili, X- kwa mzunguko.

Makadirio ya nukta moja kwenye ndege z = 0

Kiini cha makadirio haya ni hii: zaidi ya kitu ni, thamani kubwa ya z-kuratibu na denominator rz + 1 inakuwa, na, kwa hiyo, kitu kidogo kinaonekana kwenye ndege ya makadirio. Wacha tufanye mahesabu rahisi na tuyaeleze kwa picha:
equation x"/F = x/(F + z inc) ni sawa na: x" = xF/(F + z inc) = x/(1 + z inc/F) = x/(1 + rz inc) , ambapo r = 1/F, F - kuzingatia.

Ili pointi ziko kwenye mstari sambamba na mhimili z, hazipotei moja baada ya nyingine, makadirio ya nukta moja kwenye mstari hutumiwa (tazama matrix ya mabadiliko na mchele. 4.2); z-coordinate imetoweka, lakini kwa kuwa vitu vya mbali vimekuwa vidogo kuliko vile vilivyo karibu, mtazamaji ana hisia ya kina. Kumbuka: hii ndiyo njia ya kwanza ya kufikisha kina kwenye ndege!

Ili kuzunguka vitu (au kamera), msingi mkubwa wa hisabati unahitajika, kwa usaidizi ambao uratibu wa vitu vyote utahesabiwa wakati unaonyeshwa kwenye skrini ya "gorofa" ya kompyuta. Ninataka kusema mara moja kwamba usipaswi kuogopa, maktaba yote ya hisabati tayari yameandikwa kwa ajili yetu, tutatumia tu. Kwa hali yoyote, huna haja ya kuruka maandishi yafuatayo, bila kujali kiwango chako cha ujuzi wa hisabati.

1. Matrices, dhana za jumla

Matrices ni nini? Wacha tukumbuke hisabati ya juu: matrix ni seti ya nambari zilizo na mwelekeo unaojulikana hapo awali wa safu na safu.

Matrices yanaweza kuongezwa, kuzidishwa na nambari, kuzidishwa na kila mmoja na mambo mengine mengi ya kuvutia, lakini tutaruka wakati huu, kwa sababu imeelezewa kwa undani wa kutosha katika kitabu chochote cha hisabati cha juu (vitabu vya kiada vinaweza kutafutwa kwenye google.com). Tutatumia matrices kama waandaaji programu, tunawajaza na kuwaambia nini cha kufanya nao, mahesabu yote yatafanywa. maktaba ya hisabati Direct3D, kwa hivyo unahitaji kujumuisha moduli ya kichwa cha d3dx9.h (na maktaba ya d3dx9.lib) kwenye mradi.

Kazi yetu ni kuunda kitu, i.e. jaza matrix na viwianishi vya vipeo vya kitu. Kila kipeo ni vekta (X, Y, Z) katika nafasi ya 3D. Sasa, ili kufanya hatua fulani, tunahitaji kuchukua kitu chetu (yaani, tumbo) na kuzidisha kwa matrix ya mabadiliko, matokeo ya operesheni hii ni. kitu kipya, iliyobainishwa kama matrix.

Direct3D inafafanua na kutumia matriki matatu kuu: matriki ya dunia, matriki ya mwonekano, na matriki ya makadirio. Hebu tuangalie kwa karibu zaidi.

Matrix ya Dunia- inakuwezesha kuzunguka, kubadilisha na kuongeza kitu, na pia hutoa kila moja ya vitu vyake mfumo wa ndani kuratibu

Kazi za kufanya kazi na matrix ya ulimwengu:

  • D3DXMatrixRotationX(), D3DXMatrixRotationY(), D3DXMatrixRotationZ() - mzunguko wa uhakika unaohusiana na moja ya shoka;
  • D3DXMatrixTranslation () - kusonga hatua kwa nafasi nyingine;
  • D3DXMatrixScale () - kuongeza.

    Tazama Matrix- inafafanua eneo la kamera ya mwonekano wa tukio na inaweza kujumuisha mchanganyiko wowote wa utangazaji na mzunguko.
    D3DXMatrixLookAtLH() na D3DXMatrixLookAtRH() huamua nafasi ya kamera na pembe ya kutazama kwa mifumo ya kuratibu ya mkono wa kushoto na kulia, mtawalia.

    Matrix ya makadirio- huunda makadirio ya tukio la 3D kwenye skrini ya kufuatilia. Kwa msaada wake, kitu kinabadilishwa, asili ya kuratibu huhamishiwa sehemu ya mbele, na ndege za mbele na za nyuma zimedhamiriwa.

    Kwa kujaza matrices haya na kufanya mabadiliko, unaunda onyesho la pande tatu ambalo unaweza kusogeza, kuzungusha, kuvuta ndani, kuondoa na kufanya vitendo vingine kwenye vitu, kulingana na mahitaji yako.

    2. Kuunda kitu

    Tunaunda mradi mpya, sawa na ile ya kwanza. Kabla hatujaendelea kutatiza msimbo wetu, hebu tuugawanye katika sehemu kwa ajili ya usomaji bora wa msimbo. Mradi wetu unaweza kugawanywa kimantiki katika vipengele vitatu:
    1. Dirisha la Windows (kuanzisha dirisha, ujumbe, ...)
    2. Uanzishaji wa 3D (kupakia viratibu vya kitu, kufuta rasilimali, ...)
    3. Utoaji wa onyesho (matrices, primitives ya kuchora, ...)
    Kwa hivyo, tutakuwa na faili 3 - window.cpp, init3d.h, render.h na maudhui yafuatayo: init3d.h- kuhamisha anuwai na miundo ya kimataifa, matamko ya kazi, kazi InitDirectX(), InitBufferVertex(), Destroy3D() toa.h- songa kazi ya RenderScene(); yote ambayo yanabaki yanahusu dirisha kuu, hii itakuwa faili - dirisha.cpp.

    Kuongeza faili ya kichwa na maktaba ya kutumia vitendaji vya matrix

    #pamoja na //au C:\DXSDK\Jumuisha\d3dx9.h #pragma comment(lib, "d3dx9.lib") //au C:\\DXSDK\\Lib\\d3dx9.lib

    Tutahitaji pia vipengele vya kawaida fanya kazi kwa wakati, kwa hivyo tunajumuisha faili ya kichwa inayolingana:

    #pamoja na

    Wacha tubadilishe umbizo la uwakilishi wa vertex:

    #fafanua D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ/D3DFVF_DIFFUSE) muundo CUSTOMVERTEX ( KUELEA x, y, z; DWORD rangi; );

    Tutatumia aina ya vertex isiyobadilishwa, kwa sababu Tutafanya mabadiliko kwa kutumia matrices.
    Tunabadilisha msimbo wa kazi ya InitDirectX (). Katika kazi hii ni muhimu kuongeza mipangilio ya njia mbili za kuonyesha.
    Zima hali ya kunakili ili wakati wa kuzunguka unaweza kuona pande zote za kitu:

    PDirectDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

    Washa wakati huu Hatutumii taa, lakini tunachora wima rangi fulani, kwa hivyo tunazima taa:

    PDirectDevice->SetRenderState(D3DRS_LIGHTING, FALSE);

    Wacha tuirahisishe mioyo yetu kwa kuifikiria kwa namna ya pembetatu tatu. Tutatumia mfumo wa kuratibu wa ndani.


    CUSTOMVERTEX stVertex= ( -1.0f, 0.5f, 0.0f, 0x00ff0000 ), ( -0.5f, 1.0f, 0.0f, 0x00ff0000 ), ( 0.0f, 0.5f, 0.0f, 0x0 ), 0. f, 0.0f, 0x000000ff ), ( 0.5f, 1.0f, 0.0f, 0x000000ff ), ( 1.0f, 0.5f, 0.0f, 0x000000ff), ( -1.0f, 0.0f, 0x. f, 0.5f, 0.0f, 0x0000ff00 ), ( 0.0f, -1.0f, 0.0f, 0x0000ff00 ), );

    3. Kuunda matrices ya mabadiliko

    Wacha tuandike katika faili ya render.h kazi ya SetupMatrix() ambamo vitendo vyote kwenye matrices vitafanyika.

    Wacha tutengeneze matrices:

  • D3DXMATRIX MatrixWorld; - matrix ya ulimwengu
  • D3DXMATRIX MatrixView; - matrix ya fomu
  • D3DXMATRIX MatrixProjection; - matrix ya makadirio
    Kuanzisha matrix ya ulimwengu

    Ili kitu kizunguke, unahitaji kupata muda wa mfumo na kila "papo hapo" hubadilisha pembe kati ya mfumo wa kuratibu wa ndani na mfumo wa kuratibu wa ulimwengu. Tutazunguka kuhusiana na mhimili wa X, kwa hiyo tunatumia kazi ya D3DXMatrixRotationX. Baada ya kuhesabu matrix ya ulimwengu, unahitaji kutumia maadili yake kwa kutumia kazi ya SetTransform:

    UINT iTime=timeGetTime()%5000; FLOAT fAngle=iTime*(2.0f*D3DX_PI)/5000.0f; D3DXMatrixRotationX(&MatrixWorld, fAngle); pDirectDevice->SetTransform(D3DTS_WORLD, &MatrixWorld); Kuweka matrix ya kutazama

    Tunaweka kamera mahali pazuri na kuielekeza kwenye kitu

  • D3DXMatrixLookAtLH(&MatrixView, - matokeo ya chaguo la kukokotoa
  • &D3DXVECTOR3(0.0f, 0.0f, -8.0f), - mahali ambapo kamera iko
  • &D3DXVECTOR3(0.0f, 0.0f, 0.0f), - mahali tunapoangalia
  • &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); - juu ya kitu

    Baada ya kuhesabu, ni muhimu kutumia maadili yaliyopatikana.

  • Katika somo la mwisho tulizungumza juu ya makadirio muhimu zaidi yanayotumiwa katika jiometri ya ushirika. Wacha sasa tuendelee kuzingatia jiometri ya mtazamo na aina kadhaa mpya za makadirio.

    Katika picha, uchoraji, na skrini, picha zinaonekana asili na sahihi kwetu. Picha hizi huitwa mtazamo. Sifa zao ni kwamba vitu vya mbali zaidi vinaonyeshwa kwa kiwango kidogo, mistari inayofanana kwa ujumla hailingani. Matokeo yake, jiometri ya picha inageuka kuwa ngumu kabisa, na ni vigumu kuamua ukubwa wa sehemu fulani za kitu kutoka kwa picha ya kumaliza.

    Mtazamo wa kawaida wa makadirio ni makadirio ya kati kwenye ndege yenye miale ya moja kwa moja inayopita kwenye uhakika, katikati ya makadirio. Moja ya miale inayojitokeza ni ya kawaida kwa ndege ya makadirio na inaitwa moja kuu. Hatua ya makutano ya ray hii na ndege ya makadirio ni hatua kuu ya picha.

    Kuna mifumo mitatu ya kuratibu. Kwa kawaida, programu hufanya kazi na kuhifadhi data kuhusu vitu vya kijiometri katika kuratibu za dunia. Ili kuongeza ukweli, wakati wa kuandaa kuonyesha picha kwenye skrini, data kuhusu vitu kutoka kwa kuratibu za ulimwengu inabadilishwa ili kutazama kuratibu. Na tu wakati picha inaonyeshwa moja kwa moja kwenye skrini ya kuonyesha, huhamia kwenye kuratibu za skrini, ambazo ni nambari za pixel za skrini.

    Mifumo miwili ya kwanza inaweza kutumika katika mifumo ya kuratibu ya pande nyingi, lakini ya mwisho tu katika mifumo miwili-dimensional. Shughuli hazibadiliki, yaani, haiwezekani kurejesha picha ya tatu-dimensional kutoka kwa picha ya makadirio ya pande mbili.

    Matrix ya mabadiliko ya mtazamo wa jumla

    Katika tumbo hili vipengele a, d, e wanawajibika kwa kuongeza, m, n, L kwa kuhama, uk, q, r kwa makadirio, s kwa upanuzi wa kina, X kwa mzunguko.