(/8) [CSE47: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의 변환을 위하여 사용 하는가? 답안지 공간이 부족할 경우, 답안지 뒷면에 기 술하고, 해당 답안지 칸에 그 사실을 명기할 것 (i) 투영 참조점이 무한대점 (point at infinit) 에 위치한 투영 변환의 이름은 무엇인가? 다음 단답식 문제에 답하라 (j) 다음과 같은 gluperspective(fov, asp, n, f) 함수에 대한 변환 행렬 Mpers 를 통하여 원 근 투영을 수행할 때 진행되는 원근 나눗 셈에서 분모로 사용되는 W 좌표 wc 값은 무엇인가? (a) 3차원 공간의 두 벡터 p = (p p pz )t 와 q = (q q qz )t 에 대하여 외적 (cross product) 연산을 통해 구한 벡터 r = p q = (r r rz )t 의 좌표 r 의 값을 기술하라 (b) 3차원 투영공간의 점 (5, 5,, )에 대응하는 아핀공간의 점의 좌표 (,, z)를 기술하라 (c) RGB 모델로 (3, 5, )로 표현되는 색 깔을 CMY 모델로 나타내면? cot( f ov ) asp (d) 차원 공간에서의 회전 변환에 해당하는 3 행 3열 아핀 변환 행렬 R(θ)을 기술하라 (e) 주어진 4행 4열 행렬이 3차원 공간에서의 아핀 변환에 해당하는지를 알 수 있는 방법 은 무엇인가? (f) 3차원 공간에서의 이동 변환, 크기 변 환, 그리고 회전 변환에 대한 4행 4 열 행렬 T (t, t, tz ), S(s, s, sz ), 그리고 R(θ, n, n, nz )를 고려하자 다음 행렬 M 의 역행렬 M 을 위의 기본 변환 행렬의 곱으로 표현하라 (반드시 위의 행렬 기호를 사용할 것) M = 5 5 fnf n (k) 위 문제에서 wc 값의 직관적인 의미를 설 명하라 3행 3열 행렬로 표현되는 차원 이동 변환 T (t, t ), 크기 변환 S(s, s ), 그리고 회전 변환 R(θ)를 고려하자 그림 (a)의 직사각형 영역의 내용을 (b)의 직사각형 영역으로 매핑해주는 3 행 3열의 기하 변환 행렬 M 을 (i) 위의 기본 변 환 행렬들의 곱으로 표현한 후, (ii) 최종 3행 3열 행렬의 내용을 구하라 cot( f ov ) f +n f n 5 - (g) OpenGL 렌더링 파이프라인에서 카메라 의 위치와 방향을 설정 해주는 과정에 해 당하는 기하 변환의 이름은 무엇인가? (h) OpenGL fied-function 파이프라인에서 glverte3f() 함수를 사용하여 설정한 꼭 지점에 곱해지는 첫 번째 행렬 스택의 탑에 - (a) 변환 전 6 (b) 변환 후 Figure : 차원 윈도우 매핑 - 4년 4월 5일(금) 오전 :3 (AS 44) c 4 임인성
3 아래의 코드는 그림 에 도시한 원점 주변의 번 비행기와 4사분면의 번 비행기를 그려주는 OpenGL 코드이다 Figure : 차원 기하 변환 draw airplane(); // airplane glpushmatri(); gltranslatef(5, -, ); glrotatef(9,,, ); glscalef(,, ); draw airplane(); // airplane glpopmatri(); (a) 이제 이 그림에서처럼 번 비행기를 직선 = + 에 대하여 반사시켜 사분면의 번 비행기와 같이 그려주려 한다 아래의 코드는 이를 위한 코드인데, (A)와 (B)에 들어갈 내용을 각각 한 번의 OpenGL API 함수 호출을 통하여 C/C++ 언어 문법에 맞게 기술하라 glpushmatri(); gltranslatef(-,, ); (A) glscalef(-,, ); (B) gltranslatef(5, -, ); glrotatef(9,,, ); glscalef(,, ); draw airplane(); // airplane glpopmatri(); (b) 3행 3열 행렬로 표현되는 차원 이동 변 환 T (t, t ), 크기 변환 S(s, s ), 그리고 회 (/8) 전 변환 R(θ)를 고려하자 R(θ)S(, ) = S(, )R(α) 식을 만족시켜주는 α 값은 무 엇인가? (c) S(, )T (t, t ) = T (β, γ)s(, ) 식을 만족시켜주는 β와 γ 값은 무엇인가? (d) R(θ)T (t, t ) = T (δ, )R(θ) 식을 만족시켜 주는 δ와 값은 무엇인가? (e) 이제 번 비행기를 그리는 작업은 아래와 같은 방식으로도 구현할 수 있다 이때 (C) 에 들어갈 내용을 한 번의 OpenGL API 함수 호출을 통하여 C/C++ 언어 문법에 맞게 기술하라 glpushmatri(); gltranslatef(-,, ); glrotatef(-9,,, ); (C) gltranslatef(5, -, ); glrotatef(9,,, ); glscalef(,, ); draw airplane(); // airplane glpopmatri(); (f) 마찬가지로 아래와 같은 방식으로 번 비행기를 그리려 한다 이때 공란으로 되어있는 각 OpenGL API 함수의 인자 다섯 개를 순서대로 기술하라 (힌트: 번 문제의 답을 잘 이용할 것) glpushmatri(); gltranslatef(,, ); glrotatef(,,, ); glscalef(,, ); draw airplane(); // airplane glpopmatri(); 4 다음은 프레임간의 변환에 관한 문제이다 (a) 그림 3의 A 소는 점 (4, 4, )을 원점으로 하는 자신의 프레임을 기준으로 세상 좌표 계에 존재하고 있는데, 이 프레임의 각 축 의 방향이 축 옆에 기술되어 있다 이때 이 프레임을 (,, -) 방향과 (,, ) 방향 이 각각 세상 좌표계의 w 축과 w 방향과 일치하는 방식으로 세상 좌표계와 일치시 켜주려한다 이때 필요한 4행 4열 행렬 M 의 내용을 기술하라 (b) 한편 B 소는 점 (,, )을 중심으로 하는 프레임을 기준으로 세상 좌표계에 존재하 고 있는데, A 소의 각 꼭지점들을 B 소의 - 4년 4월 5일(금) 오전 :3 (AS 44) c 4 임인성
w (4, 4, -) (,, ) (,, -) p COP: (,, ) (-,, ) p' B (,, -) A (,, ) 9 z PP: = 9 (,, ) zw (3/8) (a) 문제 (a) 그림 w (, -, ) p Figure 3: 프레임간의 변환 대응되는 점으로 매핑해주는 4행 4열 행렬 M 를 네 개의 기본 변환 행렬의 곱으로 표 현하라 (반드시 네 개의 4행 4열 행렬의 내 용을 곱해지는 순서대로 기술할 것) p' 5 다음은 원근 투영 변환에 관한 문제이다 (a) 그림 4(a)에서와 같이 COP(Center of Projecton)가 (,, )이고 PP(Projection Plane)이 = 9인 상황에서, 주어진 점 p = ( z )t 을 p = ( z )t 로 변환해 주는 4행 4열의 원근 투영 변환 행렬 M 을 구하라 (반드시 유도과정이 있어야 함) (b) 그림 4(b)는 임의의 점 p를 이 점과 원점 을 지나는 직선과 세 점 (,, ), (,, ), 그리고 (,, )을 지나는 평면과의 교점 p 로 투영해주는 모습을 도시하고 있다 이때 이에 대한 원근 투영 변환 행렬 M 를 구하 라 (반드시 유도과정이 있어야 함) 6 다음은 간단한 모델링 변환에 관한 문제이다 (a) 아래의 코드는 그림 5(a)에 도시한 그림을 그려주는 OpenGL 프로그램의 일부이다 glmatrimode(gl MODELVIEW); glloadidentit(); glulookat(, 5,,,,,,, ); draw ais(); draw floor(); draw cow(); // Line (a) for (angle = ; angle < 36; angle += 45) { z (b) 문제 (b) 그림 Figure 4: 원근 투영 변환 glpushmatri(); // Line (c) gltranslatef(4,, ); draw cow(); // Line (b) glpopmatri(); 여기서 Line (a)의 함수는 원점에 배치되 어 있는 소를 그려주고, Line (b)의 함수는 원점을 둘레로 반경 4인 원을 따라 회전하 고 있는 소를 그려주는 역할을 하고 있는데, 이 코드에는 회전에 필요한 OpenGL API 함수 호출 문장이 결여되어 있다 위 프로그 램이 제대로 작동하기 위하여 어느 지점에 어떤 문장이 필요한지, 그 내용을 OpenGL 및 C/C++ 언어 문법에 맞게 정확히 기술 하라 답은 어떤 문장 직전 (또는 직후)에 다음 OpenGL 문장이 필요함 과 같이 기술 하되, 두 개 이상의 OpenGL 문장이 필요할 수 있음 (b) 다음 프로그램에서 그림 5(b)와 같은 결과를 얻기 위하여 필요한 회전에 필요한 문장을 위 문제에서와 동일한 방식으로 답하라 - 4년 4월 5일(금) 오전 :3 (AS 44) c 4 임인성
(4/8) z (a) 문제 (a) 그림 Figure 6: glulookat(*) 함수를 통한 뷰잉 변환 8 다음은 뷰잉 변환에 관한 문제이다 z (b) 문제 (b) 그림 Figure 5: 간단한 모델링 변환 for (int i = ; i < 5; i++) { glpushmatri(); // Line (d) gltranslatef(*i-4,, ); draw cow(); // Line (e) glpopmatri(); 7 다음은 glulookat(*) 함수를 통한 뷰잉 변환에 관한 문제이다 그림 6의 뷰잉 변환 계산 과정과 그림 7의 함수 구현 코드를 보면서 답하라 (a) 이 코드에서 이 그림의 VRP와 가장 밀접한 관련이 있는 변수(들)을 정확히 기술하라 (b) 이 코드에서 이 그림의 v와 가장 밀접한 관 련이 있는 변수(들)을 정확히 기술하라 (c) 문맥 상 이 코드의 (A), (B), 그리고 (C) 부 분에 들어갈 내용을 C/C++ 언어 문법에 맞게 정확히 기술하라 (d) 이 코드에는 분명히 잘못된 부분이 있다 그 부분을 명시한 후 올바르게 바로 잡아라 (a) 한 점 e와 서로 수직이고 길이가 인 세 개의 벡터 u (카메라 기준 오른쪽 방향), v (카메라 기준 위쪽 방향), n (카메라에서 세상을 바라보는 방향의 정반대 방향)으로 정의되는 카메라 프레임을 생각하자 지금 점 e가 원점에, 그리고 u, v, n 벡터가 각각 세상 좌표계의 w, w, zw 축 방향을 향하도록 카메라 프레임이 초기화되어 있다 이 상태서 이 카메라 프레임을 w 축 둘레로 9도만큼 회전시킨 후, w 축 방향으로 -만큼 이동을 시켰다고 하자 이때의 뷰잉 변환을 아래의 코드처럼 구현하려 할때, (A) 부분에 들어갈 내용을 C/C++ 언어 문법에 맞게 OpenGL API 함수 호출을 통하여 구현하라 GLfloat matri[6]; glmatrimode(gl MODELVIEW); glloadidentit(); (A) glgetfloatv(gl MODELVIEW MATRIX, matri); (b) 여기서 glgetfloatv(*); 문장은 이 문장 수행 당시의 현재 행렬 스택의 탑의 내용 을 배열 matri[6]으로 추출해주는 역할 을 한다 이때 이 배열에 저장되는 6개의 원소 값을 순서대로 기술하라 (OpenGL 시 스템에서 차원 배열이 저장되는 순서를 상 기할 것) 9 지금 다음처럼 카메라 변수 cam을 정의한 후, tpedef struct cam { float pos[3], uais[3], vais[3], - 4년 4월 5일(금) 오전 :3 (AS 44) c 4 임인성
서강대학교공과대학컴퓨터공학과 CSE47 기초컴퓨터그래픽스중간고사 (5/8) void glulookat(gldouble ee, GLdouble ee, GLdouble eez, GLdouble center, GLdouble center, GLdouble centerz, GLdouble up, GLdouble up, GLdouble upz) { GLdouble m[6]; GLdouble [3], [3], z[3]; GLdouble mag; z[] = ee - center; z[] = ee - center; z[] = eez - centerz; mag = sqrt(z[]*z[] + z[]*z[] + z[]*z[]); if (mag) { z[] /= mag; z[] /= mag; z[] /= mag; [] = up; [] = up; [] = upz; [] = []*z[] - []*z[]; [] = -[]*z[] + []*z[]; [] = []*z[] - []*z[]; [] = (A) ; [] = (B) ; [] = (C) ; mag = sqrt([]*[] + []*[] + []*[]); if (mag) { [] /= mag; [] /= mag; [] /= mag; mag = sqrt([]*[] + []*[] + []*[]); if (mag) { [] /= mag; [] /= mag; [] /= mag; #define M(row,col) m[col*4+row] M(,) = []; M(,) = []; M(,) = []; M(,3) = ; M(,) = []; M(,) = []; M(,) = []; M(,3) = ; M(,) = z[]; M(,) = z[]; M(,) = z[]; M(,3) = ; M(3,) = ; M(3,) = ; M(3,) = ; M(3,3) = ; #undef M glmultmatrid(m); gltranslated(ee, ee, eez); Figure 7: glulookat(*) 함수의구현 nais[3]; GLfloat mat[6]; GLdouble fov, aspect, near c, far c; Cam; Cam cam; 디스플레이컬백함수에서다음과같이물체를그리려한다 ( 여기서 sfactor 는 float 타입의전역변수임 ) void displa (void) { glclear(gl COLOR BUFFER BIT); glmatrimode(gl MODELVIEW); glloadidentit(); // Line (a) glmultmatrif(cammat); gltranslatef(-campos[], -campos[], -campos[]); // Line (b) glpushmatri(); glscalef(sfactor, sfactor, sfactor); // Line (c) draw teapot(); glpopmatri(); glflush(); (a) 보편적인관점에서, Line (a) 와 Line (b) 지점에서 glverte*(*) 함수로꼭지점의좌표를기술하면이꼭지점은각각눈좌표계, 모델링좌표계, 그리고세상좌표계중어느좌표계에서의의미를가질까? (b) 다음과같은함수를사용하여세상좌표계의좌표축을그려주려한다 void draw aes(void) { gllinewidth(); glbegin(gl LINES); glcolor3f(,, ); // 축 glverte3f(,, ); glverte3f(5,, ); glend(); gllinewidth(); 이함수를 Line (a), Line (b), 그리고 Line (c) 중어느시점에서호출을해야 - 4 년 4 월 5 일 ( 금 ) 오전 :3 (AS 44) - c 4 서강대학교공과대학컴퓨터공학과임인성
할까? (c) 그림 8은 이 프로그램의 초기 렌더링 결과 를 보여주고 있다 (여기서 세상 좌표계의 축과 축이 각각 오른쪽과 위쪽 방향으로 그려져 있고, z축은 화면 앞으로 튀어 나오고 있음) 초기에 카메라의 위치는 다음과 같이 설정되어 있는데, campos[] =, campos[] =, campos[] = 5; (6/8) set rotate mat(cammat); glutpostredispla(); break; (e) 위 스페셜 컬백 함수를 사용할 경우, 아래 화살표 키를 누를 때마다 화면에서 물주전 자가 어떤 식으로 움직일지를 적절한 수치 를 사용하여 정확히 기술하라 이때의 camuais[] 벡터의 세 원소 값을 그림 9는 아래에 주어진 디스플레이 컬백 함수를 통하여 세상 좌표계 (WC)에서 동일한 기술하라 소 모델을 사용하여 렌더링한 모습을 도시하고 있다 w WC 㞚㰖 zw w Figure 8: 물주전자 그리기 㠊 (d) 다음은 스페셜 컬백 함수의 일 부이다 이 코드에서 문맥상 set rotate mat(cammat); 문장은 cammat[] 배열에 어떤 값들을 어떻게 넣어주는 역할을 할지 정확히 기술하라 case GLUT KEY DOWN: { float c, s, t, t; c = cos(3459*45/8); s = sin(3459*45/8); t = c*camnais[] - s*camnais[]; t = s*camnais[] + c*camnais[]; camnais[] = t, camnais[] = t; t = c*camuais[] - s*camuais[]; t = s*camuais[] + c*camuais[]; camuais[] = t, camuais[] = t; campos[] = 5*camnais[]; campos[] = 5*camnais[]; campos[] = 5*camnais[]; Figure 9: 간단한 계층적 모델링 void render(void) { glclear(gl COLOR BUFFER BIT); glmatrimode(gl MODELVIEW); draw floor(533, 7, 75); draw aes(3, 5); // WC 좌표축 draw aes(, 5); draw cow(43, 67, 333); // 소 glpushmatri(); (A) glscalef(,, ); draw aes(, 5); glpushmatri(); gltranslatef(-, 88, ); draw cow(,, ); - 4년 4월 5일(금) 오전 :3 (AS 44) c 4 임인성
glpopmatri(); glscalef(5, 5, 5); draw cow(94, 67, 9); glpopmatri(); glutswapbuffers(); (a) 이 프로그램에서 세 개의 draw cow(*); 문 장들은 각각 소, 송아지, 그리고 어미소를 그려주고 있다 여기서 송아지를 그려주는 문장은 어떤 것인지 해당 함수의 세 개의 인자를 통하여 답하라 (b) 프로그램 문맥상 어미소는 원점 주변의 소 의 몇 배 크기를 가질까? (c) 지금 타이머 컬백 함수에 의해 변수 angle 의 값이 씩 증가하면서 (과 359 사이에서 순환) 위의 디스플레이 컬백 함수가 호출 되고 있다 어미소와 송아지가 세상 좌표계 의 w 축 둘레로 반경 4인 원을 따라 같이 회전을 하게 하게 하기 위하여 (A) 지점에 필요한 내용을 C/C++ 언어 문법에 맞게 OpenGL API 함수 호출을 통하여 구현하 라 (어미소와 송아지의 얼굴이 진행 방향을 가리킴) (d) 위 코드에서 소, 어미소, 송아지 등 각 물 체를 그려주는 문장이 수행되는 시점에는 각 물체 자신만의 좌표계가 설정되어 있 다고 할 수 있다 이때 송아지를 그려주는 문장이 수행되는 시점에서 한 꼭지점에 어 떤 기하 변환을 가하면 어미소를 그려주 는 문장이 수행되는 시점의 좌표계로 변환 할 수 있을까? T (t, t, tz ), R(α, r, r, rz ), S(s, s, sz ) 행렬과 그것들의 역행렬을 적 절히 사용하여 그 기하 변환을 합성하라 (7/8) 느 영역인지 (자신이 붙인 이름을 사용하 여) 밝히고, (ii) 어떠한 사용자 인터액션 을 통해 메뉴를 화면에 도시하는지, 그리고 (iii) 각 메뉴 요소 선택을 통하여 어떤 일을 할 수 있는지 명확히 기술하라 (c) 어떤 특정 영역은 왼쪽 마우스 버튼 클릭에 대하여 반응을 한다 어떤 영역인지 (자신 이 붙인 이름을 사용하여) 기술하라 (d) 그 영역에서 왼쪽 마우스 버튼을 눌러다가 뗄 때 어떤 영역의 내용이 어떻게 바뀌는 지 정확히 기술하라 그 어떤 작용에 대하여 필요하다면 마우스 커서의 위치를 정확히 기술할 것 (e) 만약 9번과 번 문장 사이에 다음 문장을 삽입하고, glutsetwindow(subwindow); 번 문장을 다음 두 문장으로 대치 할 경우에 대하여, glutsetwindow(subwindow); glclearcolor(,,, ); 바로 위 문제에 대하여 답하라 <수고 많았습니다!> 그림 에 주어진 GLUT API 함수를 통한 윈도 우 프로그래밍 코드를 보고 답하라 (a) 이 프로그램을 처음 수행시키면 가로-세로 픽셀 크기의 윈도우가 화면에 도시된 다 이 윈도우 안에는 두 개의 사각형이 그 려지는데, 전체 윈도우 안에서의 이 두 사 각형의 정확한 크기와 위치를 그리고 이 두 사각형으로 인하여 생성되는 세 영역의 초 기 색깔을 명확히 기술하라 (이 세 영역에 대하여 적절히 (A), (B), 그리고 (C)로 이름 을 붙이고, 이후 문제에서는 이 영역 이름을 사용하여 답할것) (b) 이 프로그램에서는 특정 윈도우 영역에서 메뉴를 사용할 수 있는데, (i) 그 영역이 어 - 4년 4월 5일(금) 오전 :3 (AS 44) c 4 임인성
서강대학교공과대학컴퓨터공학과 CSE47 기초컴퓨터그래픽스중간고사 (8/8) : int MainWindow, SubWindow, SubWindow; 3: void mouse(int button, int state, int, int ) { 4: if ((button == GLUT LEFT BUTTON) && (state == GLUT DOWN)) { 5: if ( <= ) { 6: glclearcolor(,,, ); 7: glutpostredispla(); 8: 9: else { : glclearcolor(,,, ); : glutpostredispla(); : 3: 4: else if ((button == GLUT LEFT BUTTON) && (state == GLUT UP)) { 5: if ( <= ) { 6: glclearcolor(,,, ); 7: glutpostredispla(); 8: 9: else { : glclearcolor(,,, ); : glutpostredispla(); : 3: 4: 5: void displa(void) { glclear(gl COLOR BUFFER BIT); glflush(); 6: void hello(int value) { 7: if (value) { glclearcolor(,,, ); glutpostredispla(); 8: else { glclearcolor(,,, ); glutpostredispla(); 9: 3: void main (int argc, char **argv) { 3: glutinit(&argc, argv); glutinitdisplamode(glut RGBA); glutinitwindowsize(,); 3: MainWindow = glutcreatewindow("4 CSE37 Midterm Eam"); 33: glutcreatemenu(hello); 34: glutaddmenuentr("bo", ); glutaddmenuentr("girl", ); 35: glutattachmenu(glut RIGHT BUTTON); 36: glutdisplafunc(displa); 37: glclearcolor(,,, ); 38: SubWindow = glutcreatesubwindow(mainwindow,,, 4, ); 39: glutdisplafunc(displa); 4: glclearcolor(,,, ); 4: SubWindow = glutcreatesubwindow(mainwindow, 6, 5,, 4); 4: glutdisplafunc(displa); 43: glutmousefunc(mouse); 44: glclearcolor(,,, ); 45: glutmainloop(); 46: Figure : GLUT 함수를통한윈도우프로그래밍예 - 4 년 4 월 5 일 ( 금 ) 오전 :3 (AS 44) - c 4 서강대학교공과대학컴퓨터공학과임인성