Realizacija


Fizikalni model tkanine
  Model opruga i čestica
  Metode integracije
    Verlet metoda
    Eulerova metoda
  Stabilizacija fizikalnog modela tkanine
Model tkanine.
    Reprezentacija točke
Prikaz tkanine
  Izračun fizike
  Sustav svjetla
  Izračun normala tkanine
  Sjenčanje vrhova
  Spajanje teksture
  Iscrtavanje tkanine
Primjena vanjskih sile na tkaninu
  Metoda selektiranja objekata
  Simulacija djelovanja sile
    Simulacija udarca
    Simulacija vjetra


Fizikalni model tkanine


Da bi se izradila simulacija tkanine potreban je fizikalni model koji ju opisuje. Tkanina je sastavljena od određene sirovine koja je isprepletena čineći tako stabilnu strukturu isprepletenih niti. Ovakav model je kompleksan pa je time i izračun svih sila unutar tkanine velike složenosti. Radi toga prelazi se na diskretizaciju tkanine te kreiranju modela koji ju na jednostavan način opisuje. Na početku potrebno je odrediti sastavne dijelove tkanine te smanjiti njihovu veličinu kako bi se mogla prikazati i kako bi bila iskoristiva u daljnjem postupku modeliranja. Koristi se model tkanine prikazan slikom 2.1, takav model se koristi u ovome radu kao inicijalni kojemu je definirano 100 čestica tkanine. Ovim pristupom smanjuje se kompleksnost, veličina te sama složenost modela tkanine uz očuvanje njezine strukture te  dojma realnosti.

Reprezentacija teksture diskretizacijom točaka.
Slika 2.1 Reprezentacija teksture diskretizacijom točaka.

Daljnjom aproksimacijom tkanine koristi se model čestica povezanih oprugama kojima se prezentiraju čestice tkanine te opruge kao niti kojima je tkanina povezana. Prilikom izračuna fizike nad modelom tkanine potrebno je provesti postupak diskretizacije postavljenog fizikalnog modela. Opisane su dvije metode numeričke integracije klasična Eulerova i Verlet. Obje vrste integracije potrebne za izračun fizike su primijenjene u ovome radu te se na kraju koristi Eulerova radi veće efikasnosti kojom se smanjuje potrebno vrijeme izračuna

Model opruga i čestica


Model unutarnje strukture tkanine se može prikazati sustavom čestica povezanih oprugama (Slika 2.2), gdje je svaka čestica na tkanini povezana okolnim česticama pomoću opruga čineći tako sustav opruga.

Prikaz sustava čestica povezanih oprugama.
Slika 2.2 Prikaz sustava čestica povezanih oprugama.

Na slici 2.2 prikazan je sustav opruga, crnom kružnicom predstavljena je čestica tkanine, a linijama u bolji opruge. Postoje tri vrste opruga unutar modela tkanine: strukturne, smične i pregibne. Slikom 2.2 prikazane su strukturne opruge (narančastom bojom) koje djeluju horizontalno i vertikalno, smične opruge (plavom bojom) koje djeluju dijagonalno i pregibne opruge (crvenom bojom) koje djeluju između svake tri četice čineći tako stabilnost od pregiba čestica tkanine. Bez pregibnih opruga model je dovoljno stabilan, ali ako želimo dobiti što realniji prikaz tada ih treba uzeti u obzir.

Ovakvim pristupom na pojedinu česticu djeluju sile okolnih opruga i vlastita sila teže. Tako na središnje čestice djeluje ukupno trinaest sila, od toga dvanaest okružujućih opruga i gravitacijska sila. Na rubne slučajeve tkanine djeluje različiti broj sila ovisno o položaju pojedine čestice te broju susjednih čestica.

Ponašanje čestice i njezino simuliranje je česta radnja u računalnoj grafici koja se bavi prikazom dinamičkog procesa svijeta. Stvaranjem mreža čestica vezanih oprugama i implementiranjem fizikalno temeljenog ponašanja u pozadini, dobivamo složene dinamičke procese. Stoga, najvažniji dio tkanine jest njezina čestica (Slika 2.3) koja ima svoju masu, položaj u prostoru, brzinu i akceleraciju.

Reprezentacija čestice tkanine.
Slika 2.3 Reprezentacija čestice tkanine.

Položaj:            
Brzina:              
Akceleracija: ,
kada uzmemo u obzir konstantu akceleraciju tada dobivamo sljedeće izraze:

Brzina:                       
Položaj:                      

