Sjenčanje poligona

Uvod

    Da bi relativno realistično prikazali trodimenzionalni objekt (tijelo) na računalu neophodno je koristiti sjenčanje i uklanjanje stražnih ploha. Za svaki poligon potrebno je izračunati intenzitete osvjetljenja u svim vrhovima te potom intenzitete točaka bridova (rubne točke poligona) i na kraju intenzitete unutar poligona. Ovisno o intenzitetima osvjetljenja u pojedinoj točci se određuje svjetlina što daje učinak sjenčanja. Osim sjenčanja potrebno je sve, za promatratelja, zaklonjene pixele ne nacrtati i time dobiti više manje potpuni doživljaj 3D prostora.

Implementacija vježbe

Sama implementacija vježbe se sastoji od JAVA appleta u osnovi vrlo sličan onom iz vježbe 5, ali sa dodatkom mogućnosti unosa inteziteta za svaku pojedini vrh svakog poligona. U implementaciji vježbe korišteni su sljedeći, po mjeri napravljeni, razredi Ravnina,RubnaTočka, TočkaNH, Točka, Točka3D, Matrix, MyWindow.

1.Odredivanje rubnih točaka poligona

Točke bridova tj. rubne točke poligona dijelimo u dva skupa, lijeve L  i desne D. Zbog rasterizacije na zaslonu bridovi su ostvareni nizom točaka od kojih postoje točke koje imaju istu y koordinatu. Nama u skupovima L i D nije potrebno više točaka sa istim x koordinatama, već za svaku y koordinatu jedna x.  Za određivanje navedenih koordinata rubnih točaka između vrhova Vs(xs, ys, zs, bs) i Ve(xe, ye, ze, be) koristimo DDA postupak (Digitalni Diferencijalni Analizator). Postupak je slijedeći:

     AKO JE xs < x ONDA POSTAVI plusX= 1;
    INAČE POSTAVI  plusX=-1;

    AKO JE ys < ye  ONDA POSTAVI plusY= 1;

    INAČE POSTAVI plusY=-1;

    POSTAVI   x0  = |xe- xs| + 1;
    POSTAVI   y0  = |ye- ys| + 1;

    AKO je x0 > y0 tj. za kuteve 315o-45o, 135o-225o
       POSTAVI xi =   xs;
       POSTAVI xf = -y0;
       mi     =       x0 / y0;
       mf     =    2*(x0 mod y0);
       ZA i=0 i y=ys DOK JE i <= y0 RADITI
         AKO JE  y UNUTAR GRANICA L i D SKUPA ONDA
            AKO JE ye <= ys ONDA
                U SKUP L NA POZICIJU y STAVI  RUBNU TOCKU
(x, y, z, b)
(xi, y, Gouraud(xs,ys, xe,ye, xi, y, zs, ze),
          Gouraud(
xs,ys, xe,ye, xi, y, bs, be))
                              
            INČE
                U SKUP D NA POZICIJU y STAVI RUBNU TOČKU
(x, y, z, b)
(xi, y, Gouraud(xs,ys, xe,ye, xi, y, zs, ze),
          Gouraud(xs,ys, xe,ye, xi, y, bs, be))

         KRAJ AKO
         POSTAVI x
i = xi + plusX*mi
         POSTAVI xf=
xf+mf
         AKO JE xf >= 0 ONDA
              xi =xi+ plusX
              xf=xf - 2*y0;
         KRAJ AKO
      
  y = y + plusY
       KRAJ PETLJE
    KRAJ AKO
    INČE , za kuteve 45o-135o, 225o-315o
       POSTAVI xf =  0
       POSTAVI xi =  xs
       ZA i=0 i y=ys DOK JE i<y0 RADITI
        
AKO JE  y UNUTAR GRANICA L i D SKUPA ONDA
          
AKO JE ye <= ys ONDA
             
U SKUP L NA POZICIJU y STAVI  RUBNU TOCKU (x, y, z, b)
(xi, y, Gouraud(xs,ys, xe,ye, xi, y, zs, ze),
          Gouraud(xs,ys, xe,ye, xi, y, bs, be))

           INČE
              U SKUP D NA POZICIJU y STAVI RUBNU TOČKU
(x, y, z, b)
(xi, y, Gouraud(xs,ys, xe,ye, xi, y, zs, ze),
          Gouraud(xs,ys, xe,ye, xi, y, bs, be))

         KRAJ AKO
         POSTAVI xf =
xf + x0
         AKO JE xf >= y0 tj.  ako prede 45o
            POSTAVI xf =
xf - y0
            xi =
xi + plusX;
         KRAJ AKO
        
y = y + plusY
      KRAJ PETLJE
    KRAJ INAČE

2.Uklanjenje skrivenih površina pomoću Z-spremnika

Z-spremnik je, kao što samo ime govori, spremnik z koordinata, ali ne bilo kojih već onih najmanjih za dotičnu x i y koordinatu. Z-spremnik mora biti velik onoliko koliko veliku sliku ili dio slike mislimo iscrtavati. Inicijalno se u njega upisuju najveće moguće vrijednosti tako da bi se kasnije jednostavno moglo uspoređivati sa trenutnom vrijednosti z koordinate. Za svaku točku T(x, y, z) se provjerava da li je to, za sad, točka s najmanjom z koordinatom na poziciji (x,z). Ako je onda se ta z koordinata pamti te se iscrtava. Nakon provjere svih točaka u Z-spremniku će se nalaziti z koordinate točaka najbližih očištu za svaku (x, y) poziciju.

3.Sjenčanje poligona

Sjenčanje se provodi Gouraud-ovim postupkom. Za Gouraud-ov postupak potrebno je poznavati intenzitete osvjetljenja u svim vrhovima poligona. U sklopu ove vježbe ti intenziteti se unose ručno kao i sve koordinate vrhova. Potrebno je za svaki brid, tj. za svaku y koordinatu odrediti pripadni intenzitet, te potom sa svaku točku unutar poligona.
Linerarna interpolacija intenziteta prema Gouraud-u je implementirana na slijedeći način:

Gouraud(xA, yA, xB, yB, x, y, PočetnaVrijednost, KrajnjaVrijednost)
POSTAVI u = ((xA-x)*(xA-x)+(yA-y)*(yA-y))0.5 /
                        ((xA-xB)*(xA-xB)+(yA-yB)*(yA-yB))0.5
INTERPOLIRANA VRIJEDNOST JE CIJELI DIO OD:
(1-u)*PočetnaVrijednost+u*KrajnjaVrijednost

4.Iscrtavanje poligona

Iscrtavanje poligona se obavlja jednostavnom iteracijom po L, D skupovima i linearnom interpolacijom udaljenosti od očišta te linearnom interpolacijom intenziteta osvjetljenja na slijedeći način:

ZA SVE RUBNE TOČKE(x, y, z) U  L(xL, yL, zL, bL) i D(xD, yD, zD, bD) SKUPOVIMA
    ZA int x= xL DOK JE x <= xD RADITI
        AKO JE TOČKA (x, y, Gouraud(xL,yL, xL,yL, x, y, zL, zD)  ZA SAD NAJBLIŽA ONDA
          POSTAVI Intenzitet = Gouraud(xL,yL, xL,yL, x, y, bL, bD)
          ISCRTAJ TOČKU SA INTENZITETOM Intenzitet NA POZICIJU (x,y )
        KRAJ AKO
    KRAJ UNUTRAŠNJE PETLJE
KRAJ VANJSKE PETLJE

Demonstracija :


 

Napisao Andro Galinović