Rátaláltam egy láthatóan félbehagyott raytrace leíró blogra. Mivel nincs hasonló blog a közelben, gondoltam, az illető helyett befejezem.

http://despina.blog.hu/2010/12/15/metszespontszamitas_1

Az utolsó írásánál a metszéspont számítását vázolta fel. Ezt inkább csak vázlatnak tekinthető, hiszen az egyenletek szinte csak fel lettek írva. Hogy mi miért van úgy ahogy, az nem derült ki az írásból. Sőt a végén maradt egy elvarratlan szál is.

 

Akkor bele a közepébe.

Ott akadt el a magyarázat, hogy sík és egy egyenes metszete. Az egyenes egyenlete adott, és a t is kiszámolható, de miért így kell számolni ezeket?

r=r0 + t*v

Először lássuk az egyenest. Ennek van egy iránya, amit egy irányvektor ír le. Ez a v vektor. Ennek a hossza egy, magyarul normalizált vagyis egységvektor. Ilyen vektorokkal szokás az irányokat megadni. Az r0 az egyenes kiinduló pontja. Mivel t egy távolság, és ez általában pozitív értékű, emiatt az r az egyenes végpontja. A köztük levő távolság a t.

A vektoros alak könnyebben megérthető, ha először 1 dimenzióban nézzük az adott helyzetet.

Ha minden csak egy skalár, akkor r0 egy közönséges szám, amihez t*1 értéket hozzáadva r értéket kapunk. Igy nem is tünik olyan rejtélyesnek az egész. A vektoroknál 'csak' annyi történik, hogy 3 db ilyen skalárral dolgozunk és a v vektor egyik komponense sem 1, hanem az sqrt(v.x*v.x + v.y*v.y + v.z*v.z ) érték. Ez a v vektor hossza.

Bármilyen hosszúságú vektorból lehet egységvektort készíteni, csak el kell osztani minden komponensét a hosszával. Ez 1 dimenzióban magától értedődik. 1=x/x, mivel ott a vektor hossza maga az x. Ezt hívják a vektor normalizálásának. Shader nyelven ez a normalize().

 

Az egyenesek rejtélye után jöhet a következő állomás. Miért kell a sík-egyenes metszetét ilyen nyakatekerten számolni?

Először vegyük a sík egyenletét n(r-D) =0. Mit jelent ez?

Csak annyit hogy a felület minden pontja a síktól  zéró távolságra van. Ha bármilyen r térbeli pontba húzok egy vektort a felületet levő D pontból, akkor a kapott vektor és a sík normáljának a szorzata mindig nullát ad, ha az r pont a síkon van. Miért?

Ismét az egyszerűbb eset felöl kell a problémát megközelíteni. Legyen a sík az  xy sík, ennek a normálja a z tengely. D legyen a (0,0,0) . Nyilván a sík minden pontjának a z koordinátája zéró. Mivel a normál n=(0,0,1), igy vármilyen r-D vektor szorzata a normállal zérót ad.

Két vektor skalár szorzata ugyan olyan, mint amit a távolság definiciójánál már láttunk.

dot(v1,v2) = v1.x*v2.x + v1.y*v2.y + v1.z*v2.z

Ha r(5,3,0) és n(0,0,1) akkor dot(r-D,n)= 5*0 + 3*0 + 0*1 =0, csak az r.z komponens számít, a többi biztosan nullát adna.

Ez annyit jelent, hogy az r pont távolsága a D és n által megadott síktól nulla, vagyis a pont a síkon van. A vektorokban az a nagyszerű, hogy bármerre állhat a térben a normál, ugyan így működik. A vektorok skalár szorzata /dot()/ mindig egy távolságot ad, ha az egyik vektor normált.

Vannak még érdekes tulajdonságai ennek a szorzásnak. Az második ismerős, hiszen már leírtam, amikor távolságot számoltam. Ha egy nem egységhosszú vektort önmagával szorzunk, akkor a vektor hosszának négyzetét kapjuk. Ezért kell a gyökvonás a távolság számolásakor. Ezt szinte mindenki számolta már, csak nem tudta, hogy vektorok skalár szorzatát veszi.

A harmadik tulajdonsága is hasznos lehet, ez az az eset, amikor mindkét vektor normalizált. Ekkor a két vektor közötti szög cos()-át kapjuk eredményül. Ez sok mindenre jó, például egyszerűen világíthatjuk be a felületet mindenféle szögfüggvény nélkül.

http://en.wikipedia.org/wiki/Lambert's_cosine_law

 

 

 

 

 

 

 

 

 

 

 

 

süti beállítások módosítása