Crearea imaginilor stereo - lecții 3ds max

Aproape toți au văzut imagini stereo, de exemplu, îmi amintesc că la școală aveam notebook-uri pe coperta cărora au fost tipărite de neînțeles scrawl. Dar dacă te uiți la ei "drept" - aceste morminte au câștigat volum. Nu toți i-au putut vedea imediat, cui era simplu, dar cine nu putea. Există mai multe recomandări despre cum să realizați iluzia volumului: să arătați "prin" imaginea sau să o atașați strâns la nas și să vă retrageți încet.







Cum percepe o persoană volumul? Cu cât obiectivul este mai aproape, cu atât observatorul "reduce" ochii. astfel dacă obiectul în cauză se află la o distanță infinit îndepărtată, ochii îl vor privi "în paralel".

Crearea imaginilor stereo - lecții 3ds max

Acum, ia în considerare modul de a obține iluzia de volum într-o imagine plat. Deci, avem o persoană cu două ochi (fig.1): ochiul stâng O1 și dreapta O2, precum și planul de proiecție al imaginii stereo D1 D2. Fie ca obiectul B să fie situat la o distanță h de observator. Apoi, pentru a "vedea" aceasta în imagine, este necesar să se potrivească modelului la punctele B1 și B2. Se pare că ținem un model plat în fața noastră și căutăm ca și cum ar fi "prin" el. Ochiul stâng vede punctul B1. dreapta B2. imaginile pentru ele pe coală coincid și se creează o iluzie care, de fapt, vedem obiectul B. situat în spatele planului foii. astfel cu cât este mai mare distanța dintre punctele B1 și B2, în care imaginea coincide, "mai departe" este obiectul perceput B.

Acum vom deduce o serie de formule computaționale care vor fi utile pentru calcularea imaginii stereo. Fie distanța dintre ochi, H distanța până la obiectul cel mai îndepărtat, h distanța față de obiectul h_max, distanța de la cel mai îndepărtat obiect până la planul proiecției imaginii stereo. Din similitudinea triunghiurilor BB1 B2 și BO1 O2 urmează B1 B2 / BE = O1O2 / BF. B1 B2 = d. O1 O2 = a. BF = h. BE = BF-EF. EF = AF-AE = H-hmax. BE = h- (H-h_max). Total d / (h-H + h_max)) = a / h.

Poate că există încă teorie suficientă, puteți merge la practică. Acest lucru va necesita Photoshop și 3dsMAX. În Photoshop vom crea o textură, din care va fi construită o imagine stereo în viitor. Câteva recomandări: cu cât mai multe detalii se referă la textură, cu atât va fi mai bine să obțineți versiunea finală (cu monofonic, în general, nu se întâmplă nimic); Înălțimea texturii trebuie să coincidă cu înălțimea imaginii (deci trebuie să determinați imediat dimensiunea imaginii stereo finale); iar lățimea depinde de locul în care intenționați să utilizați imaginea care rezultă în viitor. În figura 1, valoarea d_max corespunde doar lățimii texturii, deci în realitate (pe ecranul monitorului sau după imprimare), nu trebuie să depășească distanța dintre ochi a. În același timp, cu cât mai mulți pixeli în lățime vor fi în textura originală, cu atât mai calitativ va fi rezultatul final. Am această textură:

Lățimea sa este de 100 de pixeli, iar înălțimea este de 600 (în final mă aștept să obțin o imagine stereo de 800 cu 600 de pixeli). Deși este mai bine să se facă astfel încât să se înclină orizontal. Apoi, creați sau deschideți orice obiect 3D în MAX'e. Am folosit modelul de viespe pentru aceasta:

Pentru rezultat, nu sunt utile nici materialele, nici redistribuitorii de la terți, nici sursele de lumină. Deci, dacă toate acestea se află în scenă, atunci atribuiți întregului material standard, ștergeți toate sursele de lumină și utilizați Implicit Scanline Renderer. Acum puteți începe să scrieți un scenariu. Pentru aceasta, selectați MAXScript -> Script nou în meniul Max și deschideți fereastra de editare a scriptului. Scenariul nostru va avea interfața proprie. Acest lucru se poate face în două moduri: pe panoul Utilities sau într-o fereastră separată. Alegeți prima opțiune și creați un nou utilitar script:

utilitate stereoImg "Stereo Image"

-- Funcție de creare a imaginii stereo

Deci, lista elementelor necesare: două grupuri Textură și Render. În grupul Textură, există o etichetă în care vor fi afișate informațiile de textură și un buton care lansează dialogul de deschidere a fișierului cu o textură. În Render grupul - Spinner (renderer determină lățimea), eticheta (informații cu privire la înălțimea de redare), Spinner (imagine stereo de calitate), bara de progres, butonul de selectare obiect și butonul „cel mai important“ pentru a rula script-uri pe o eroare de calcul. Pentru a face acest lucru, adăugați următoarele linii la corpul utilitarului:

