


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: