Notes 1, Ray Tracing, 16 Nov 95 ****************************************************** Figyelem, a level tartalmat mashol publikalni reszben vagy egeszben az engedelyem nelkul szigoruan tilos !!! ****************************************************** ,,,,,,,,,,,,,,,,,,,,,,, S.Z.E.M.V.E.K.T.O.R.O.K ''''''''''''''''''''''' 1. BEMENO ADATOK ---------------- 1.1 PenTrace _ From: A nezopont helyvektora. _ At: A nezett pont helyvektora. _ Up: A felfele mutato vektor (aminek segitsegevel pl. fejjel lefele allithatunk egy kepet). FOV (Field Of View): A vizszintes latoszog. Aspect ratio: A vizszintes es a fuggoleges latoszog aranya. X resolution: A kiszamolando keppontok szama egy soron belul. Y resolution: A kiszamolando sorok szama. 1.2 Pov-Ray _ _ Direction: Az At helyett, nem a nezett pont van definialva, hanem a nezzett irany (egy normalt vektor). 1.3 3D-Studio Camera: A FOV helyett hasznalja, a kis fenykepezogepek lencseinek mereteivel azonos. A pontos osszefugest a FOV es a Camera kozott nem ismerem, de egy kozelito megoldast megadok: FOV = Camera * 180 / Pi * 2 / Helmholtz, ahol: Pi=3.1415926535897932384626 es Helmholtz=0.830875711002375 _ Bank angle: Az Up vektor helyett definialja a kamera elfogatottsagat. 0 szog a (0,0,1) vektornak felel meg. 1.4 BetaTrace _ K: kezdopont _ Np: nezopont D: fokuszpont tavolsag (milyen messzirol egysegnyi az egysegvektor) KepX, KepY: szamolando kep merete Mx, My : lekepzomatrix merete (az latott terresz merete a kamera fokuszaban) 2. KISZAMOLASA -------------- 2.1 A kepsik meroleges vektoraival (PenTrace v1.0) [Andrew S.Glassner "Ray Tracing for Realism" BYTE 1990] 2.1.1 Abra (-1,-1)_______________________________ | | | | | _ _ | | At H | | 7-------------->| | /| _ | | / | V | | / | | |__________ /___V_______________| / (+1,+1) / _ + From 2.1.2 Elokeszites _ _ _ G = At - From _ _ _ X = G x U _ _ _ Y = X x G _ _ _ H = ( |G| * TAN(Pi*FOV/360) ) * || X || _ _ _ V = ( |G| * TAN(Pi*FOV/360) ) * Aspect ratio * || Y || 2.1.3 Kiloves i: -1, +1, 2 / X resolution j: -1, +1, 2 / Y resolution _ _ _ TRACE( || G + i * H + j * V || ) 2.1.4 Mozgatas _ _ _ G, H, V vektorokat frissitjuk. 2.2 Tangens szamitas nelkul (BetaTrace) [MGADUO / Strezi] 2.2.1 Abra _ V1 _ --> P0 _______________________________ ___ _ |+ | | V2 | | \ | | V | \ _ | | | \ Np | | | \ + | | My | \ \ | | | \ \ | | | \ \ | | |________________\ _\ __________| _|_ \ \ |--------------------\\---------| Mx + _ K 2.2.2 Elokeszites _ _ _ V = Np-K, majd minden komponenset elosztom a hosszaval ( egysegvektor) _ V - re meroleges vektorokat szamolok _ __ a. V1-et az XZ sikban _ _ _ _ b. V2 = V1 x (Np-K) / vektorialis szorzat !/ _ _ V1 = V1*Mx/Kepx _ _ V2 = V2*My/Kepy, meretezzuk oket a virtualis es a valodi kep aranyanak megfeleloen _ _ _ _ P0 = D * V - (V1*KepX/2) - (V2*KepY/2) a virtualis kep bal-felso sarka 2.2.3 Kiloves _ VV1 = (0,0,0) i: 0, KepX-1, 1 _ VV2 = (0,0,0) i: 0, KepY-1, 1 _ _ _ TRACE( || P0 + VV1 + VV2 || ) _ _ _ VV2 = VV2 + V2 _ _ _ VV1 = VV1 + V1 2.2.4 Mozgatas _ _ _ A P0, V1 es V2 vektorokat frissitjuk. 2.3 Az elozo szemvektort modosito vektorokkal (PenTrace v1.1) 2.3.1 Abra _ _ Xa _ S(1,1)_______________________________ S(x,1) |+->+->+->+->+->+->+->+->+->+->+| _ |+\----------------------------'| Ya |+-\+->+->+->+->+->+->+->+->+->+| |+<-\--------------------------'| |+->+\>+->+->+->+->+->+->+->+->+| |+<---\------------------------'| |+->+->\->+->+->+->+->+->+->+->+| |+<-----\----------------------'| _ |________\ _____________________|_ S(1,y) \ S(x,y) \ _ + From 2.3.2 Elokeszites A 2.1.2 pont kepletei es _ _ _ _ S(1,1) = G - H - V _ _ Xa = H * 2 / X resolution _ _ _ Ya = V * 2 / Y resolution - 2 * H 2.3.3 Kiloves i: 1, X resolution, 1 j: 1, Y resolution, 1 _ _ _ S(i+1,j) = S(i,j) + Xa _ _ _ S(1,j+1) = S(x,j) + Ya _ TRACE( || S(i,j) || ) 2.3.4 Mozgatas _ _ _ S(1,1), Xa, Ya vektorokat frissitjuk. 2.4 Tablazatbol (Shells1) [Malcolm Taylor otlete alapjan] 2.4.1 Abra _ S[1]_______________________ |\\\\\\\\\\\|///////////| |\\\\\\\\\\\|///////////| |\\\\\\\\\\\|///////////| |\\\\\\\\\\\|///////////| |\\\\\\\\\\\|///////////| |\\\\\\\\\\\|///////////| |_\\\\\\\\\\|//////////_|_ \\\\\\\\|//////// S[x*y] \\\\\\|////// \\\\|//// \\|// _ + From 2.4.2 Elokeszites A 2.3.2 pont kepletei es i: 1, X resolution, 1 j: 1, Y resolution, 1 _ _ _ S(i+1,j) = S(i,j) + Xa _ _ _ S(1,j+1) = S(x,j) + Ya _ _ S[i+j*x-x] = || S(i,j) || (A nagy felbontas eseteben felmerulo nagy memoriaigeny felere csok- kentheto, ha duplapontossag helyett csak szimplat hasznalunk). 2.4.3 Kiloves n: 1, X resolution * Y resolution, 1 _ TRACE( S[n] ) 2.4.4 Mozgatas _ Az S[] vektortablat frissitjuk. Nem kell normalni az uj szemvektorokat ! 2.5 Nem sorfolytonos kilovessel 2.5.1 Rekurzivan (terulet-fillezessel) 2.5.1.1 Abra _ _ S(1,1)_______________________ S(x,1) |+ +| | \ / | | \ _ / | | \ T At / | | \ | / | _ |,____\ ____|____ /_____|_ S(1,y) \ \ | / / S(x,y) \ \ | / / \ \ | / / \ \ | / / \\|// _ + From 2.5.1.2 Kiszamolasa IF pontok tavolsaga * keppontok intenzitasanak kulonbsge < kuszobszam THEN terulet fillezve az atlag intenzitassal ELSE a negy vektor koze kilovunk egy ujat A kuszobszam altalaban kb. 0.2, a ket pont tavolsaga >= 1, a ket pont intenzitasanak a kulsonbseget pedig: dI = 0.299 * dR + 0.587 * dG + 0.114 * dB [GRAPHICS.FAQ] (Ezek az atlagos szemerzekenyseg fiziologiai mereseinek adatai). 2.5.2 Antialias miatt A konturoknal szembetuno pixelezettseg eltuntetese vegett, gyakran nem sorfolytonosan, es tobb szemvektort lonek ki egy-egy pixelhez. Bovebben lasd a megfelelo fejezetben ! 2.5.3 Parhuzamositaskor A feladatok felosztasa tortenhet ugy is, hogy minden egyseg egy-egy keppontot vagy egy-egy sort szamol ki => nem sorfolytonos kiloves. ,,,,,,,,,,,,,,,, ;TomCat/Abaddon; ;KaproncaiTamas; ;tomcat@szif.hu; ''''''''''''''''