fn fltr_cam obj = superClassOf obj == funcția de cameră - returnează true dacă camera de tip obj (pentru filtrul de selecție)

eticheta l_T_img "fără textură" - informații despre dimensiune

butonul b_T_img "Load bitmap texture" - textură de încărcare

eticheta l_R_h "înălțime: 0" - înălțime

spinner s_R_prec "calitatea imaginii stereo" rază de acțiune: [1, 10, 4] Tip: Lățime #integer: 80 align: #right - imagine stereo de calitate

progressBar valoarea prb_R_status: 0 - realizarea progresului







butonul de selectare pb_R_cam "Selectați camera" filtru: fltr_cam peste: 2 - selectarea camerei

butonul b_R_stereo ""- lansați redarea

La începutul corpului de utilitate (înainte de a descrie elementele utilizatorului), definim variabilele locale necesare pentru a crea o imagine stereo:

-- definirea variabilelor locale

lățimea locală, înălțimea, d_max - lățimea și înălțimea tencuielii, lățimea texturii

Rămâne să înregistrați manipulatorii de evenimente din elementele interfeței utilizator. Descrierea tuturor evenimentelor ar trebui să fie după cum urmează:<имя элемента> <название события> <список аргументов>(<обработка события>). În primul rând, vom descrie comportamentul MAX'a la click pe textura butonului de încărcare. Ce ar trebui să se întâmple: deschide caseta de dialog de selectare a fișierului, după ce selectați fișierul textura este încărcat în MAX, afișate sub formă de informații cu privire la dimensiunea și textura numelui său, apoi inițiat de variabile locale și configurați setările globale pentru redare.

T_file_name = getOpenFileName tipuri: "bitmap (* .bmp) | * .bmp" - dialog de deschidere a fișierului

b_T_img.caption = numele fișieruluiFromPath T_file_name - numele butonului fișierului imagine

d_max = T_img.width - actualizați toate variabilele locale

lățime = 4 * înălțime / 3 ca Integer - determinați lățimea rufelor astfel încât raportul rezultat să fie 3: 4

s_R_w.value = width - afișează informații despre rezoluția rendere

renderWidth = width - setarea parametrilor globali de randare (lățime, înălțime)

Definiți tipul pe care dorim să-l primim pe imaginea stereo. Pentru asta avem nevoie de o cameră. Dacă există deja camere de luat vederi în scenă cu vizualizarea "dreapta" - excelentă, le puteți folosi. Dacă nu, trebuie să creați o cameră foto. Cea mai ușoară cale este să accesați vizualizarea Perspectivă, unde puteți selecta vizualizarea corespunzătoare. Apoi creați camera din vizualizare: în meniul principal Creare -> Camere -> CreareCameraFromView sau Crtl + C. Amintiți-vă teoria, au existat parametri ca distanța H la cel mai îndepărtat obiect și h_max - distanța de la planul de proiecție la cel mai îndepărtat obiect. Ca să nu le introducem manual, le vom lua din proprietatea camerei, și anume de la Clipping Airplanes. Selectați camera dorită, pe panoul Modificați, deschideți parcurgerea parametrilor. puneți o bifă lângă Clip manual. Rămâne doar să configurați Near Clip și Far Clip. Planul Near Clip corespunde planului de proiecție a imaginii stereo, iar Far Clip este distanța până la cel mai îndepărtat obiect. Recomandări: obiectele pe care să se construiască o imagine stereo, ar trebui să fie situate între Far Clip și Near Clip. Aproape Clip este de aproximativ jumătate din clipul Far. obiectele ar trebui să fie situate departe de Clip apropiat și aproape de Far Clip. Deși acest lucru poate fi neglijat și experimentarea în continuare cu planuri de tăiere. pentru a obține un rezultat mai dorit. astfel vizualizarea este configurată, rămâne să "explicăm" scenariul pe care îl vom folosi cu această cameră, pentru aceasta scriem mânuitorul apăsând butonul de selectare a camerei:

pb_R_cam.caption = pb_R_cam.object.name - pe butonul pentru numele camerei

-- procesarea lățimii ranforsării

Rămâne să se ocupe de ultimul eveniment - apăsând butonul "cel mai important". Din nou, trebuie să studiem teoria pe baza formulei obținute anterior: d / (h-H + h_max)) = a / h. Aici a. H și h_max sunt constante. Ultimele doua sunt obtinute de la camera de avioane Clipping. Definiți a. pentru aceasta înlocuim h valoarea H - cazul extrem când obiectul este la distanța maximă. Prin urmare, a = d_max * H / h_max. Și ultima formulă: d = a * (h-H + h_max) / h - calculează distanța dintre punctele d. imaginile în care coincid, pentru a crea iluzia că obiectul în cauză este situat la o distanță h de observator.

