Juu eli aloin tekemään sovellukseeni omaa valaistusfunktiota, tämän oppaan mukaan: http://www.suomipelit.com/index.php?c=naytaartikkeli&id=60&s=1.
Ei siinä muuta, mutta peiliheijastuksen ja hajavalon laskennassa tarvitaan pinnan normaalia, eikä minulla ole hajuakaan miten se laskettaisiin ja miten se yleensäkin ilmoitetaan. Tuon oppaan esimerkkikoodissa pinnan normaalivektori on tallennettu muuttujaan N[3], mutta eihän tuohon mahdu kuin yhden pisteen koordinaatit. Päähäni ei mahdu että miten yksi piste voi olla normaali. Lisäksi mistään en onnistunut, en maolista enkä Googlen avulla netistä, löytämään ratkaisua siihen miten lasketaan nelikulmion ja kolmion normaalivektorit.
Voisiko joku hiukan selkeyttää tilannetta, itse olen jo miettinyt pääni puhki ettei sen puoleen...
3-alkioinen float-taulu riittää esittämään hyvin 3-ulotteisen vektorin, sillä siinä jokainen vektorin komponentti tallennetaan omaan alkioonsa. Voit ajatella sitä myös paikkavektorin avulla: muodosta origosta paikkavektori pisteeseen, jonka koordinaatit ovat tuossa taulussa.
Normaalivektorin saat laskettua helposti esimerkiksi ristitulolla. Kahden vektorin ristitulona saadaan vektori, joka on kohtisuorassa molempia vektoreita vastaan. Ristitulon laskeminen onnistuu paperilla ehkäpä helpoiten matriisien avulla, mutta etenkin koneelle kelpaa paremmin tällainen laskutapa:
Olkoon a = x1i + y1j + z1k ja b = x2i + y2j + z2k. Tällöin ristitulo on:
a × b = ( y1*z2 - z1*y2)i + (z1*x2 - x1*z2)j + (x1*y2 - y1*x2)k
Nuo kaksi vektoria, joiden ristitulo lasketaan, voivat olla vaikkapa kolmion kaksi eri sivuvektoria, jolloin saadaan tuloksena kolmion normaalivektori (josta voidaan tehdä yksikkövektori jakamalla se omalla pituudellaan).
Jos saan vähän lisätä, niin vektorin tallentamiseen riittävät juuri koordinaatit, joita on kolmiulotteisessa avaruudessa kolme. Jos puhutaan olio-termein, vektori-olion ei tarvitse koskaan tietää, missä se sijaitsee. Se vain kertoo, mihin suuntaan jostakin pisteestä mennään ja kuinka paljon, eli miten koordinaatit muuttuvat.
Jokaiselle kolmiulotteisessa avaruudessa olevalle kaksiulotteiselle (tasaiselle) pinnalle lasketaan normaalivektori samalla periaatteella. Se saadaan aina kahdesta erisuuntaisesta tason vektorista (nollavektorit eivät kelpaa) kuten yllä jo hyvin kerrottiin. Neliön tapauksessa kaksi vierekkäistä sivua käy hyvin. (Jos eri sivuparit antaisivat eri tuloksia, kyseessä ei olisi neliö.)
Eri laskutavoista riippuen voidaan saada eri koordinaatteja sisältäviä normaalivektoreita. Niitä kaikkia kuitenkin yhdistää suunta, joka on aina sama. Normalisointi on siis paikallaan. (Eli tuo mainittu yksikkövektorin saaminen pituudella jakamalla.)
Ristitulossa a:n ja b:n järjestyksen valinnalla on myös merkitystä. Minulla ei nyt riitä aika kirjoittaa tästä selvää esitystä, joten toivon, että tämä linkki auttaa (kohta 2 on tietokonegraafikasta):
Aihe on jo aika vanha, joten et voi enää vastata siihen.