기말고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 답에는반드시네모를쳐서확실히표시할것. l 답안지에학과, 학번, 이름외에본인의암호를기입하면성적공고시학번대신암호를사용할것임. 1. 다음은 oglclass 에서제공하는 matrix4x4 클래스를이용하여변환을수행한예를보여주고있다. 이코드에서밑줄친 glmultmatrixf() 부분을 gltranslatef(), glrotatef(), glscalef() 함수로대치하여작성하라 (1 점 ). glclear(gl_color_buffer_bit); glmatrixmode(gl MODELVIEW); drawobject(); // 아래왼쪽기본도형 matrix4x4 M, T, R, S; T.translate(vector3(1,, )); R.rotate(9, z ); S.scale(vector3(2, 2, 1)); M = T * R * S; glmultmatrixf(m); drawobject(); glmultmatrixf(m); glmultmatrixf(t); drawobject(); gltranslatef(1,, ); glrotatef(9,,, 1); glscalef(2, 2, 1); gltranslatef(1,, ); glrotatef(45,,, 1); glscalef(2, 2, 1); gltranslatef(1,, ); 그리고다음왼쪽기본도형에, 위의최종실행결과를아래네모칸안에정확한척도를그려서나타내라 (1 점 ). Y 5 1 4 X 1/7
2. 다음은관측 (Viewing) 변환과투영 (Projection) 변환에관한질문이다 (2 점 ). glclear(gl_color_buffer_bit); glmatrixmode(gl_projection); glloadidentity(); gluperspective(9, 1, 1, 1); glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(,, -1); glrotatef(-9,, 1, ); gltranslatef(,, 5); glcolor3f(1,, ); // 빨간공 glutwiresphere(1, 16, 16); gltranslatef(-5,, -5); glcolor3f(,, 1); // 파란공 glutwiresphere(1, 16, 16); 1) 위코드에서밑줄친이동변환과회전변환함수를 glulookat() 함수로대치하려는데, 같은그림이나타나도록하기위해서이함수의 9 개인자를정확히기술하라. 어떤방식으로문제를풀었는지상세히기술할것 (1 점 ). 물체전체를 y 축으로 -9 도회전하여 z 축으로 -1 이동한결과는, glulookat 를사용하여카메라위치 (1,, ) 에서 x 축방면으로원점 (,, ) 을바라보는관측과같다. glulookat(1,,,,,,, 1, ); eye position (1,, ) at position (,, ) up (, 1, ) 2) 위코드에서이탤릭체 gluperspective() 를 glortho(-2, 2, -2, 2, -2, 2) 함수로대치하면, 최종실행결과화면이어떻게바뀌는지그림으로 ( 빨간공과파란공의위치와크기 ) 자세히설명하라 (5 점 ). //gluperspective(9, 1, 1, 1) 경우 //glortho(-2, 2, -2, 2, -2, 2) 경우 2/7
3) 그리고직교투영 (Orthographic Projection), 축측투영 (Axonometric Projection), 등축투영 (Isometric Projection), 경사투영 (Oblique Projection), 원근투영 (Perspective Projection) 의특징을자세히서술하라 (5 점 ). 직교투영은투영선 (projector) 이투영면 (projection plane) 에수직이다. 축측투영은투영선 (projector) 은투영면 (projection plane) 에수직이지만, 투영면은객체에대해어떠한방향에서도존재할수있다. 등축투영은축측투영의하나인데그중에서투영면이사각형객체의모서리에서만나는세개의주면에대해서대칭으로놓여지는것이다. 경사투영은투영선 (projector) 은투영면 (projection plane) 과임의의각을가질수있으나투영면에평행한면내의각은보존된다. 원근 ( 투시 ) 투영은객체가관측자로부터멀리떨어질수록크기가축소된다. 이러한크기변화는자연스러운모습의관측을제공한다. 3. 다음은조명 (lighting) 에관한문제이다. 아래의질문에답하시오. (2 점 ) 1) OpenGL 에서기본으로사용하는블린조명모델 (Blinn Illumination Model) 공식을보여주고있다. 이공식에서각부분이무엇을의미하는지자세히설명하라 (5 점 ). I n' K I ( N L) + K I ( N H ) E m = Ka Ia + å - 1 fatt ( d) d d s s + i= K a I a : 환경반사 (ambient reflection) 부분 Σ : 여러개의광원이있는경우 ( 최대 8 개까지 ) f att (d) : 빛의감쇄공식 K d I d (N L): 확산반사 (diffuse reflection) 부분으로, 면의밝기가입사각 ( 광원벡터와법선벡터의사이각 ) 의코사인에정비례한다는램버트코사인법칙에따르는빛이다. K s I s (N H) n : 블린모델은중간각 H 을사용하여정반사 (specular reflection) 경면광을나타내준다. E : 자체발광방출조명부분 2) 블린모델에서사용하는 H 란무엇인지아래그림에표시하고자세히설명하라 (5 점 ). 정반사 (specular reflection) 에서퐁모델의경우 Ks Is (R V) n 을사용하는데반사벡터 R 을모든정점에대해계산해야한다. 반면, 블린모델의경우정점에서광원으로향하는광원벡터 L 과시점벡터 V 의사이인중간각 H = L + V / L +V 를사용한다. H 3/7
3) OpenGL 에서기본으로사용하는구로우세이딩 (Gouraud Shading) 을자세히설명하라. (5 점 ) 구로우세이딩 (Gouraud shading) 은정점의색으로부터내부면의색을선형보간함. 정점의법선벡터를요함. OpenGL에서는 smooth shading이라고함. 면에전체적으로부드러운음영을제공함. 그러나경면광을감안하지않음 ( 실제적인정점의법선벡터와근사적으로계산된법선벡터가완전히일치하지않기때문 ). 4) 만약 OpenGL 프로그램에서조명 (lighting) 을활성화하고, 광원 (light source) 와물체의재질 (material) 을지정했는데물체에음영이제대로동작하지않는다면무엇이문제인가? 조명에반드시필요한 3 번째요소가무엇인지자세히설명하라 (5 점 ). OpenGL 에서 lighting 은빛이표면에서얼마나반사되는지계산하기위해서해당정점에서표면이어느방향으로향하고있는지알아야한다. 따라서면 / 정점의법선벡터 (normal vector) 가필요하다. OpenGL 에서는 glnormal3f( ) 함수로지정한다. 4. 다음은 OpenGL 텍스쳐매핑 (texture mapping) 과블렌딩 (blending) 프로그램의일부이다. 아래의질문에답하시오. (4 점 ) void inittexture(char * flename, GLuint& textureid, GLuint param) unsigned char *imagebuffer; int imagewidth =. imageheight =, numcomponents = ; imagebuffer = simage_read_image(filename, &imagewidth, &imageheight, &numcomponents); if (imagebuffer!= NULL) glgentextures(1, &textureid); glbindtexture(gl_texture_2d, textureid); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, param); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, param); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_NEAREST); gltexparameteri(gl_texture_2d,gl_texture_min_filter, GL_NEAREST); glteximage2d(gl_texture_2d,, numcomponents == 3? GL_RGB : GL_RGBA, imagewidth, imageheight,, numcomponents == 3? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, imagebuffer); glbindtexture(gl_texture_2d, ); void drawtexturequad(int textureid) gltexenvf(gl_texture_env, GL_TEXTURE_ENV_MODE, GL_MODULATE); glenable(gl_texture_2d); glbindtexture(gl_texture_2d, textureid); glbegin(gl_quads); glnormal3f(,, 1); gltexcoord2f(-1, -1); glvertex3f(-1, -1, ); gltexcoord2f(1, -1); glvertex3f( 1, -1, ); gltexcoord2f(1, 1); glvertex3f( 1, 1, ); gltexcoord2f(-1, 1); glvertex3f(-1, 1, ); 4/7
glend(); gldisable(gl_texture_2d); // 중간생략 drawtexturequad(texid); int main(int argc, char *argv[]) // 중간생략 inittexture( tree2s.png, texid, GL_CLAMP); // 주변이투명한나무그림 1) 위코드의실행결과를그림으로나타내라 (1점). 2) 만약 flipbook animation 효과를제공하고싶다면, 위코드중에서어느부분값이바뀌어야 하는지설명하라 (5 점 ). 여러개의텍스쳐에대해서 inittexture 를여러번호출하여각각다른 textureid 로바인딩하고, 시간 에따라서 textureid 를바꿔주면플립북애니메이션이동작된다. 3) 만약텍스쳐매핑이거칠게나타나서좀더부드럽게나타나게하고싶다면, 위코드중에서 gltexparameteri() 변수를어떻게설정해야할지자세히설명하라 (5 점 ). 확대필터 (MAG_FILTER) 와축소필터 (MIN_FILTER) 에최근점필터링 (GL_NEAREST) 대신포인트샘플링 에의해결정된텍셀의이웃을포함한텍셀그룹의가중평균을사용한선형필터링 (GL_LINEAR) 를 사용해준다. gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 5/7
4) 만약밉맵 (Mipmap) 을활성화하고싶다면, 위코드중에서어느부분이어떻게바뀌어야하 는지자세히설명하라 (5 점 ). 일련의축소된크기의밉맵택스쳐를생성하여, 작은객체에텍스쳐맵핑을할시보간문제를줄 여주는필터로, gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glteximage2d(gl_texture_2d,, numcomponents == 3? GL_RGB : GL_RGBA, 아래와같이바꿔서사용하면된다. imagewidth, imageheight,, numcomponents == 3? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, imagebuffer); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glubuild2dmipmaps(gl_texture_2d, numcomponents == 3? GL_RGB : GL_RGBA, imagewidth, imageheight, numcomponents == 3? GL_RGB : GL_RGBA, GL_UNSIGNED_BYTE, imageptr); 5) 만약텍스쳐매핑에조명 (Lighting) 효과를제공하고싶지않다면, 위코드중에서 gltexenvf() 환경변수를어떻게설정해야할지자세히설명하라 (5 점 ). OpenGL에서 default texture environment는 GL_MODULATE, 즉조명 (lighting) 과텍스쳐매핑 (texture mapping) 색이혼합이되는것이기본값이다. 그런데, 만약코드에서 gltexenv (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); /* or GL_REPLACE */ 로되어있다면텍스쳐매핑의색만을이용하게되므로조명 (Lighting) 이적용되지않는다. 6) 위코드는투명한나무그림으로나타나지않는다. 문제가무엇인지지적하고 display() 함수의 내부코드를수정하라 (1 점 ). OpenGL은기본적으로블렌딩이활성화되어있지않으므로텍스쳐는알파블렌딩이나타나지않는다. 투명한나무그림을보여주려면블렌딩활성화와알파블렌딩함수를설정해야한다. // 중간생략 glenable(gl_blend); glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA); drawtexturequad(texid); gldisable(gl_blend); 6/7
5. 다음문제에답하시오. (extra 15 점 ) 평면 (ax + by + cz + d = ) 의법선벡터 n(a, b, c) 가단위벡터일때, 평면밖의한점 Q(x, y, z ) 에서평면에가장가까운거리 k 를구하라. k = n ㆍ Q + d = ax + by + cz + d 그리고점 Q(x, y, z ) 가평면에반사되는점 Q (x, y, z ) 공식을구하라. ( 힌트 q =q - 2kn) x ' = x - 2( ax + by 2 = (1-2a ) x + cz - 2aby + d) a - 2acz - 2ad y ' = y = 2abx - 2( ax + by + cz 2 + (1-2b ) y + d) b - 2bcz - 2bd z ' = z = -2acx - 2( ax + by - 2bcy + cz + d) c 2 + (1-2c ) z - 2cd 점 Q(x, y, z ) 가 xz 평면에반사되는점 Q (x, y, z ) 값을계산하라. x = x y = - y z = z 7/7