Számítógépes grafika vizsga+gyakIVbr2007. 01. 02.

A VIK Wikiből
(SzgGrafVizsga20070102 szócikkből átirányítva)

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 , sugara . A gömb ideális tükör, amelynek albedója minden hullámhosszon 1.
  • Az sík. A sík fényt bocsát ki oly módon, hogy a síkon lévő pont sugársűrűsége éppen , 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 //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:
Az y tengelyen és behelyettesítve:


Ebből és
Most csak kell mert a másik eredmény a sík mögött van, tehát a döféspont
Most ki kell még számolni a -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:
Ezt még le kell normálni így lesz
a vetitősugár és a normálvektor közötti szög ; ennek :
(skalárszorzat egységnyi hosszú vektorokkal)

A reflektált vetítősugár R:




Tükrözés után a vetítősugár a pontból az R irányba halad, hol metszi síkot??

Paraméteres egyenlet rendszer:






-- NandorG - 2007.01.02.

Szerintem és ebből a metszéspont
A feladat szerint a sugár intenzitás lesz (az 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=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.