-- calcularea greșită a imaginii stereo

DOF_img = camera de redare: pb_R_cam.object lățimea de ieșire: lățimea ieșirii: canalele înălțime: # (#zDepth)

-- crearea bitmap pentru imaginea stereo viitoare

-- umplerea primei benzi cu o textura

afișează OUT_img - deschide fereastra cu imaginea stereo finală

Apoi, există o scanare de linie a canalului de adâncime (cu o verificare pentru a se asigura că distanța nu depășește camera Far Clip). Pe baza acestei valori a h (în scriptul dist) și a formulelor obținute mai devreme, se calculează distanța dintre pixelii repetate. Astfel, se construiește o imagine stereo, iar evoluția calculelor este actualizată în același timp. În final, rezultatul final este afișat pe ecran (figura 7).

Mai jos este o listă completă a script-utilitar cu unele îmbunătățiri:

utilitate stereoImg "Stereo Image"

-- Funcție de creare a imaginii stereo

-- definirea variabilelor locale

lățimea locală, înălțimea, d_max - lățimea și înălțimea tencuielii, lățimea texturii

fn fltr_cam obj = superClassOf obj == funcția de cameră - returnează true dacă camera de tip obj (pentru filtrul de selecție)

eticheta l_T_img "fără textură" - informații despre dimensiune

butonul b_T_img "Load bitmap texture" - textură de încărcare

eticheta l_R_h "înălțime: 0" - înălțime

spinner s_R_prec "calitatea imaginii stereo" rază de acțiune: [1, 10, 4] Tip: Lățime #integer: 80 align: #right - imagine stereo de calitate

progressBar valoarea prb_R_status: 0 - realizarea progresului

butonul de selectare pb_R_cam "Selectați camera" filtru: fltr_cam peste: 2 - selectarea camerei

butonul b_R_stereo ""- lansați redarea

T_file_name = getOpenFileName tipuri: "bitmap (* .bmp) | * .bmp" - dialog de deschidere a fișierului

b_T_img.caption = numele fișieruluiFromPath T_file_name - numele butonului fișierului imagine

d_max = T_img.width - actualizați toate variabilele locale

lățime = 4 * înălțime / 3 ca Integer - determinați lățimea rufelor astfel încât raportul rezultat să fie 3: 4

s_R_w.value = width - afișează informații despre rezoluția rendere

renderWidth = width - setarea parametrilor globali de randare (lățime, înălțime)

prb_R_status.value = (100 * x / d_max) ca număr întreg - actualizarea progresului operațiunii curente

-- redând o imagine stereo "extinsă"

H = pb_R_cam.object.farclip - distanța de la ochi la adâncimea maximă

h_max = pb_R_cam.object.farclip - pb_R_cam.object.nearclip - distanța de la planul de proiecție la max. adâncime

-- construirea progresivă a imaginii stereo ("extinsă")

-- luam din raza de profunzime distanta de la camera pana la cel mai apropiat punct (aici, de asemenea, exista o netezire liniare)

-- obținând de la imaginea stereo "normală" extinsă

FIN_img = bitmap (lățime + d_max) culoare înălțime: negru - creați un bitmap pentru imaginea stereo finală

afișați FIN_img - deschideți fereastra cu imaginea stereo finală

Modificarea aici este doar în algoritmul de redare a imaginii stereo. A fost adăugat un cec "de la nebun": calculul greșit nu va începe dacă textura și camera nu au fost selectate. De asemenea, a fost implementat un algoritm pentru calculul "îmbunătățit" al unei imagini stereo folosind un spinner "de calitate". Pe scurt, ceea ce este: imaginea este inițial liniară întinsă și greșeala este, de asemenea, "întinsă", iar rezultatul este comprimat la dimensiunea originală. Diferența poate fi văzută în figura 7, figura 8, figura 9.

În figura 7, calitatea este setată la una, iar în figura 8 și respectiv în figurile 9-4 și respectiv 8. Desigur, cu cât este mai bună calitatea, cu atât este mai mare timpul de redare.

Asta e tot. Acum avem un script-utilitar, cu ajutorul căruia puteți obține o imagine stereo de la orice obiect 3D. Chiar sper ca lectia a fost de inteles (pentru asta ar trebui sa fiti prieteni cu geometria :) si folositori (cel putin prin faptul ca puteti vedea cu adevarat modelele "in volum").







Articole similare

Trimiteți-le prietenilor: