2012. február 5., vasárnap

LEGO képek készítése POV-Ray-jel

Többen kértétek, hogy írjak arról, hogyan készítettem fotorealisztikus képeket a Trabiról, a MiG-15-ösről vagy éppen a kockagyáron levő magyar tájakról és épületekről. Jöjjön hát, aminek jönnie kell!

Mielőtt belevágunk, szeretném előre leszögezni, hogy a dolog bonyolult és időigényes. Csak akkor vágj bele, ha készen állsz arra, hogy sajád magad szerkessz programhoz hasonló szövegfájlokat és kézzel telepíts, tömöríts és rendezzgess fájlokat. Szükség van hozzá néhány órára, némi hibakresésre, és még több időre ahhoz, hogy a gép kiszámolja a végleges képet.

Oké, aki eddig eljutott, azt már legalább alapszinten érdekli a dolog. Az útmutató Koyan kiváló útmutatóján alapul (angol) néhány csavarral. Lássuk, hogyan készül egy tipikus kép!

1. lépés: Telepítem az LDraw-ot. Az LDraw egy önkéntesek által készített LEGO kocka-adatbázis, amire szükségünk lesz a fotorealisztikus képek készítéséhez. Ahogy sejthető, erre a lépésre csak egyszer van szükség. Letöltöm és kicsomagolom az alábbiakat:
  • LDraw hivatalos elemek (Core Files and Libraries / LDraw Parts Library, zip format). A fájlt kitömörítem egy könyvtárba a gépemen, ez lesz az LDraw könyvtár.
  • Sok kocka nem szerepel a hivatalos release-ben, így aztán letöltöm az LDraw nemhivatalos elemeket is. Ezeket is kitömörítem, és bemozgatom az LDraw könyvtárba. Néhány fájl már létezni fog, ezeket nem írom felül.
  • Az LGEO egy másik elemkönyvtár, ami kifejezetten POV-Ray-hez készült. Kevesebb elemet tartalmaz, de ami benne van, az kifejezetten szép és részletes. Ezt is letöltöm és kitömörítem egy másik könyvtárba.
| A bazilika eredetije Lego Digital Designerben |

2. lépés: Átkonvertálom a modellemet LDraw formátumba (.ldr). Erre több lehetőségem van:
  • Eleve LDraw szerkesztőben készítem a modellt. Több ilyen program is van, a népszerűbbek megtalálhatóak az LDraw Downloads oldalon. Mivel én Mac-en dolgozom, a Bricksmith-t használom. Úgy hallottam, Windows-on az MLCad az egyik legjobb.
  • Lego Digital Designer-ben tervezem a modellt. Jómagam általában ezt csinálom, mivel szerintem ezt a szerkesztőt a legegyszerűbb használni. LDD-ből ki lehet exportálni a modellt LDraw formátumba. Azért készülj fel rá, hogy kockák hiányozni fog vagy rosszul lesznek elhelyezve. Ezeket kézzel javítom egy LDraw szerkesztővel.
| Az LDraw modell Bricksmith-ben a hiányzó kockák visszapótlása után. |

3. lépés: Megnézem, hogyan néz ki a modellem LDView-ben: nem hiányoznak-e kockák, stb. Az LDView-ben könnyen találhatunk jó kameraállásokat is.

| Ez látszik LDView-ben. |

4. lépés: Ha az alkotás jól néz ki a szerkesztőben és LDView-ben, itt az ideje, hogy POV-Ray formátumba konvertáljam (.pov). Fontos, hogy a .ldr fájl pontos legyen, ha egyszer átkerült .pov formátumba, onnantól csak szövegszerkesztővel lehet módosítani rajta. A konvertáláshoz az L3P programot használom. Ehhez a programhoz van több felhasználói felület, én az L3P Launcher-t szoktam használni (szintén csak Mac-re). Úgy hallottam, Windows-on jól pótolja az L3Pao.
  • Mivel csak a modellre van szükségem, kikapcsolom a fényforrásokat (light source) és kamerákat (camera). Egyedül a -lgeo paraméterre van mindenképpen szükség, így az L3P az LGEO elemeket fogja használni, amennyire lehetséges.
  • Ha kész a .pov fájl, megnyitom egy szövegszerkeszővel és megjegyzésbe teszem az alábbi részeket a // és /* */ használatával:

    // #declare L3Bumps = 0;  // 1=on 0=off

    // #declare L3Ambient = 0.4;
    // #declare L3Diffuse = 0.4;
    // #declare L3Ior     = 1.25;
    // #declare L3NormalBumps = normal { bumps 0.01 scale 20 }
    // #declare L3NormalSlope = normal { bumps 0.3 scale 0.5 }
  • Ugyanezt teszem a kamera és fényforrás beállításokkal a fájl vége felé:

    /*
    //// Camera
    // L3P's automatic camera positioning was based on the following:
    // ...
    camera {
    ...
    }
    ...
    light_source {
    <-286.921,-614.005,165.654>  // Latitude,Longitude,Radius: 60,-120,662.616
    color rgb <1,1,1>
    }
    */
5. lépés: Letöltök és kitömörítek néhány include fájlt, amire szintén szükség lesz. Az LDraw telepítéshez hasonlóan erre is csak egyszer van szükség:
6. lépés: Telepítem a POV-Ray-t és a MegaPOV-ot a számítógépre. Ez a két program ugyanannak a szabad szoftvernek két különböző változata:
  • Általában a MegaPOV-ot használom. A legutlsó változat az 1.2.1, innen lehet letölteni:
    http://megapov.inetart.net/download.html
  • A POV-Ray-re akkor is szükség van, ha a képeket MegaPOV-val készítem, ugyanis szükség van néhány másik include fájlra. A legutolsó változat a 3.6.2 vagy 3.6.1, operációs rendszertől függően:
    http://www.povray.org/download/
  • Érdemes kipróbálni a POV-Ray 3.7-es bétáját is. Hiányzik belőle néhány MegaPOV dolog (például az adaptív radiosity), cserébe viszont támogatja a többmagos processzorokat, ami jelentős gyorsulást jelent:
    http://www.povray.org/beta/
    (Mac-esek itt próbálkozhatnak.)
Bármelyiket is választom, az alábbi könyvtárakat fel kell vennem a rendszer include könyvtárak közé:
  • koyancolors könyvtár
  • lg_colors könyvtár
  • a POV-Ray /include könyvtár
  • az LGEO /lg könyvtár
7. lépés: Bár a modell tipikusan sima háttéren van, sokkal jobban néz ki, ha valamilyen környezet fényei tükröződnek rajta. Ehhez HDR fénymintákra (HDR light probe) van szükségem. Ezek a minták határozzák meg, hogy melyik rányból mennyi fény érkezik az alkotásunkra. Ha HDR mintákat használunk, az egyes irányokból érkező fény nagyon különböző lehet, mint a valóságban. Néhány oldal, ahol ilyen mintákat lelhetünk:
8. lépés: Elkészítem a fájlokat. A már meglevő .pov szükség lesz még két másikra:

Model.inc: ebben vannak a fényforrások, a kamera és a radiosity beállítások:

#version unofficial MegaPov 1.20;
// POV-Ray 3.7 eseteben a fenti sor: #version 3.6

// Az osszes feny a kepen. Ha a kep tul sotet vagy tul vilagos, ezt
// lehet allitgatni.
#declare LIGHT = 1.3;

// Radiosity beallitasok.
#declare LDRAW_MTL = 30;
#declare INDEXOFREFRACTION=1.52;
#declare RADIOSITY = 1;

global_settings {
  assumed_gamma 1.4
  max_trace_level LDRAW_MTL
  #ifdef (RADIOSITY)
    radiosity {
      adaptive  // Ezt a POV-Ray 3.7 nem erti, vedd ki
      pretrace_start 0.08
      pretrace_end   0.004
      count 400
      nearest_count 5
      error_bound { 0.2 adaptive 1.5 10 }
      // POV-Ray 3.7 eseten a fenti sor: error_bound 0.2
      recursion_limit 1
      low_error_factor 0.7
      gray_threshold 0
      minimum_reuse 0.01
      brightness 1.0
      adc_bailout 0.01/2
  }
  #end
  photons {
      count 300000
      autostop 0
      jitter .4
  }
}

#ifdef (RADIOSITY)
// A feny mintat egy gombre tesszuk, ami joval nagyobb, mint a modell.
sphere {
  <0,0,0>,100000
  pigment {
    // Lasd http://www.povray.org/documentation/view/3.6.1/408/
    image_map { hdr "../probes/20061210_hd.hdr" once interpolate 2 map_type 1 }
  }

  // Ezt eleg fontos jol eltalalni, kulonben a feny lentrol vagy oldalrol
  // jon majd. Keszits nehany teszt kepet nagy kamera szoggel (angle) es
  // akkor latszani fog.

  rotate<180, 0, 0>
  finish { ambient 3.5*LIGHT diffuse 0 }
  hollow  
}

// Altalaban beteszek a kepbe egy vilagito negyzetet is.
light_source {
  <200, -5000, 0>
  color rgb 0.5*LIGHT
  area_light <1000, 0, 0>, <0, 0, 1000>;, 20, 20
  adaptive 1
  jitter
}
#end

// Beallitjuk azokat, amiket megjegyzesbe tettunk a masik .pov fajlban.
#declare L3Bumps = 1;  // 1=on 0=off
#declare L3NormalBumps = normal { bumps 0.01 scale 20 }
#declare L3NormalSlope = normal { bumps 0.3 scale 0.5 }
#declare L3Ambient = 0.0;
#declare L3Diffuse = 1.0;
#declare L3Ior     = 1.25;

// Ha ide tobb kamerat teszel egymas utan, akkor ugyanezt a
// kornyezet leiro fajlt mas kameraallasokhoz is hasznalhatod.
#switch (CAMERA_ANGLE)
#case (1)
camera {
  // Ennek a beallitasahoz lehet az LDView-t hasznalni.
  // Vagy lehet szimplan kiserletezni.
  location <960, -800, -580>
  look_at  <50, 0, 0>

  sky      -y
  right    -4/3*x
  // Latoszog, vagyis zoom ertek fokban.
  angle    40
  rotate   <0,1e-5,0> // Hogy ne legyenek lathato resek
}
#break
#end

// Egy sik lap a modell ala.
object {
  // A 'hollow' elotti ertek mutatja, hogy milyen magasan van a
  // hatter lap. Ha LDD-ben nem epitettel a referencia sik ala,
  // akkor 0, kulonben probalkozni kell.
  plane { <0, 1, 0>, 0 hollow }
  texture {
    pigment { color rgb <1.0,1.0,1.0> }
    finish { ambient L3Ambient diffuse L3Diffuse }
  }
}

// Beolvassuk a sajat szinbeallitasokat.
#include "koyancolours.inc"

Model_cam1.pov: Ez a mesterfájl, ami minden mást beolvas:

#declare CAMERA_ANGLE = 1;
#include "Model.inc"
#include "Model.pov"

Néhány megjegyzés a Model.inc-hez:
  • Radiosity beállítások. A radiosity lehetővé teszi, hogy a kép kiszámításakor a felületek egymás között továbbított fényét is számításba vegyük, ne csak a fényforrásból a felületre érkezőt. Sajnos itt sok állítható paraméter van, és nem triviális eltalálni a jó értékeket. Rossz értékekkel a kép csúnya lesz, el lesz maszatolva, vagy nagyon sokáig tart kiszámolni. Néhány tipp ezeken az oldalakon (angolul):
    http://wiki.povray.org/content/HowTo:Use_radiosity
    http://www.imagico.de/pov/radiosity.html
  • Kamera helyzet és cél. Általában az LDView-t használom a kezdőértékek beállítására (Tools / Show POV-Ray Camera Info), aztán kísérletezek. A fenti #switch lehetővé teszi, hogy a Model.inc-ben több kamerát is létrehozzak, és a kicsi mester .pov fájlból válasszam ki, hogy éppen melyiket használjam. Több kamera esetén egyszerűsíti a dolgokat.
  • Fényforrások. Kezdésnek csak a fénymintát használom. Szükség lehet némi kísérletezésre, hogy eltaláljuk a fényességet és az irányt (célszerű nagylátószögű kamerát használni hozzá). A fényminta általában szép egyenletes fényt ad, de a radiosity beállításokat nagyon trükkös lehet eltalálni. Ennek kiküszöbölésére beteszek egy másik területi fényforrást.
| MegaPOV beállítások. |


9. lépés: Megpróbálom az összes beállítást véglegesíteni: itt az idő, hogy igazi képeket csináljunk! Kezdetnek kis felbontást használok, mondjuk 320x240-et. A kép szinte biztosan állítgatást igényel: kamera, fényforrások, fényesség, radiosity, stb. Ha kis felbontásban csináljuk, a képen hamar látszani fog, ha valami rossz. Ezzel együtt egy óra is elmehet vele.

10. lépés: A végleges kép. A MegaPOV-ban be lehet kapcsolni az élek finom renderelését (antialising), de ez nem mindig működik jól. Általában kiszámoltatom vele a képet nagy felbontásban, mondjuk 2000x1500-ban, és aztán azt kicsinyítem vissza.

| Ez lett belőle. |

A modelltől és a beállítástól függően ez néhány perctől akár 24 óráig is eltarthat.

Ha a modellben átlátszó kockák vannak, akkor a kép számolása hatványozottan lassú lesz. Ilyen esetekben célszerű lehet egy próbaváltozatot készíteni átlátszó kockák nélkül a próbálgatáshoz a 9. lépésben. 

Igazából ez minden. Mint látszik, jónéhány lépésre szükség van, de némi állítgatással igazán szép képek hozhatóak ki belőle.

A képekhez használt modell az Egri Bazilikát ábrázolja, és Yooha alkotása.

2 megjegyzés:

  1. Ahha, értem, hogy mért vagy fenn hajnali kettőig. Asszonypajti

    VálaszTörlés
  2. Hm..a 4. pontnál az L3PAdd-on egy lededit nevű fájlt keres, de én nem tudok neki segíteni sajnos, mert én sem találom

    VálaszTörlés