Prikaz djelovanja sila na česticu.
Slika 2.4 Prikaz djelovanja sila na česticu.

Sila opruge kojom su čestice vezane izračunava se pomoću Hookovog zakona. Hookov zakon elastičnosti je aproksimacija koja tvrdi da ako neku oprugu rastegnemo za udaljenost  od njenog položaja mirovanja, rezultirajuća sila , koju stvara opruga, je proporcionalna udaljenosti  i konstanti opruge , a njen smjer je suprotan od smjera pomaka:

 ,

gdje k predstavlja konstantu opruge, a  je razlika osnovne duljine opruge  sa njezinom trenutnom , odnosno:

            Kada bi se implementirao samo ovakav model opruga i njezinih čestica puštanjem u titranje on bi oscilirao u beskonačno jer nema gubitka energije u sustavu. Radi toga u realnom svijetu postoji sila prigušenja  koja prigušuje osciliranje ovakvoga modela.

,

gdje  predstavlja faktor prigušenja, a  brzinu promjene položaja opruge. Brzinu dobivamo skalarnom projekcijom vektora brzine na jedinični vektor smjera opruge. Uvođenjem ove sile nad modelom postignuto je prigušeno titranje i njegova stabilnost.

            Dakle nad jednom česticom mase  povezanom oprugom djeluje ukupna sila  te ju možemo prikazati formulom:

Gravitacijska sila:  
Sila opruge:                
Sila prigušenja:      
Ukupna sila:           
                                    

            Dani sustav čestica povezanih oprugama možemo prikazati sljedećom formulom, tako da računamo ukupnu silu za svaku česticu , koju okružuje  opruga.


Kada izračunamo silu koja djeluje na pojedinu česticu tada preko dvostruke integracije dobivene akceleracije  određujemo poziciju čestice. Kako je limitirano znanje o akceleraciji čestice tijekom cijele simulacije na trenutnu i prethodnu vrijednost, tada prelazimo na model numeričke integracije kako bi odredili približnu vrijednost sljedeće pozicije čestice.


Metode integracije


Kako je model koji izgrađujemo diskretan, odnosno vrijeme unutar simulacije nije kontinuirano, potrebno je uvesti model numeričke integracije. U ovom radu koristi se vrijeme osvježavanja izračuna fizike pod frekvencijom od 60Hz što je dovoljno za glatku predodžbu simuliranja modela tkanine. Tkanina se može prikazivati i manjom brzinom osvježavanja na zaslonu, ali potrebno vrijeme za postupak izračuna fizike određuje model integracije. Duljim vremenom izračuna fizike, odnosno smanjenjem vremena otipkavanja realnog svijeta, povećavamo stabilnost simuliranog modela, ali time djelujemo i na brzinu izvođenja cijelog programa koja se tada povećava. Ako taj broj prijeđe ispod granice od 25Hz (njime osvježavamo model tkanine) tada više ne možemo vršiti simulaciju u realnom vremenu jer se izračun fizika u pozadini našeg modela ne stigne u potpunosti izračunati. Predstavljena su dva modela integracije, njihove prednosti i mane.

Verlet metoda


Verlet metoda numeričke integracije omogućava efikasnu aproksimaciju integracije, njenim uvođenjem potrebno je pamtiti prošlu i sadašnju poziciju pojedine čestice. Ovoj metodi nije potrebna informacija o brzini čestice te time skraćuje dodatno izračunavanje njene vrijednosti. Sljedeći izraz opisuje dobivanje nove pozicije čestice kojoj je za izračun potrebna akceleracija , prethodna pozicija   i vrijeme uzrokovanja .

Sljedeća pozicija točke:          ,

gdje  predstavlja djelić brzine koji se izgubi radi trenja, on se unosi kao broj između (0-1), u ovom radu za   je isprobana vrijednost od 0,01 kojom je stabilizirana simulacija. Bez parametra  sustav opruga ne bi gubio energiju te bi ušao u harmonično titranje. Ovaj parametar se koristi umjesto sile prigušenja nad oprugom i samim time stabilizira tkaninu. Verlet metoda djeluje globalnom silom prigušenja preko parametra  te tako umanjuje moć prikaza malih, za potrebe simulacije, utjecajnih sila. Radi toga je potrebno smanjivati vrijeme otipkavanja  kako bi i te sile došle do izražaja. Smanjivanjem  simulacija ima popratni efekt radi kojega je potrebna veća količina osvježavanja fizike, što na kraju dovodi do njene slabe iskoristivosti.

Eulerova metoda


Klasičan pristup je Eulerova metoda numeričke integracije, a ona glasi:

Izračun brzine:               
Izračun pozicije:            ,

gdje je  vrijeme između dvije iteracije izračunavanja fizike nad česticom, odnosno ako se izračun izvodi pod frekvencijom od 60Hz, tada  iznosi 1/60 sekundi.

            Za implementaciju Eulerove metode potrebno je pamtiti brzinu pojedine čestice i njezinu poziciju. Ova metoda nema u sebi ugrađenu stabilizaciju kao verlet metoda. Time se omogućuje veća fleksibilnost i mogućnost djelovanja slabih sila koje neće biti prigušene kao kod verlet metode integriranja. Radi toga ovom metodom se mora dodatno izračunavati brzina te implementirati prigušenje nad oprugama tkanine. Povećavanjem dodatnih izračuna unutar Eulerove metode je jeftinije i isplativije od veće količine osvježavanja fizike unutar verlet metode. Za isti broj točaka tkanine verlet metodom, koja je naizgled praktičnija varijanta, dobivamo šest puta manju isplativost od Eulerove metode.

Stabilizacija fizikalnog modela tkanine


Jedan od najvećih problema koje se javlja unutar simulacije modela rada čestica jest njihova stabilizacija, a razlog tomu jest diskretizacija realnog svijeta. Ovom problemu prilazi se na razne načine ali sve se one svode na uvođenje gubitka energije u sustav kojim osiguravamo konačno prigušenje. 

Kada koristimo verlet metodu integracije nije potrebna dodatna stabilizacija kako bismo izbjegli osciliranje fizikalnog modela tkanine. Verlet metoda, na svaku iduću iteraciju izračuna fizike, umanjuje doprinos te iteracije pa time zapravo imitira globalnu silu prigušenja koja se može gledati kao sila otpora zraka.

Primjenom Eulerove metoda integracija moramo koristiti silu prigušenja koje djeluje nad domenom opruga. Prigušivanjem oscilacija opruge, unatoč njenoj stabilizaciji, javlja se jedna globalna oscilatorna pojava manjka otpora zraka, koja je neovisna od stabilnosti interne strukture tkanine. Ona je pomoću verlet metode bila utišana jer je pomoću nje djelovalo globalno prigušenje nad svim silama unutar modeliranog sustava. Korištenjem Eulerove metode, mora se naknadno unijeti stabilizacija tkanine silom prigušenja, odnosno uvođenje otpora zraka. Jednostavnom aproksimacijom  možemo dobiti da sila otpora zraka djeluje na pojedinu česticu tkanine tako da joj svaki put umanji 10% vrijednosti njene brzine. Time dobivamo jednu aproksimativnu silu prigušenja koja osigurava stabilnost simulacije modela tkanine.

Model tkanine


Model tkanine unutar računalnog programa predstavljena je klasom Cloth. Ona sadržava svoje vlastite atribute i metode koji ju opisuju te sadrži listu točaka od kojih je sastavljena. Klasa tkanine ima implementirane privatne strukture i metode koje se bave izračunom fizike i  sjenčanjem. Javno sučelje tkanine omogućava njeno kreiranje preko konstruktora klase, djelovanje vanjskih sila koje se implementiraju unutar fizike tkanine i iscrtavanje kojim se prikazuje simulacija njenog modela.

Prikaz modela tkanine.
Slika 3.1 Prikaz modela tkanine.

Ovakvim pristupom omogućena je promjena gotovo svih unutarnjih atributa modela tkanine, stvaranje objekata tipa tkanine s različitim parametrima mijenjanjem tako njezine simulacije.

Reprezentacija točke


Kao što smo rekli čestica je sastavni dio tkanine te je njezina implementacija neophodna za daljnji prikaz tkanine. Skup čestica na tkanini možemo smatrati kao jednu točku tkanine koja će svojim ponašanjem simulirati skupinu čestica. U daljnjem radu skup čestica ćemo zvati točka tkanine te ćemo nad njom vršiti sve daljnje radnje kao što su pomak te primjena unutarnjih i vanjskih sila.
           
            Točka tkanine predstavljena je klasom ClothPoint, svaki objekt tipa točke u sebi sadrži poziciju position, brzinu speed te vektor normale normal  (kasnije objašnjeno, potrebno radi sjenčanja tkanine). Točke se kreiraju pri stvaranju tkanine te je moguće zadati broj vertikalnih i horizontalnih točaka. Postavljanje točke obavlja se metodom SetPointPosition koja pojedinoj točki tkanine odnosno njegovom objektu postavlja inicijalnu poziciju i brzinu. Masa pojedine točke definirana je globalno za svaku točku tako da je masa jednoliko unificirana.

Klasa ClothPoint njezini atributi, svojstva i metode.
Slika 3.2 Klasa ClothPoint njezini atributi, svojstva i metode.

Nad točkama se obavlja izračun fizike te iscrtavanje modela tkanine, točke su povezane oprugama jednostavnim adresiranjem, pa nije potrebno pamtiti susjedne točke tkanine unutar samog objekta čime se smanjuje potrebna memorija za pohranu pojedine točka.

            Također točka ima definiranu logičku varijablu outerForceActivated koja omogućava djelovanje vjetra te udarca na pojedinu točku, a pri tome se koriste statički atribut signOfForce i dinamički directionOfForce, koji će biti detaljno objašnjeni u djelu rada koji se bavi primjenom vanjskih sila.

Prikaz tkanine


Za prikaz tkanine potrebno je proći kroz određene korake kako bi ju pripremili za iscrtavanje na zaslon. Jedan od glavnih koraka je izračun fizike koji se obavlja za svaku točku tkanine te opisuje njen fizikalni model. Zatim se pripremaju postavke potrebne za sjenčanje kojoj je uz definiran sustav svjetla potreban izračun normala tkanine te se primjenjuje samo sjenčanje. Nakon definiranog svjetla, tkanini se može dodijeliti boja pojedinom retku ili se na nju povezuje tekstura koja se lijepi na točke tkanine. Nakon svih prethodno navedenih koraka tkanina je spremna za iscrtavanje na zaslon unutar sustava scene.

Izračun fizike


Računanje fizike obavlja se frekvencijom od 60Hz kojom dobivamo glatku reprezentaciju realnog svijeta preslikanu u računalni model. Na početku se definira inicijalno stanje tkanine postavljanjem u sustav scene te definiranjem brzine pojedine točke na nulu. Točke tkanine su interno povezane oprugama te se proširivanjem ili smanjivanjem broja točaka tkanine automatski kreiraju novi objekti točaka i opruge kojima su vezane.

Postoje razni atributi koji definiraju ponašanje i izgled tkanine, a to su:

Gravitacija
Masa čestice
Konstanta opruge
Prigušenje opruge
Prigušenje zraka
Razmak između točaka
Vrijeme otipkavanja
Horizontalan i vertikalan broj točaka na tkanini

Kako postoje tri vrste opruga, kao što je rečeno prije, tako se za svaku točku izračunava doprinos sile okružujućih opruga. Kako se radi o indeksiranom pristupu, tako se za svaku točku preko njenog indeksa zna koje su joj okružujuće točke. Okružujuća točka je predstavljena kao broj koji moramo pribrojiti indeksu određenoj točki kako bi ju indeksirali. Definiran je pobrojani tip relativnih pozicija: gore lijevo, gore, gore desno, lijevo, desno, dolje lijevo, dolje ili dolje desno od trenutne točke tkanine. On  predstavlja vrijednosti koju moramo pribrojiti da bi indeksirali točku tkanine ovisno o relativnoj poziciji. Svaka od opruga (strukturna, smična i pregibna)  ima definiranu nazivnu duljinu koja se dinamički postavlja pri kreiranju tkanine jer ovisi o definiranom razmaku između postavljenih točaka tkanine. Izračun fizike svodi se na zbrajanje doprinosa svih sila koje okružuju pojedinu točku. Algoritam započinje zbrajajući izračunate sile opruga okružujućih točaka te njihovih prigušenja. Dobivenoj sumi dodamo gravitacijsku silu trenutne točke te dobivamo ukupnu silu  točke .

Nakon što su sve sile koje djeluje na trenutnu točku izračunata tada preko Eulerove integracije dobivamo novu brzinu točke te njenu poziciju. Te vrijednosti spremamo u objekt točke prepisivanjem prethodno izračunatih vrijednosti. Ovaj postupak obavlja se za sve točke tkanine, osim za točke koje predstavljaju učvršćene dijelove tkanine koje jednostavno preskačemo prilikom izračuna fizike.

