Lage dybdekart ved hjelp av PovRay

Skrevet av Paul Bourke
September 2019


Følgende er en kort instruksjonsguide for hvordan du lager dybdekart ved hjelp av PovRay. Det er forskjellige bruksområder innen stereoskopi hvorfor man kanskje ønsker å gjøre dette, men motivasjonen i skrivende stund var å lage dybdekart for FaceBooks “3D-modell” -bilder. Disse tar et bilde sammen med et tilhørende dybdekartbilde slik at en seer kan endre synspunktet fra venstre til høyre og opp.

Et eksempel på hva FaceBook godtar når en 3D-modell lastes opp, er illustrert nedenfor. Det består av det primære bildet sammen med et sekundært bilde med samme navn, men med “_depth” vedlagt. Det er klart at disse forventes å matche, det vil si gjengitt fra samme synsposisjon. I dette sekundære bildet refererer hvitt til objekter i nærheten av kameraet og svart på gjenstander lenger unna.


Primærbilde: Elephant.png

Sekundærbilde: Elephant_depth.png

Dybdekart kan genereres på en rekke forskjellige måter. For eksempel kan man manuelt maskere regioner med nesten konstant dybde og lage dybdekart i en bildedigeringspakke. Dybdekart kan opprettes ved å ta et antall (2 eller flere) fotografier av et objekt eller scene og ved hjelp av fotogrammetriske teknikker stammer dybdekart. I diskusjonen her skal vi bare presentere hvordan du bruker PovRay til å lage dybdekart over en eksisterende 3D-modell. Prinsippene vil sannsynligvis være like i andre renderingspakker, men terminologien vil være forskjellig. For eksempel vil referansen nedenfor til et gradientpigment i andre pakker bli kalt en shader.

De grunnleggende funksjonene i PovRay som kan brukes til å lage dybdekart er en kombinasjon av et “gradient” pigment og “colour_maps”. Et gradientpigment genererer et tall mellom 0 og 1 avhengig av plasseringen i rommet til et punkt på overflaten av objektet. Et fargekart brukes til å kartlegge den verdien til svart-hvit rampe som til slutt blir kartlagt tilbake til dybden. Følgende PovRay-kodebit for tekstur kan brukes.

   #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 }
   }

Merknader om ovennevnte:

  • Modellen antas å være orientert slik at det tiltenkte dybdekartet er langs z-aksen. Kameraposisjonen antas på samme måte å være langs z-aksen.

  • Det antas at variablene ZMIN og ZMAX tidligere er blitt erklært, disse kartlegger gradientområdet fra 0 -> 1 til zmin -> zmax.

  • Gradientpigmentet er periodisk, så modelldybden må være inneholdt med grensene. Dette er hva skalaen og oversettelseskommandoene oppnår.

  • Modellenes geometri antas å være innenfor en enhet {} enhet og har ingen eksisterende strukturer brukt. For eksempel

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

Et annet eksempel. Dette og det siste er murte elefanter som holder opp en plattform som en stupa er bygget på, som ligger i Sukhothai, Thailand.