Syvyyskarttojen luominen PovRay -ohjelmalla

Kirjoittaja: Paul Bourke
Syyskuu 2019


Seuraavaksi esittelemme, miten syvyyskarttoja voidaan luoda PovRay -ohjelmalla. Stereoskopiassa on useita sovelluksia, mutta tämän artikkelin kirjoittamishetkellä motiivina oli luoda syvyyskarttoja FaceBookin 3D-mallikuville. Nämä ottavat kuvan sekä siihen liittyvän syvyyskarttakuvan, jolloin katsoja voi muuttaa näköpistettään hiukan vasemmalle-oikealle-ylös-alas.

Alla on esimerkki siitä, mitä FaceBook hyväksyy, kun 3D-malli ladataan. Se koostuu pääkuvasta ja toissijaisesta kuvasta, jolla on sama nimi, mutta lisätekstinä "_depth". Ilmeisesti näiden odotetaan vastaavan toisiaan ja ne luodaan samasta näkymästä. Tässä toissijaisessa kuvassa valkoinen tarkoittaa kameran lähellä olevia objekteja ja musta kauempana olevia objekteja.


Ensisijainen kuva: Elephant.png

Toissijainen kuva: Elephant_depth.png

Syvyyskarttoja voidaan luoda useilla eri tavoilla. Esimerkiksi alueita voidaan peittää manuaalisesti ja syvyyskarttoja voidaan luoda kuvankäsittelypaketissa. Syvyyskarttoja voidaan luoda ottamalla useita (vähintään 2) valokuvia esineestä tai näkymästä ja käyttämällä fotogrammetrisiä tekniikoita syvyyskarttojen muodostamiseen. Tässä artikkelissa aiomme esitellä vain, miten PovRay-ohjelmaa voidaan käyttää olemassa olevan 3D-mallin syvyyskarttojen luomiseen. Periaatteet ovat todennäköisesti samanlaisia muissa renderointipaketeissa, mutta terminologia on erilainen. Esimerkiksi jäljempänä esitettyä viittausta gradienttipigmenttiin kutsutaan muissa pakkauksissa varjostimeksi.

PovRayn perusominaisuudet, joita voidaan käyttää syvyyskarttojen luomiseen, ovat "gradientin" pigmentin ja "colour_maps" -värikarttojen yhdistelmä. Gradienttipigmentti tuottaa luvun väliltä 0–1 riippuen objektin pinnalla olevan pisteen asennosta. Colour_map -värikarttaa käytetään kyseisen arvon kartoittamiseen mustavalkoiseen luiskaan, joka lopulta kartoitetaan takaisin syvyyteen. Tässä voidaan käyttää seuraavaa PovRay-koodinpätkää.

   #declare thetexture = texture {
      pigment { 
         gradient z
         color_map {
            [0 color rgb <0,0,0> ]
            [1 color rgb <1,1,1> ]
          }
         scale <1,1,ZMAX-ZMIN>
         translate <0,0,ZMIN>
      }
      finish { ambient 1 diffuse 0 specular 0 }
   }

Huomioita edellisestä:

  • Mallin oletetaan suuntautuneen siten, että tarkoitettu syvyyskartta kulkee z-akselia pitkin. Kameran sijainnin oletetaan olevan samoin z-akselilla.

  • Oletetaan, että muuttujat ZMIN ja ZMAX on ilmoitettu aiemmin. Nämä kartoittavat gradientin alueen 0 -> 1 arvoon zmin -> zmax.

  • Gradienttipigmentti on säännöllinen, joten mallin syvyys on rajoitettava rajoihin. Tähän mittakaava- ja käännöskomennot pyrkivät.

  • Mallin geometrian oletetaan olevan yhden liitosyksikön {} sisällä ja siinä ei ole olemassa olevia pintakuvioita. Esimerkiksi

    union { 
       object { modelpart1 }
       object { modelpart2 }
           etc
       texture { thetexture }
    }
    

Toinen esimerkki. Nämä ovat tiilinorsuja, jotka pitelevät tasoa, jolle stupa on rakennettu, ja se sijaitsee Sukhothaissa, Thaimaassa.



Esimerkki Siew San Tengin temppelistä Kuchingista, Itä-Malesia.