Prilikom upisivanja nove brzine radi se aproksimacija prigušenja zraka te se novoj brzini oduzima 10% njene vrijednosti kako bi unijeli stabilnost unutar modela. Ova stabilizacija je različita od stabilizacije odnosno prigušenja nad oprugama, jer iako opruge mogu biti u stabilnom stanju tkanina i dalje može titrati u okomitom smjeru na opruge, a da su pri tome sve sile zadovoljene i uravnotežene.

Svakoj točki tkanine se pored unutarnjih sila modela sustava opruga dodaje i vanjska sila. Jednu od njih smo spomenuli i ona je gravitacijska ali pored nje unose se vektorski iznosi vanjske sile kojom korisnik djeluje na tkaninu (objašnjeno u dijelu koji se bavi utjecajem vanjskih sila). Kada je izračun fizike završio tada imamo spremljene nove vrijednosti brzine pojedine točke te vrijednosti njihove nove pozicije koju treba prikazati odnosno iscrtati na ekranu.

Sustav svjetla


U sceni se uz tkaninu nalazi i sunce koje predstavlja izvor svjetla. Svjetlo može djelovati u svim smjerovima od trenutne pozicije ili usmjereno. Svjetlo je moguće mijenjati atribute preko OpenGL poziva kao što su ambijentalnu, difuznu i zrcalnu komponentu osvjetljenja te poziciju samog izvora svjetla ili njen vektor djelovanja u slučaja kada se radi o usmjerenom svjetlu.


Prikaz objekta sunca, usmjerenog i radijalnog djelovanja te parametara koji ga opisuju.

Slika 4.1 Prikaz objekta sunca, usmjerenog i radijalnog djelovanja te parametara koji ga opisuju.

Kako bi se primijetila simulacija tkanine potrebnu ju je osvijetliti i primijeniti sjenčanje. Kada bi tkanina bila jednobojna tada ne bismo primijetili njeno gibanje jer ne bi imali osjećaj dubine predmeta. Radi toga potrebno je definirati normale tkanine nad svakom njenim poligonom kako bismo primijenili sjenčanje i time dobili dojam dubine.

Izračun normala tkanine


Normale poligona statičkog objekta unutar računalne grafike potrebno je izračunati samo jedanput i to na samome početku. Tkanina s druge strane predstavlja dinamički objekt sačinjen od točaka koje se gibaju i time čine simulaciju. Za nju je potreban dinamički izračun normala koji se obavlja kroz cijelu simulaciju. Tkaninu možemo reprezentirati slikom 4.2 koja prikazuje odnos poligona tkanine i njenih sastavnih točaka.


Predstavlja reprezentaciju tkanine raspodijeljenu na n*m broja poligona.
Slika 4.2 Predstavlja reprezentaciju tkanine raspodijeljenu na n*m broja poligona.

Kada se na tkaninu gleda na ovakav način, tada možemo odrediti normale pojedinog poligona tkanine. Kako tri točke određuju ravninu, tada uzimajući u obzir da je i četvrta točka ujedno i točka poligona, odnosno da je u istoj ravnini kao prethodne tri, unosimo malu pogrešku pri izračunu. Ta je pogreška zanemariva, a smanjena je složenost izračuna normala sa 2nm  na nm potrebnih poligona te njihovih normala.

Normale jednostavno izračunamo znajući pozicije svake točke tkanine. Tada iz pojedine tri vektorskim produktom dobivamo normalu poligona. Taj proces radimo za sve parove točaka unutar tkanine dok ne dobijemo sve tražene normale odnosno njih mn prikazano na slici 4.2. Dan je blok koda koji izračunava vektor normale za određeni poligon tkanine.

v0 = listOfPoints[j * clothWidth + i].Position;
v1 = listOfPoints[(j + 1) * clothWidth + i].Position;
v2 = listOfPoints[j * clothWidth + i + 1].Position;

edge1 = Vector3d.Sub(v0, v1);
edge2 = Vector3d.Sub(v1, v2);

tempNormal = Vector3d.Normalize(Vector3d.Cross(edge1, edge2));
listOfNormals.Add(tempNormal);

          Preko tri vrha v0, v1 i v2 međusobnim oduzimanjem dobivamo dva ruba edge1 i edge2. Vektorski produkt tih rubova predstavlja normalu tog poligona sastavljenog od tri vrha. Ova radnja obavlja se za sve poligone tkanine. 

Preko vektorskog produkta između dvaju rubova poligona dobivamo normalu n-tog poligona.
Slika 4.3 Preko vektorskog produkta između dvaju rubova poligona dobivamo normalu n-tog poligona.

