Számítógépes grafika vizsga+gyakIVbr2007. 01. 02.
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
8:00-9:10. A 9:20-9:50 közötti gyakIV feladatsorát a vizsga első feladata képezte.
1.) Feladat (gyakIV+vizsga)
A virtuális világban két objektum van:
- Gömb, melynek középpontja Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (2, 3, 2)} , sugara Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle \sqrt{12}} . A gömb ideális tükör, amelynek albedója minden hullámhosszon 1.
- Az Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle y=4} sík. A sík fényt bocsát ki oly módon, hogy a síkon lévő Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (x, y, z)} pont sugársűrűsége éppen Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (|x|, |y|, |z|)} , azaz a pont koordinátáinak abszolút értékével megegyező intenzitású a vörös, zöld és kék hullámhosszokon. A sík albedója zérus.
A kamera az origóban van, az Y tengely irányába néz, függőleges iránya a Z tengely. Milyen színű az ablak középpontjában lévő pixel (azaz milyen sugársűrűség éri a szemet az Y tengely irányából)?
Először írja le a megoldás menetét, azután végezze el a szükséges számításokat. Pontozás: Elsődleges sugár: 1p; Metszéspont: 2p; Másodlagos sugár: 3p; A másodlagos sugár metszéspontja: 2p; A sugársűrűség számítása: 2p.
Megoldás
Az elsődleges sugárban nem vagyok biztos, úgyhogy egyelőre nem írom le.
De a másodlagosat ami a gömbről verődik vissza azt tudom
A Vetítősugár Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle V =(0,1,0)}
//az y tengely felé néz az origóból
A vetítősugár és a gömb döféspontja:
Gömb egyenlete: Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (x-2)^2+(y-3)^2+(z-2)^2=12}
Az y tengelyen Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle x=0}
és Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle z=0}
behelyettesítve:
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (-2)^2+(y-3)^2+(-2)^2=12}
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (y-3)^2=4}
Ebből Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle y_1=1}
és Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle y_2=5}
Most csak Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle y_1=1}
kell mert a másik eredmény a sík mögött van, tehát a döféspont Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle D=(0,1,0)}
Most ki kell még számolni a Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle cos\alpha}
-t (a vetítősugár és a normálvektor közötti szöget) ehez kelle a normálvektor. Mivel ez gömb, ezért minden sugár normálvektor. Tehát a normálvektor:
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle -((2,3,2)-(0,1,0))=(-2, -2, -2)}
Ezt még le kell normálni így lesz Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle N=(-\frac{1}{\sqrt3}, -\frac{1}{\sqrt3}, -\frac{1}{\sqrt3})}
a vetitősugár és a normálvektor közötti szög Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle \alpha}
; ennek Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle cos\alpha}
:
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle N \cdot V = -\frac{1}{\sqrt3}}
(skalárszorzat egységnyi hosszú vektorokkal)
A reflektált vetítősugár R:
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle R = V-2 \cdot cos\alpha \cdot N = [0,1,0] + \frac{2}{\sqrt3} \cdot [-\frac{1}{\sqrt3}, -\frac{1}{\sqrt3}, -\frac{1}{\sqrt3}] = [0,1,0] + [-\frac{2}{3}, -\frac{2}{3}, -\frac{2}{3}] = }
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle R = (-\frac{2}{3}, \frac{1}{3}, -\frac{2}{3})}
Tükrözés után a vetítősugár a Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (0,1,0)}
pontból az R irányba halad, hol metszi Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle y=4}
síkot??
Paraméteres egyenlet rendszer:
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle x(t)=0-\frac{2}{3}t}
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle y(t)=1+\frac{1}{3}t}
Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle z(t)=0-\frac{2}{3}t}
-- NandorG - 2007.01.02.
Szerintem Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle t=9}
és ebből a metszéspont Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle M=(-6,4,-6)}
A feladat szerint a sugár intenzitás Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle (6,4,6)}
lesz (az Értelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle M}
pont koord. abszolút értéke)
-- nam - 2007.01.05.
És pontosan ez a (6,4,6) látszódik a képernyőn, mert tökéletes visszaverődés van, és albedo=1 miatt kÉrtelmezés sikertelen (SVG (a MathML egy böngészőkiegészítővel engedélyezhető): Érvénytelen válasz („Math extension cannot connect to Restbase.”) a(z) https://wikimedia.org/api/rest_v1/ szervertől:): {\displaystyle _r} =1. Nem kell koszinuszokat számolgatni, meg semmi.-- Baba - 2007.01.14.
A gömb felületre bejővő sugár intenzitás = (6,4,6). A szembe pedig Lamber törvény szerint kéne számolni:
Lout = Lin * Kd * cos(alpha)
ahol cos(alpha)= 1/gyök(3) és Kd = (1,1,1)
így a szembe jövő sugár sűrűség: Lout = (R,G,B) = (4/gyök(3), 6/gyök(3), 4/gyök(3))
-- comay - 2008.01.02.
A Lambert diffúz felületre kell, ez viszont ideális tükör (lásd Baba kommentjét). -- Zsófi - 2008.01.15.
-- Képletek: Csapszi - 2007.01.06.
2.) Feladat (vizsga)
Mi a plakát (billboard) és mire használják (max 3 mondat) (3p)?
- Alakítsa át az alábbi, Cg nyelvű vertex shader programot úgy, hogy egy plakát (billboard) megjelenítésére alkalmas legyen. Indokolja a megoldást (7p)!*
Segítség: az alábbi program a sztenderd OpenGL megjelenítési csővezeték csúcspontárnyalója,
glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
beállítások esetén, feltételezve, hogy a MODELVIEW transzformációs mátrixot =modelview=, PROJECTION transzformációs mátrixot =proj= változókban tároljuk. Egy =m= mátrix elemei C szintaktika szerint =m[0][0], m[0][1], ..., m[3][2], m[3][3]=.
struct inputs { float4 position : POSITION; float3 normal : NORMAL; float2 texcoord : TEXCOORD0; } struct outputs { float4 hposition : POSITION; float2 texcoord : TEXCOORD0; } outputs main(inputs IN, uniform float 4x4 modelview, uniform float4x4 proj) { outputs OUT; float4 campos = mul(modelview, IN.position); OUT.hposition = mul(proj, campos); OUT.texcoord = IN.texcoord; return OUT; }
A plakát mérete =size=, középpontja világkoordinátákban =billboard=. A szempozíció =eye=, a nézeti pont =lookat=, a preferált függőleges irány =up=. A plakátot a következő OpenGL hívásokkal szeretnénk megjeleníteni:
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(54, 1, 1, 1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLookAt(eye.x, eye.y, eye.z, lookat.x, lookat.y, lookat.z, up.x, up.y, up.z); glTranslatef(billboard.x, billboard.y, billboard.z); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-size, -size, 0); glTexCoord2f(1, 0); glVertex3f(size, -size, 0); glTexCoord2f(1, 1); glVertex3f(size, size, 0); glTexCoord2f(0, 1); glVertex3f(-size, size, 0); glBegin();
Megoldás
bmegame.ppt 52. slide alapján.
(illetve sünis könyv 399. oldalán egy másik módszer is van) -- Csapszi - 2007.01.07.
// A lényeg, hogy a megkapott pontokat úgy kell transzformálni, // hogy a négyszög pont a kamera felé nézzen (merőleges legyen a kamerára). // Megjegyzem, hogy régebben ezeket sprite-nak hívták, ez tévesztett meg engem is a vizsgában :( outputs main(inputs IN, uniform float 4x4 modelview, uniform float4x4 proj) { outputs OUT; OUT.texcoord = IN.texcoord; // jó lenne, ha valaki megmagyarázná a mátrixnak miért pont ezen elemeiből jön ki up/right vektor float3 right = float3(modelview[0], modelview[4], modelview[8]); // aki tudja hogyan lehet szépen többdimenziós tömböt indexelni cg-ben, javítsa float3 up = float3(modelview[1], modelview[5], modelview[9]); float3 pos = (IN.position.x * right) + (IN.position.y * up); float4 campos = mul(modelview, float4(pos, 1.0)); OUT.hposition = mul(proj, campos); return OUT; }
-- Imi - 2007.01.04.
Hogy miért is azok az up/right vektorok? (Tk. 193-194.old)
gluLookAt:
Van egy w = norm( eye - lookat ) : pont a szem felé mutató vektorunk.
Ebből csinálunk egy u-t: u = norm( up x w ) : ez pont jobbra fog mutatni - használd az ujjaidat:) up:hüvelyk, w:mutató(feléd), eredmény:harmadik ujj.
Majd csinálunk egy harmadikat: v = w x u : ez az előbbiek alapján pont felfelé fog mutatni.
glTranslatef:
e = billboard.xyz
A transzformációs mátrix pedig (Ttr x Trot : először tolunk el, aztán koordinátatranszformálunk - OpenGL-be fordított sorrendben kell beírni):
T =[ ux vx wx 0 uy vy wy 0 uz vz wz 0 -ex -ey -ez 1 ]
Indexelés:
M[y,x] = M[y][x] = M[y*4+x]
és kijön:)
-- BacsoGergely - 2007.01.04.
-- A feladatokat begépelte Imi - 2007.01.02.