Autostereogrammas

Effekts var būt labāks atverot attēlus pilnā izšķirtspējā
Autostereogrammas, 2004.

Piezīme: ja jums nav gadījies sastapties ar autostereogrammām, jūs varat ievadīt “how to view stereograms” jebkurā interneta meklētājā, lai iegūt daudzpusīgus padomus, kā ieraudzīt 3D efektu. Īsumā – mērķis ir panākt lai attēls fokusēti dubultojās un katra acs redz savu atkārtotās tekstūras fragmentu. To var būt vieglāk panākt sākot ar attēlu tuvu acīm, skatoties caur to dziļumā un pamazām attālinot attēlu cenšoties skatīties nedaudz tālāk, nekā attēls patiesībā ir.

Esot ieinteresētam 3D un, konsekventi, dziļuma uztverē, manu uzmanību piesaistīja stereogrammas. It īpaši attēla atkārtojuma autostereogrammas (stereo attēli), kā tās, kuru gala produktam piemīt tehnoloģiskā vienkāršība un pašpietiekamība, esot vienlaicīgi vissintētiskākām. Izpratnē, ka tās ir relatīvi tīras un atdalītas no attēla, dziļuma uztveres veids. Šāda tipa autostereogrammu veids ir pazīstams arī zem brenda “Maģiskā acs” vai “Magic Eye”.

Pēc nelielas eksperementēšanas, darbības princips šķita samērā vienkāršs un es izveidoju rudimentāru programmu autostereogrammu radīšanai. Galvenokārt, darbības mehānisms ir horizontālā nobīdē atkārtojamas tekstūras pikseļiem, proporcijā pret tiem nepieciešamo dziļumu (dziļuma karte, “z-bufferis”) un tekstūras atkārtošanās platumu.

Galvenās funkcijas izejas kods:

[+] Parādīt

[-] Paslēpt

/* Note: I was self-teaching programming at the time, hence the dreadful form. The source is mostly provided as a future note to myself :) Might replace with a proper version if I get back to stereograms. */ double emi,dem,per,dr,dg,db,x1,x2; unsigned __int8 cr,cg,cb,fr,fg,fb; emi=(double)255/100*CSpinEdit2->Value;//Depth -% of 255, UI? for(int z=(Image1->Width/CSpinEdit1->Value)-1; z>=0; z--){//CSpinEdit1: Pereod size //iterate for every pattern repetition? for(int x=Image1->Width; x>0; x--){ for(int y=0; y<Image1->Height; y++){ //get depth dem=(double)GetRValue(Image2->Canvas->Pixels[x][y])/100*CSpinEdit2->Value;//depth magnitude for(per=dem; per>=1; per--){}//I didn't know how to modulo??? x1=x-(z*CSpinEdit1->Value)-(dem-per); x2=x-(z*CSpinEdit1->Value)-(dem-per+1); if(x1<0) {cr=GetRValue(Image1->Canvas->Pixels[x1+Image1->Width][y]); cg=GetGValue(Image1->Canvas->Pixels[x1+Image1->Width][y]); cb=GetBValue(Image1->Canvas->Pixels[x1+Image1->Width][y]);} else {cr=GetRValue(Image1->Canvas->Pixels[x1][y]); cg=GetGValue(Image1->Canvas->Pixels[x1][y]); cb=GetBValue(Image1->Canvas->Pixels[x1][y]);} if(x2<0) {fr=GetRValue(Image1->Canvas->Pixels[x2+Image1->Width][y]); fg=GetGValue(Image1->Canvas->Pixels[x2+Image1->Width][y]); fb=GetBValue(Image1->Canvas->Pixels[x2+Image1->Width][y]);} else {fr=GetRValue(Image1->Canvas->Pixels[x2][y]); fg=GetGValue(Image1->Canvas->Pixels[x2][y]); fb=GetBValue(Image1->Canvas->Pixels[x2][y]);} if(per!=0)dr=(fr*per)+(cr*(1-per)); else dr=cr; if(per!=0)dg=(fg*per)+(cg*(1-per)); else dg=cg; if(per!=0)db=(fb*per)+(cb*(1-per)); else db=cb; Image1->Canvas->Pixels[x-(z*CSpinEdit1->Value)][y]=RGB(dr,dg,db); }}Image1->Refresh();} ShowMessage("Complete!");

Dziļuma kartes:

Pievienot komentāru:  (pirmie divi lauki ir obligāti)

Publicējot komentāru, jūs piekrītat, ka jūsu IP adrese tiks saglabāta šajā vietnē, lai palīdzēt izvairīties no spama. Vārds/e-pasts/links ir opcionāli un arī var tikt saglabāti. E-pasta adrese netiks publicēta un paredzēta, lai pasargāt jūsu komentāru no nepatiesiem autorības apgalvojumiem, kā arī priekš atbildes komentāriem, ja izvēlaties tos saņemt. Lasīt vairāk.

Komentāri parādās pēc apstiprināšanas, kas var aizņemt kādu laiku.