Kada izračunamo sve normale poligona, prelazimo na metodu sjenčanja vrhova kojima aproksimiramo glatke prijelaze između sada konstantno osjenčanih poligona.

Sjenčanje vrhova


Kada ne bi koristili sjenčanje vrhova dobili bi tkaninu kao na slici 4.4a) zato je potrebno primijeniti ovu metodu kako bi dobili ispravne i glatke prijelaze te učinili tkaninu realnijom slika 4.4b).

a) Konstantno sjenčanje primijenjeno na poligone tkanine, b) Sjenčanje vrhova.
Slika 4.4 a) Konstantno sjenčanje primijenjeno na poligone tkanine, b) Sjenčanje vrhova.

Sjenčanje nad vrhovima radi tako da svakoj točki tkanine definiramo zaseban vektor normale. Da bi odredili normalu točke potrebno je poznavati sve normale poligona koji ju okružuju (ovaj korak je prethodno objašnjen). Sumirajući normale okružnih poligona dobivamo vektor normale dotične točke. Prilikom funkcijskog poziva OpenGL-a šaljemo vektor normale i poziciju točke. OpenGL automatski primjenjuje Phongov model osvjetljenja s Gouraudovim postupkom sjenčanja.

Spajanje teksture


Tekstura daje realnost modeliranom objektu tkanine te je u ovom radu omogućeno dinamičko učitavanje teksture. Tekstura se učitava i preslikava na kvadrat. Tekstura je definira s dvije koordinate koje se kreću između u=[0,1], v=[0,1], funkcijom V(u,v). Vrijednost funkcije V(0,0) predstavlja gornji lijevi vrh preslikane teksture, a V(1,1) donji lijevi. Odnosno koristi se bilinearna interpolacija.


4.5 Prikaz teksture, bilinearna interpolacija.
Slika 4.5 Prikaz teksture, bilinearna interpolacija.

Bilinearna interpolacija je vrsta interpolacije kod koje se vrijednost novog slikovnog elementa izračunava na temelju vrijednosti četiriju susjeda: lijevog, desnog, gornjeg i donjeg. Na taj način preslikavamo koordinate slike na koordinate bilo kojeg poligona koristeći donju formulu. U našem slučaju poligoni na koje preslikavamo teksturu su zapravo poligoni tkanine.


Tekstura se preslikava na tkaninu tako da na pojedinu točku tkanine lijepi dio teksture. Tekstura se tako skalira, rasteže odnosno deformira kako se mijenjaju pozicije točaka tkanine. Korištenjem bilinearne interpolacije tekstura je vezana za točke tkanine, gdje npr. zadnja točka tkanine dobiva koordinate V(1,1) od teksture.

Prikaz preslikane teksture na točke tkanine.
Slika 4.6 Prikaz preslikane teksture na točke tkanine.

Iscrtavanje tkanine


Za prikaz tkanine potrebno je proći sve do sada navedene korake. Izračun fizike i proračun normala vrhova potrebno je odrediti prije poziva iscrtavanja objekta. Nakon svih ovih postupaka dobivamo prikaz koji se osvježava te pri tome ponovo izračunava pod frekvencijom od 60Hz.

Tkanina se iscrtava pomoću funkcijskog poziva OpenGL-u zvanom „QUAD_STRIP“, on se koristi jer se njime izbjegavaju ponovna iscrtavanja već postojećih točaka modela tkanine, te se time smanjuje i sama složenost iscrtavanja.


Prikaz redoslijeda slanja vrhova prilikom korištenja „QUAD_STRIP“ načina iscrtavanja primitiva.
Slika 4.7 Prikaz redoslijeda slanja vrhova prilikom korištenja „QUAD_STRIP“ načina iscrtavanja primitiva.

Brzina prolaska kroz izračun ovisi o veličini tkanine u ovom radu postignuta je veličina od 1000 točaka tkanine što je i više nego dovoljno za realnu i ugodnu simulaciju tkanine za koju je dovoljno već 100 točaka.
           
Prilikom poziva iscrtavanja tkanine obavlja se sljedeći blok koda. On se obavlja za svaku točku tkanine (i,j).

GL.TexCoord2(i / (float)clothWidth, j / (float)clothHeight);
GL.Normal3((Vector3)listOfPoints[j * clothWidth + i].Normal);
GL.Vertex3((Vector3)listOfPoints[j * clothWidth + i].Position);

GL.TexCoord2(i / (float)clothWidth, (j + 1) / (float)clothHeight);
GL.Normal3((Vector3)listOfPoints[(j + 1) * clothWidth + i].Normal);
GL.Vertex3((Vector3)listOfPoints[(j + 1) * clothWidth + i].Position);

Prvo se iscrtava prvi red tkanine, a zatim drugi do zadnjeg reda. U bloku koda možemo vidjeti način preslikavanja koordinata teksture pomoću GL.TexCoord2 i dodjeljivanja normala GL.Normal3 pojedinoj točki GL.Vertex3 tkanine. Sustav prikaza tkanine napravljen je tako da je neovisan od broja točaka i veličine dane teksture. Točkama tkanine jednostavno pristupamo preko generičke liste listOfPoints koja sadrži objekte tipa ClothPoint.

Primjena vanjskih sile na tkaninu


Kako bi se prikazala simulacija i interakcija modela tkanine potrebno je simulirati djelovanje vanjskih sila na nju. Jedna od vanjskih sila koja je uvijek prisutna je gravitacijska sila. Kada se pokrene simulacija, možemo vidjeti kako gravitacijska sila djeluje na tkaninu tako što se počinje rastezati te se pri djelovanju sila opruga i sila prigušenja stabilizira. Tkanina se sada nalazi u 2D prostoru djelovanja sila, jer na početku simulacije ni jedna sila ne djeluje u smjeru različitom od ravnine u kojoj se nalazi tkanina. 

U ovom radu implementirane su dvije vrste sila: vjetar i udarac. Svakoj od njih možemo mijenjati jačinu, prostor djelovanja te njihov smjer djelovanja. Jedan od pristupa je takoreći klasični pristup određivanja smjera djelovanja vanjske sile. On se postiže projiciranjem pravca u smjeru sile te određivanjem udaljenosti između tog pravca i pojedine točke tkanine kako bi odredili nad kojom točkom djeluje dotična sila. Taj način zahtjeva puno kalkulacije i izračuna te aproksimacije, što sve zajedno otežava prikaz i simulaciju tkanine u realnom vremenu. Ovdje se koristi metoda selektiranja objekata na prizoru kako bi odredili nad kojim točkama te iz kojeg smjera trebamo primijeniti vanjsku silu.

Metoda selektiranja objekata


Postoje ugrađene funkcije unutar OpenGL-a koje omogućavaju imenovanje objekata na sceni te ekstrakciju imena vidljivih objekata unutar prikaza. Prilikom pristupa ovoj metodi potrebno je iscrtavanje prikaza, ali radi bržeg i efikasnijeg iscrtavanja odbacuju se nepotrebne informacije sa scene kao što su tekstura, poligoni, sjenčanja modela tkanine i ostali objekti na sceni koji ne zaklanjaju objekt modela tkanine.

Prilikom generiranja takvog prikaza obavlja se jednostavno iscrtavanje točaka tkanine pozivom GL.Begin(BeginMode.Points). Potrebno je prilikom slanja pozicije vrhova pojedinog objekta OpenGL-u postaviti i njegovu identifikaciju (u ovom slučaju naš objekt je zapravo točka tkanine) to se obavlja funkcijskim pozivom GL.PushName(j * clothWidth + i) , gdje ime predstavlja indeks točke tkanine. Kada smo definirali imena svim točkama tkanine obavlja se iscrtavanje s  funkcijskim pozivom GL.RenderMode(RenderingMode.Select). Ovaj način iscrtavanja nije vidljiv korisniku već se iscrtava samo radi brze ekstrakcije imena vidljivih objekata unutar definiranog prizora.

Kako bi izvukli, odnosno spremili podatke o imenima objekata, iz prikaza moramo definirati spremnik, GL.SelectBuffer(selectBufferSize, selectBuffer), u koji će se pohraniti imena dohvaćena ovim pristupom iscrtavanja te njihove udaljenosti od ravnine promatranja. Ovim pristupom dobivamo imena objekata koji se nalaze na cijelom prizoru no ako želimo ograničiti prostor djelovanja metode selektiranja tada moramo definirati  PickMatrix. Pomoću PickMatrix vršimo rezanje trenutnog prikaza pravokutnikom visine selectHight i širine selectWidth  te pozicije toga pravokutnika unutar prikaza. Za poziciju pravokutnika unutar prikaza koriste se koordinate miša (x, Height - y). Time ograničavamo metodu selektiranja tako da prihvaća samo nađene objekte unutar pravokutnika koji svojom visinom i širinom okružuje koordinate kursora miša.

Prikaz djelovanje vanjske sile na tkaninu primjenom metode selektiranja, na slici se vidi pravokutnik koji dohvaća indekse točaka tkanine.
5.1 Prikaz djelovanje vanjske sile na tkaninu primjenom metode selektiranja, na slici se vidi pravokutnik koji dohvaća indekse točaka tkanine.

Glu.PickMatrix(x, Height - y, selectWidth, selectHight, viewport);

Pozivom int numberOfHits=GL.RenderMode(RenderingMode.Render) dohvaćamo broj pogodaka odnosno broj spremljenih imena unutar selectBuffer, te pomoću tog broja možemo proći kroz selectBuffer i dohvatiti indekse točaka nad kojima trebamo primijeniti vanjsku silu. U ovom radu omogućeno je dinamičko proširivanje dimenzija pravokutnika. Tako povećavamo područje djelovanje sile, te njenog pomaka u ovisnosti o koordinatama kursora miša.

Simulacija djelovanja sile


Prethodno definiranom metodom određujemo nad kojim ćemo točkama primijeniti silu. Smjer sile je projekcija pogleda na tkaninu. Za određivanje smjera sile potrebni su nam vektori očista i gledišta trenutne pozicije i orijentacije kamere unutar scene. Oduzimanjem vektora očišta od vektora gledišta dobivamo vektor koji je okomit na trenutni prizor i određuje smjer sile. Kako bi se omogućilo gledanje djelovanja sile s različitog mjesta od trenutne pozicije i usmjerenja, moguće je odabrati fiksnu poziciju vjetra te se tada ta pozicija, odnosno njezina transformacijska matrica, sačuva kako bi se prilikom potrebe iscrtavanja metodom selekcije mogla koristi za određivanje smjera dolaska vanjske sile, a time i točaka nad kojima djeluje.

Promatranje djelovanja sile na tkaninu sa različitih pozicija pozicioniranjem kamera po sceni.
5.2 Promatranje djelovanja sile na tkaninu sa različitih pozicija pozicioniranjem kamera po sceni.

Moguće je pojačavanje ili smanjivanje sile te promjena smjera djelovanja. Sile su izražene u Newtonima te se lako mogu pribrajati ukupnoj sili koja djeluje na pojedinu točku tkanine. Prilikom odabira točaka nad kojima će djelovati sila trebamo na neki način dojaviti tim objektima da su pod utjecajem vanjske sile i iznosom njezinog vektora. Za to se koristi logička varijabla outerForceActivated  kojom naznačujemo pojedinom objektu kako u idućoj iteraciji izračuna sile treba dodati impuls vanjske sile jačinom i smjerom definirane od strane korisnika directionOfForce koja je također zapisana unutar pojedinog objekta.

Simulacija udarca


Simulacija udarca je zapravo simulacija impulsa sile koji djeluje nad označenim točkama tkanine. Točke nad kojima djeluje impuls pronalazimo prethodnom metodom te im njihovim objektima podižemo logičku varijablu kojom naznačujemo djelovanje vanjske sile nad njom. Svakoj od njih definira se vektor sile te preko podignute oznake određujemo da se u idućoj iteraciji treba pribrojiti vektor vanjske sile silama koje djeluju na dotičnu točku tkanine. Možemo reći da smo oživjeli dotičnu točku tkanine. Kada se vektor impulsa sile pribroji ostalim silama tada se logička vrijednost djelovanja impulsa postavlja na laž, kako bi se simulirao samo impuls koji predstavlja kratki udarac. Prilikom djelovanja impulsa na centar tkanine možemo uočiti stvaranje kružnog vala koji se rasprostire po tkanini.

Simulacija vjetra


Simulacija vjetra djeluje slično kao i kod udarca ali s tom razlikom da se vanjska sila koja djeluje na tkaninu evaluiraju prilikom svakog prolaska kroz izračun fizike, a ne jedanput kao kod simuliranja udarca. Impuls sile vjetra se također pribraja silama koje djeluju na pojedinu točku te joj je jačina definirana od strane korisnika. Prilikom zaustavljanja vjetra impuls sile se više ne pridodaje pojedinoj točki tkanine te na nju djeluju samo unutarnje sile i gravitacijska sila. Promjenom smjera, jačine i pozicije sile možemo djelovati u isto vrijeme na više segmenata tkanine te time simulirati različite tipove vjetra i promatrati interakciju i reakciju fizikalnog modela tkanine.