서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 1/9 [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 담당교수: 임 인 성 답은 반드시 답안지에 기술할 것. 공간이 부족할 경우 반드시 답안지 몇 쪽의 뒤에 있다고 명기한 후 기술할 것. 그 외의 경우의 답안지 뒤쪽이나 연습지 에 기술한 내용은 답안으로 인정 안함. 1. 2차원 기하 변환 중 이동 변환 T tx, ty, 크기 변 환 Ssx, sy, 그리고 회전 변환 Rθ에 해당하는 3행 3열 행렬들을 고려하자. a 임의의 점 x, y를 y, x로 변환해주는 3행 3열의 기하 변환 행렬 M1 을 위의 기 본 변환 행렬들의 합성을 통하여 표현하라. 최종 행렬의 내용도 정확히 기술할 것. 2. 그림 2에서 오른쪽에 있는 비행기는 세상 좌 표계 공간에서 8자 모양의 궤적을 따라 회전 을 하고 있다 아래의 프로그램에서 Line B 의 draw airplane 함수를 호출할 때 그려짐. 또한 원점 근처에 있는 비행기는 이 비행기가 자신의 모델링 좌표계 있는 즉 아래의 프로그 램에서 아무런 모델링 변환 없이 Line A의 draw airplane 함수를 호출할 때 그려지는 모습에 해당한다. 참고로 angle2와 phase 변수 는 정수 타입의 변수로 0으로 초기화되어 있고, 각 원의 반지름은 0.2*win height임. b 임의의 점 x, y를 y, x로 변환해주는 3 행 3열의 기하 변환 행렬 M2 를 위의 기본 변환 행렬들의 합성을 통하여 표현하라. 최 종 행렬의 내용도 정확히 기술할 것. c T tx, ty S1, 1 = S1, 1T α, β라 할 때, α와 β의 값은? d RθS1, 1 = S1, 1Rγ라 할 때, γ의 값은? e 그림 1a의 직사각형 영역의 내용을 b의 직사각형 영역으로 매핑해주는 3행 3열의 기하 변환 행렬 M3 를 위의 기본 변환 행 렬들을 사용하여 합성하라. 최종 행렬 값도 정확히 기술할 것. y 2 5 1 2 7 2 6 a 변환 전 x 10 x' y' b 변환 후 Figure 1: 2차원 윈도우 매핑 Figure 2: 비행기 애니메이션 #define TO RAD 3.141592/180.0 void timerint value { gluttimerfunc15, timer, 2; angle2 = angle2 + 1 % 180; if angle2 == 0 phase = phase + 1 % 4; trans2 x = 0.2*win height *cosdouble TO RAD*angle2 + 1.0; trans2 y = 0.2*win height *sindouble TO RAD*angle2; glutpostredisplay; void display void { glcleargl COLOR BUFFER BIT; - 2012년 4월 26일목 오후 7:00 AS 414 c 2012 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 yw draw axes; draw path; draw airplane; // Line A glpushmatrix; switchphase { case 1: gltranslatef-0.4*win height, 0.0, 0.0; glscalef1.0, -1.0, 1.0; break; case 2: glscalef B, 1.0; break; case 3: gltranslatef0.2*win height, 0.0, 0.0; glscalef-1.0, 1.0, 1.0; gltranslatef-0.2*win height, 0.0, 0.0; glscalef1.0, -1.0, 1.0; gltranslateftrans2 x, trans2 y, 0.0; glrotatef A ; draw airplane; // Line B glpopmatrix; glutswapbuffers; a 프로그램 문맥 상 이 그림이 그려진 순간의 변수 phase의 값은 얼마일까? b 프로그램 문맥 상 A에 들어갈 내용을 C 언어 문법에 맞게 정확히 기술하라. WC 4. 그림 4에는 점 q = qx qy qz t 을 중심으로, 각각 세 개의 벡터 u = ux uy uz t, v = vx vy vz t, n = nx ny nz t 와 u0 = u0x u0y u0z t, v 0 = vx0 vy0 vz0 t, n0 = n0x n0y n0z t 에 의해 정의가 되는 두 개의 프레임이 도시되어 있다 여기서 각 프레임의 세 벡터는 서로 수직인 단위 벡터 들임. a 지금 Frame 1을 Frame 2로 맞추어 주는 아 핀변환에 해당하는 4행 4열 행렬 M 을 이동 변환과 회전 변환을 적절히 합성하여 구하 려 한다. 이때 회전 변환을 두 번 적용할 5 xw 5 ᄗ ᇷ ޗ #ᄬ zw ᰚ #ᄬ ᬧ #ᄬ Figure 3: 간단한 뷰잉 변환 경우의 M 을 4행 4열 기하 변환 행렬들의 곱으로 표현하라. 최종 변환 행렬이 아니라 곱해지는 각 요소 행렬들의 16개 원소를 정 확히 기술할 것. b 위의 문제에서 회전 변환을 한 번 적용할 경우의 M 을 4행 4열 행렬의 곱으로 표현 하라. 마찬가지로 곱해지는 각 행렬의 16 개 원소를 정확히 기술하고, 특히 회전 변 환 행렬의 내용은 여섯 개의 벡터 u, v, n, u0, v 0, n0 들의 곱 을 사용하여 간결하게 표현하라 각 벡터는 3행 1열의 벡터임을 명심하고, 예를 들어, u v t 와 같은 방식의 곱셈 사용. y c 프로그램 문맥 상 B에 들어갈 두 개의 값 을 기술하라. 3. 그림 3에는 카메라의 위치와 방향을 설정해주 는 프레임이 도시되어 있다. 이 경우에 해당 하는 뷰잉변환을 설정해주는 OpenGL 코드를 gltranslatefx, y, z, glscalefx, y, z, 그리고 glrotatefa, x, y, z 등의 함수만을 사용하여 가급적 적은 회수의 함수 호출을 통 하여 구현하라. 2/9 M p u' Frame 2 n' n z p' v q v' x u Frame 1 Figure 4: 프레임 변환 문제 5. 다음은 어떤 프로그램의 일부이다. typedef struct cam { float pos[3]; float uaxis[3], vaxis[3], naxis[3]; GLfloat mat[16]; int move; GLdouble fovy, aspect, near c, far c; Cam; Cam cam;... - 2012년 4월 26일목 오후 7:00 AS 414 c 2012 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 #define Mrow,col m[col*4+row] void set rotate matglfloat *m { M0,0 = ; M0,1 = ; M0,2 = ; M1,0 = ; M1,1 = ; M1,2 = ; M2,0 = ; M2,1 = ; M2,2 = ; M0,3 = M1,3 = M2,3 = 0.0; M3,0 = M3,1 = M3,2 = 0.0; M3,3 = 1.0; void rendervoid { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; glmultmatrixfcam.mat; gltranslatef,, ; draw axis; draw world; // Modeling Transform here. glutswapbuffers; #define CAM TSPEED 0.05 void renew cam pos xint del { cam.pos[0] += CAM TSPEED*del* A ; cam.pos[1] += CAM TSPEED*del* B ; cam.pos[2] += CAM TSPEED*del* C ; void renew cam pos yint del { void renew cam pos zint del { #define TO RADIAN 0.01745329 void get rotation matfloat x, float y, float z, float angle, float m[3][3] {... void renew cam ori xint angle { float m[3][3], tmpx, tmpy, tmpz; get rotation matcam.uaxis[0], cam.uaxis[1], cam.uaxis[2], CAM RSPEED*angle, m; cam.vaxis[0] = m[0][0]*tmpx=cam.vaxis[0] + m[0][1]*tmpy=cam.vaxis[1] + m[0][2]*tmpz=cam.vaxis[2]; cam.vaxis[1] = m[1][0]*tmpx + m[1][1]*tmpy + m[1][2]*tmpz; cam.vaxis[2] = m[2][0]*tmpx + m[2][1]*tmpy + m[2][2]*tmpz; cam.naxis[0] = ; cam.naxis[1] = ; cam.naxis[2] = ; set rotate matcam.mat; void renew cam ori yint angle { CSE4170 기초 컴퓨터 그래픽스 중간고사 3/9 void renew cam ori zint angle { a 프로그램 문맥 상 투영 변환과 직접적인 관 련이 있는 변수들을 모두 나열하라. b set rotate mat*은 뷰잉 변환과 관련된 행렬에 대한 함수이다. 프로그램 문맥 상 M0,0 = ;, M1,0 = ;, M2,0 = ; 문장에는 어떤 내용이 들어가야 할지 C언어 문법에 맞게 기술하라. c 프로그램 문맥 상 get rotation mat* 함 수는 정확히 어떤 수학적인 내용을 어떤 인 자를 통하여 받아들여, 어떤 수학적인 내용 을 어떤 인자로 통하여 돌려주는지를 정확 히 기술하라. d 디스플레이 컬백 함수인 render 함수 내 부에서 gltranslatef* 함수 호출 시 필 요한 세 인자를 C언어 문법에 맞게 기술하 라. e renew cam pos x* 함수는 점 cam.pos와 세 벡터 cam.uaxis, cam.vaxis, cam.naxis 로 정의된 카메라 프레임을 cam.uaxis 방 향을 따라 del 값이 양수일 때 오른쪽으로, 음수일 때는 왼쪽으로 이동시켜주는 작업 을 한다. 이러한 목적을 달성하도록 A, B, 그리고 C에 들어갈 내용을 C언어 문 법에 맞게 정확히 기술하라. f renew cam ori x* 함수도 카메라에 프 레임에 대하여 어떤 조작을 가하고 있는데 그것이 무엇인지 정확히 기술하라. 6. 다음은 void gluperspectivefovy, asp, n, f; 함수에 관한 문제이다. a 그림 5는 이 함수가 정의하는 뷰 볼륨을 도 시하고 있다. 눈 좌표계 EC 상에서 투 영 참조점이 원점인 상황에서 임의의 점 xe ye ze t 인 점을 ze = n 평면, 즉 ze 축 에 수직이고 음의 방향으로 n만큼 떨어진 평면에 원근 투영한 점을 x e ye nt 이라 할 때, x e 와 ye 값을 기술하라. b 위 함수에 의해 정의되는 뷰 볼륨의 앞면에 해당하는 직사각형 영역 0번 점과 1번 점을 포함하는 직사각형의 네 개의 모서리 중 0번 점과 1번 점의 좌표를 기술하라. 당연히 ze 좌표는 n이며, 위 함수의 인자 f ovy, asp, n, f 등과 tan, cot 등의 삼각 함 수를 사용하여 표현하라. - 2012년 4월 26일목 오후 7:00 AS 414 c 2012 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 4/9 ye w ze 옆모습 3 2 ye h 0 -f asp = w/h 1 ze xe -n fovy Figure 5: 투영 변환 c 뷰 볼륨 안에 존재하는 점을 ze = n 평면 에 투영한 점 x e ye nt 은 바로 위 문제의 직사각형 영역 안에 들어오게 되는데, 이 영 역을 x와 y축 각각에 대해 -1에서 1까지의 구간이 정의하는 정사각형 영역으로 매핑 을 해주면, 정규 디바이스 좌표계 NDC 상에서의 좌표를 구할 수 있게 된다. 위 두 문제의 결과를 바탕으로 하여, EC 상의 점 xe ye ze t 을 위 함수에 의해 NDC로 변환 해준 점의 x, y 좌표 xnd ynd t 를 xe, ye, ze, 그리고 위 함수의 인자 f ovy, asp, n, f 값과 tan, cot 등의 삼각 함수를 사용하여 표현하 라. 간단히 유도 과정을 기술할 것. int iii = 0; void displayvoid { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glpushmatrix; glrotatefiii*90.0, 0.0, 0.0, 1.0; glbegingl TRIANGLES; glvertex2f1.0, 0.0; glvertex2f1.0, 1.0; glvertex2f0.0, 1.0; glend; glpopmatrix; glflush; d znd 의 경우 다음과 같이 됨을 보일 수 있는 데, void mousepressint button, int state, int x, int y { if button == GLUT RIGHT BUTTON && state == GLUT DOWN && glutgetmodifiers == GLUT ACTIVE SHIFT iii = iii+1%4; glutpostredisplay; znd = +n ff n ze f2nf n ze 지금까지 구한 모든 값을 사용하여 위 함수 가 계산을 해주는 4행 4열 투영 변환 행렬 MP 를 정확히 기술하라. e 이제 위의 행렬 MP 에 xe ye ze 1t 을 곱하 면 절단 좌표계 CC 상의 점 xc yc zc wc t 로 변환이 되는데 이때 wc 값은 기하적으로 어떤 정보를 제공할까? f 투영 공간 projective space인 CC에서 다 시 유클리드 공간인 NDC로 돌아오기 위해 수학적으로 xc, yc, zc 값을 wc 로 나누어주 는데, 이때 기하적으로 어떤 현상이 발생하 는가? 7. 아래 주어진 2차원 기하 변환에 관한 프로그램 을 보고 답하라. void reshapeint width, int height { glviewport0, 0, width, height; glmatrixmodegl PROJECTION; glloadidentity; glmatrixmodegl MODELVIEW; glloadidentity; glutpostredisplay; void OpenGLInitandRegisterCallbackvoid { glclearcolor1.0, 1.0, 1.0, 1.0; glpolygonmodegl FRONT AND BACK, GL FILL; glcolor3f1.0, 0.0, 0.0; glutdisplayfuncdisplay; glutreshapefuncreshape; - 2012년 4월 26일목 오후 7:00 AS 414 c 2012 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 5/9 Figure 6: OpenGL을 사용한 2차원 기하 변환 glutmousefuncmousepress; void main int argc, char **argv { glutinit&argc, argv; glutinitdisplaymodeglut RGBA; glutinitwindowsize500, 500; glutcreatewindow"midterm Problem"; OpenGLInitandRegisterCallback; glutmainloop; a 이 프로그램은 사용자가 어떤 행동 action 을 취할 때마다, 네 번을 주기로 화면의 내 용이 반복된다. 과연 어떤 행동인지 정확히 기술하라. b 사용자가 위 문제의 행동을 취할 때 화면의 그림이 어떤 식으로 순환하는지, 그림 6과 같은 방식으로 그려라. 가장 처음 상태를 가 장 왼쪽에 도시하고, 도형의 모양과 위치를 가급적 정확히 표시하며, 어떤 부분이 적색 영역인지 분명히 밝힐 것. c 원래의 프로그램 상태에서 dispaly 함 수의 glrotatef*; 문장 바로 다음에 다 음 문장을 삽입하면 화면의 내용이 어떻게 반복될지, 그림 6과 같은 방식으로 그려라. gltranslatef-1.0, -1.0, 0.0; d 바로 위 문제의 프로그램 상태에서, 즉 이 동 변환 관련 문장이 삽입된 상태에서 reshape 함수의 glutpostredispaly; 문장 바로 직전에 아래와 같은 문장을 삽입 할 경우 화면의 내용이 어떻게 반복될지, 그림 6과 같은 방식으로 그려라. glortho0.0, 1.0, 0.0, 1.0, -1.0, 1.0; 8. 다음 단답식 문제에 답하라. 필요할 경우 OC Object Coordinate, CC, EC, MC, NDC, WC, WdC Window Coordinate 등의 OpenGL 좌표계 이름을 적절히 사용하라. a 3차원 투영공간의 점 6.0, 6.0, 9.0, 3.0에 해당하는 아핀공간의 점의 좌표 x, y, z를 기술하라. b RGB 모델로 값이 0.3, 0.5, 1.0인 색깔을 CMY 모델로 나타내면? c 3차원 아핀변환을 나타내는 4행 4열 행렬 M = mij, i, j = 1, 2, 3, 4이 변환 후에 도 물체의 크기와 모양을 보존해주기 위하 여 M 의 어느 부분이 어떤 성질을 가져야 하는지 행렬이나 벡터의 성질을 사용하여 기술하라. d 다음 행렬의 역행렬 M 1 의 내용을 기술하 라. 1 0 0 10 0 2 22 0 2 M = 2 2 0 0 2 2 0 0 0 1 e 어떤 4행 4열 행렬 M = mij, i, j = 1, 2, 3, 4이 아핀 변환 행렬이 되기위한 조 건을 mij 의 값을 통하여 기술하라. f 3차원 공간의 [ 1, 1] [ 1, 1] [ 1, 1]의 영 역만 고려하는 좌표계는 어느 좌표계일까? g 카메라의 뷰 방향에 대해 꼭지점이 나열된 순서를 통하여 불필요한 삼각형 예를 들 어, 안보이는 뒷면에 해당하는을 제거할 수 있는데, OpenGL에서는 이러한 과정이 어느 좌표계에서 수행이 될까? h 정상적인 렌더링 상황에서 3차원 좌표점 을 동차좌표 x, y, z, w로 표현할 때 순간 적으로 w가 1이 아닌 값이 나타날 수 있는 OpenGL 좌표계 이름은? i 원근 투영을 사용하여 렌더링을 할 경우, OpenGL 뷰잉 파이프라인에서 정확히 어 느 좌표계에서 어느 좌표계로 넘어갈 때, 원근감이 생성이 되는가? - 2012년 4월 26일목 오후 7:00 AS 414 c 2012 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교 공과대학 컴퓨터공학과 j OpenGL의 뷰잉 파이프라인에서 카메라 의 위치와 방향을 설정 해주는 변환은 정 확히 어느 좌표계에서 어느 좌표계로 보내 주는 변환인가? k OpenGL의 뷰잉 파이프라인에서촬영한 필 름을 현상한 후 인화지에 확대/인화하는 과 정은 정확히 어느 좌표계에서 어느 좌표계 로 보내주는 과정에 해당하는가? l 만약 여러분이 glscalefx, y, z 함수를 가장 적은 회수의 덧셈/뺄셈, 곱셈, 그리고 나눗셈 연산을 사용하여 구현한다고 할 때 각각 몇 번씩 수행해야 할까? 여기서 스택 에 있는 4행 4열 행렬은 임의의 값을 가질 수 있다고 가정하고, 답은 +/-= 번, *= 번, /= 번과 같이 기술하라. m 정상적인 렌더링 상황에서 Projection Matrix Stack의 탑에 있는 행렬에 곱해지는 꼭 지점 좌표가 존재하는 OpenGL 좌표계 이 름은? n 3차원 공간의 두 벡터 p = px py pz t 와 q = qx qy qz t 에 대하여 외적 cross product 연산을 가한 벡터 r = p q = rx ry rz t 의 y 좌표 ry 의 값을 기술하라. CSE4170 기초 컴퓨터 그래픽스 중간고사 6/9 f 59번의 이동 변환 관련 문장이 수행되기 직전의 모델뷰 행렬 스택의 내용을 정확 하게 그려라. MV MP, MV P 와 그림 7 의 행렬 기호등을 적절히 사용하라. 현재 draw wheel and nutangle 함수는 100번 문 장에서 호출한 상태임. g 52번 문장의 draw wheel and nutangle 함 수에서 이상한 부분을 지적하고 수정하라. 이유를 설명할 것. h 이 프로그램에서 사용하는 변수들을 사용 하여 정규 디바이스 좌표계 NDC의 좌표 xnd, ynd 를 윈도우 좌표계 WdC의 좌표 xwd, ywd 로 어떻게 변환 시켜주는지 뷰폿 변환x와 y 좌표에 대해서만을 유도하라. i 이 프로그램에서 뷰 매핑과 가장 관련이 많 은 문장의 번호를 기술하라. j 이 프로그램에서 자동차를 세상 좌표계로 배치해주는 모델링 변환이 강체 변환인지 아닌지 답하고 그 이유를 간략히 설명하라. o glulookat-1.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.9, 0.0; 문장 수행 시 계산이 되는 뷰잉 변환 행렬 MV = mij, i, j = 1, 2, 3, 4의 세 번째 행의 원소들 m31, m32, m33, m34 의 내용을 기술하라. 9. 시험지 뒤에 첨부한 프로그램은 적절한 모델링 변환을 통하여 자동차를 그려주는 OpenGL 프 로그램이다. 이 프로그램을 보면서 답하라. a 이 프로그램은 그림 7에 주어진 자동차에 대한 트리 구조를 어떤한 방식으로 탐색을 하고 있는가? 자료 구조 시간에 배운 용어 를 사용할 것. b 이 프로그램에서 원근 나눗셈과 가장 관련 이 있는 문장의 번호는? c 이 프로그램에서는 사용자가 어떠한 방식 으로 자동차를 앞으로 움직이게 할수 있을 까? 정확하게 기술할 것. d 세상 좌표계 WC를 기준으로 할 때 카메 라가 세상을 바라보는 방향 벡터를 필요 시 이 프로그램에서 사용하는 변수들을 사 용하여 표현하라. e 눈 좌표계 EC를 기준으로 할 때 카메라 가 세상을 바라보는 방향 벡터를 필요 시 이 프로그램에서 사용하는 변수들을 사용 하여 표현하라. - 2012년 4월 26일목 오후 7:00 AS 414 c 2012 서강대학교 공과대학 컴퓨터공학과 임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 7/9 Figure 7: 자동차의계층적표현 - 2012 년 4 월 26 일 목 오후 7:00 AS 414 - c 2012 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 8/9 filename mvcar.cpp page 1 1 #include <stdio.h> 2 #include <math.h> 3 #include <GL/glut.h> 4 8 5 #define MAX_POLY 200 6 #define MAX_VERT 20 7 #define MAX_PATH 1000 9 #define DRAW_CAR_DUMMY 2001 10 #define DRAW_CAR_CORRECT 2002 11 12 typedef struct { 13 int nvertex; 14 float poly[max_vert][3]; 15 mypolygon; 16 17 mypolygon body[max_poly], wheel[max_poly], nut[max_poly]; 18 int npolyb, npolyw, npolyn; 19 20 float path[max_path][3]; 21 int npath, path_exist, drawing_state = DRAW_CAR_CORRECT; 22 23 double dist; 24 25 int prev_i, cur_i = 0; 26 int rightbuttonpressed = 0; 27 28 void read_objectchar *file, mypolygon *object, int *npoly; 29 void read_pathchar *file; 30 void read_objectsvoid; 31 void draw_axesvoid; 32 void draw_pathvoid; 33 void draw_groundvoid; 34 35 void draw_bodyvoid { 36 // Draw the body. 37... 38 39 40 void draw_wheelfloat angle { 41 // Draw the wheel. 42... 43 44 45 void draw_nutvoid { 46 // Draw the nut. 47... 48 49 50 #define rad 1.7 51 #define ww 1.0 52 void draw_wheel_and_nutfloat angle { 53 int i; 54 55 draw_wheelangle; // draw wheel object 56 for i = 0; i < 5; i++ { 57 // nut i 58 glpushmatrix; 59 gltranslatefrad-0.5, 0, ww; // rad = 1.7, ww = 1.0 60 glrotatef72.0*i, 0.0, 0.0, 1.0; 61 draw_nut; // draw nut object 62 glpopmatrix; 63 64 65 66 #define TO_DEG 57.29579 67 void normalize_vec3float *v { 68... 69 70 71 float dot_prod_vec3float *u, float *v { 72... 73 74 75 float compute_length_mul_two_vec3float *u, float *v { 76... 77 78 79 float angle_between_two_vec3float *u, float *v { 80... 81 82 83 void cross_prod_vec3float *u, float *v, float *n { 84 //??? 85 86 87 88 float wheel_rot_angle_in_yvoid { 89... 90 91 92 float wheel_rot_angle_in_zvoid { 93... 94 95 96 void draw_car_dummyvoid { 97 draw_body; // draw body object 98 glpushmatrix; 99 gltranslatef-3.9, -3.5, 4.5; 100 draw_wheel_and_nut0.0; // wheel 0 101 glpopmatrix; 102 103 glpushmatrix; 104 gltranslatef3.9, -3.5, 4.5; 105 draw_wheel_and_nut0.0; // wheel 1 106 glpopmatrix; 107 108 glpushmatrix; 109 gltranslatef-3.9, -3.5, -4.5; 110 glscalef1.0, 1.0, -1.0; 111 draw_wheel_and_nut0.0; // wheel 2 112 glpopmatrix; 113 114 glpushmatrix; 115 gltranslatef3.9, -3.5, -4.5; 116 glscalef1.0, 1.0, -1.0; 117 draw_wheel_and_nut0.0; // wheel 3 118 glpopmatrix; 119 120 121 void set_up_rot_matfloat *m, int i { 122... 123 124 125 void draw_fenceglfloat r, GLfloat g, GLfloat b { 126... printed at 4/20/103, 23:01-2012 년 4 월 26 일 목 오후 7:00 AS 414 - c 2012 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 9/9 filename mvcar.cpp page 2 127 128 129 void draw_fencesvoid { 130... 131 132 133 void draw_world void { 134 GLfloat m[16]; 135 136 glmatrixmodegl_modelview; // Modeling Transformation 137 glloadidentity; 138 glulookat-15.0, 20.0, 40.0, path[cur_i][0], 4.89, path[cur_i][2], 0.0, 1.0, 0.0; 139 140 draw_ground; 141 draw_fences; 142 draw_axes; 143 if path_exist draw_path; 144 145 set_up_rot_matm, cur_i; 146 147 glpushmatrix; 148 gltranslatefpath[cur_i][0], 4.89, path[cur_i][2]; 149 glmultmatrixfm; 150 151 draw_car_dummy; 152 glpopmatrix; 153 154 155 void rendervoid { 156 glcleargl_color_buffer_bit; 157 draw_world; 158 glutswapbuffers; 159 160 161 void keyboard unsigned char key, int x, int y { 162... 163 164 165 int prevx_mouse; 166 void mousepressint button, int state, int x, int y { 167 if button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN { 168 prevx_mouse = x; 169 rightbuttonpressed = 1; 170 171 else if button == GLUT_RIGHT_BUTTON && state == GLUT_UP 172 rightbuttonpressed = 0; 173 174 175 void mousemoveint x, int y { 176 double deltax; 177 178 if rightbuttonpressed { 179 deltax = x - prevx_mouse; 180 prevx_mouse = x; 181 if cur_i + deltax > 0 && cur_i + deltax < npath-1 { 182 prev_i = cur_i; cur_i += deltax; 183 dist = sqrtpath[cur_i][0]-path[prev_i][0]*path[cur_i][0]-path[prev_i][ 0] + 184 path[cur_i][1]-path[prev_i][1]*path[cur_i][1]-path[prev_i][1] + 185 path[cur_i][2]-path[prev_i][2]*path[cur_i][2]-path[prev_i][2] ; 186 if deltax < 0.0 dist *= -1.0; 187 glutpostredisplay; 188 189 190 191 192 void reshapeint width, int height { 193 glviewport0, 0, width, height; 194 195 glmatrixmodegl_projection; 196 glloadidentity; 197 gluperspective30.0, width/double height, 1.0, 150.0; 198 199 200 void init_openglvoid { 201... 202 203 204 void init_windowsvoid { 205 glutinitdisplaymodeglut_rgb GLUT_DOUBLE; 206 glutinitwindowsize1280, 1024; 207 glutcreatewindow"car in Hierarchy 2"; 208 glutdisplayfuncrender; 209 glutkeyboardfunckeyboard; 210 glutmousefuncmousepress; 211 glutmotionfuncmousemove; 212 glutreshapefuncreshape; 213 214 215 void mainint argc, char **argv { 216 read_objects; 217 glutinit&argc, argv; 218 init_windows; 219 init_opengl; 220 glutmainloop ; 221 222 printed at 4/20/103, 23:01-2012 년 4 월 26 일 목 오후 7:00 AS 414 - c 2012 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 1/8 [CSE4170: 기초컴퓨터그래픽스 ] 중간고사 담당교수 : 임인성 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 1. 다음은 2 차원기하변환에관한문제이다. a 점 4, 5 를중심으로물체의크기를두배확대해주는 3 행 3 열의기하변환행렬 M 을이동변환 T t x, t y, 크기변환 Ss x, s y, 회전변환 Rθ 등의기본변환행렬을사용하여합성하려한다. i. M 을세개의기본변환행렬의곱으로표현하라. ii. M 을두개의기본변환행렬의곱으로표현하라. b 임의의점 x, y 를 y, x 로변환해주는 3 행 3 열의기하변환행렬 M 을위문제에주어진기본변환행렬을사용하여표현하라. c T t x, t y S1, 1 = S1, 1T α, β 라할때, α 와 β 의값은? d RθS1, 1 = S1, 1Rγ 라할때, γ 의값은? e 임의의각도 θ 에대해 c = cosθ 와 s = sinθ 라하자. RθT t x, t y = T δ, ϵrθ 이라할때, δ 와 ϵ 의값을 t x, t y, c, s 등을사용하여표현하라. 2. 그림 1 과아래코드를고려하자. void display void {. glcleargl COLOR BUFFER BIT; draw axes text line; draw airplane; // Draw A glpushmatrix; // Transforms for B draw airplane; // Draw B B A D Figure 1: 2 차원기하변환 glpopmatrix; glpushmatrix;. draw airplane; // Draw C glpopmatrix; glpushmatrix; gltranslatefh/4.0, 0.0, 0.0; glrotatef45.0, 0.0, 0.0, 1.0; glscalefsx, sy, 1.0; glrotatef-45.0, 0.0, 0.0, 1.0; gltranslateftx, ty, 0.0; glrotatef270.0, 0.0, 0.0, 1.0; glscalef2.0, 2.0, 1.0; draw airplane; // Draw D glpopmatrix;. 아래문제에서요구하는 2 차원기하변환을다음 OpenGL 함수들을적절히사용하여 C 언어문법에맞게정확히기술하라. 함수호출순서는 OpenGL 프로그래밍관례에따르고, 이동 C - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 2/8 변환이필요하다면 z 값은 0 으로, 크기변환이필요하다면 z 값은 1 로설정할것. void gltranslatefglfloat x, GLfloat y, GLfloat z; void glscalefglfloat x, GLfloat y, GLfloat z; void glrotatefglfloat angle, GLfloat x, GLfloat y, GLfloat z; a // Draw X 라인의 draw airplane; 문장은각각이그림에서 X 로표시된비행기를그려주고있다. B 비행기는 A 비행기를세배확대하여원점둘레로시계방향으로 270 도회전한후, 그중심을 W/4.0, H/4.0 지점으로이동시켜그린상태를보여주고있다. 이러한그림이그려지도록 // Transforms for B 부분의내용을 OpenGL 함수를사용하여기술하라. b 비행기 C는비행기 A를시계방향으로 90 도회전한후, 그중심을 W/2.5, H/8.0 지점으로이동시켜그린상태를보여주고있다. 지금그러한비행기 C를두배확대한후 y = x H 4.0 둘레로반사시켜비행기 D를그려주려한다. 이때필요한 sx, sy 와 tx, ty의내용을정확히기술하라. c 비행기 D 를그려주는코드는아래와같이단순화시킬수있다. glpushmatrix; gltranslatefttx, tty, 0.0; glrotatefra, rx, ry, rz; glscalefssx, ssy, 1.0; draw airplane; // Draw D glpopmatrix; 이때필요한 ttx, tty, ra, rx, ry, rz, ssx, ssy 의내용을정확히기술하라. b 이행렬의왼쪽 - 위쪽의 3 행 3 열부행렬의세개의열벡터를각각 r 1, r 2, r 3 라할때, 이세개의벡터가만족하는수학적인성질을정확히기술하라. c n 에회전변환을가하려면 M 1 t 에 n 을곱하면된다. 이때 M 1 t 의내용을정확히기술하라. 4. DOP Direction of Projection 가 2, 2, 2 이고 PP Projection Plane 가 2x + 2y + 2z = 1 인평행투영의변환행렬이다음과같다고하자. M = e f g h i j k l m n o p q r s t a 네번째행의 q, r, s, t 값을기술하라. b 첫번째행의 e, f, g, h 값을유도하라 유도과정을기술할것. 5. 다음은 OpenGL 을사용한 3 차원뷰잉에관련된문제이다. 아래그림과코드를보고답하라. a 프로그램초기수행모습 소가여러분을향해있음 3. 3 차원공간에주어진법선벡터 normal vector n = nx, ny, nz t 에대하여회전변환을가하는문제를고려하자. a 회전변환행렬 M을아래와같이정의한다면, r 11 r 12 r 13 v 1 r M = 21 r 22 r 23 v 2 r 31 r 32 r 33 v 3, 0 0 0 1 이때 v 1, v 2, v 3 의값은어떤값을가질까? b r 키를 16 번누른후의모습 즉 90 도회전한모습 Figure 2: 간단한 3 차원뷰잉 빨강, 초록, 파랑색깔의세직선은각각세상좌표계에서의 x w, y w, z w 축을나타냄 - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 3/8 void displayvoid { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; glulookat,,,,,,,, ; // ModelView matrix draw axes; glcolor3f0.2, 0.5, 0.2; glpushmatrix; // We need a modeling transform here. draw cow; glpopmatrix; glflush; a 위의코드에서 draw cow 함수는자신의모델링좌표계 Modeling Coordinate, MC 에서정의된소를구성하는삼각형을그려주는함수이다. 그림 2a 는이소를각축방향으로 5 배확대하여, x 축둘레로 90 도회전한후, 5.0, 5.0, 1.5 만큼이동시켜그려준상태를보여주고있다. 이때 // We need a modeling transform here. 에들어갈내용을 OpenGL 함수를적절히사용하여기술하라 2 번문제에기술된 OpenGL 함수정의를참고할것. b r 키를누를때마다 int rotangle = 0; 과같이정의된전역변수 global variable rotangle 에대해다음과같은내용의코드가수행된다고가정하자. case r : rotangle = rotangle+5%360; glutpostredisplay; break; 이에반응하여 r 키를한번씩누를때마다, 위의문제에서와같이세상좌표계 World Coordinate, WC 에배치된소가이좌표계에서 5.0, 5.0, 1.5 점을지나고 z w 축 그림에서수직방향의축 에평행한직선둘레로 5 도씩회전하도록하려한다 그림 2b 참조. 위문제에서기술한여러분의코드를어떻게확장하면될지정확히기술하라. c 이문제에서는카메라가세상좌표계의 15.0, 5.0, 1.5 지점에서 5.0, 5.0, 1.5 지점을바라보고있으며, 양의 z w 방향이위쪽방향으로설정되어있다. 이에필요한 glulookat 함수의 9 개인자를정확히기술하라. d 이프로그램이정상적으로수행될때 // ModelView matrix 시점에서모델뷰행렬스택의탑에있는 4 행 4 의뷰잉변환행렬 M V 의내용을정확히기술하라. e 이뷰잉변환행렬 M V 는세상좌표계의벡터 5.0, 5.0, 1.5 t 를눈좌표계 Eye Coordinate, EC 의어떤점으로변환해줄까? f M V 는 M V = RT 와같이회전변환과이동변환을나타내는두개의 4 행 4 열행렬 R 과 T 의곱으로표현이가능한데, 이때 R 과 T 의내용을정확히기술하라. g M V 의역행렬을 MV 1 = T 1 R 1 과같이이동변환행렬 T 1 과회전변환행렬 R 1 의곱으로표현할때 4행 4열행렬인 R 1 의내용을기술하라. h M V 의역행렬을 MV 1 = R 2 T 2 와같이회전변환행렬 R 2 와이동변환행렬 T 2 의곱으로표현할때 4행 4열행렬인 T 2 의내용을기술하라. 6. OpenGL 에서는그림 3 에도시한바와같이눈좌표계 EC 상에서 glortho* 함수를사용하여직교투영을위한뷰잉볼륨을설정하면, 이안의내용이정규디바이스좌표계 NDC 의정규화된정육면체영역으로뷰매핑된다. a 이때절단좌표계 Clip Coordinate, CC 상에서의절단 clipping 과정후정규디바이스좌표계 Normalized Device Coordinate, NDC 로투영된꼭지점의 x nd 와 y nd 의좌표값은각각어떤범위의값을가질수있을까? Figure 3: glorthol, r, b, t, n, f 함수 b 이함수가호출될때생성되는투영변환행렬 M ortho 를기본변환행렬 T x, y, z 이동변환, Sx, y, z 크기변환, Rangle, x, y, z 회전변환 등의곱 - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 4/8 으로표현하라. 뷰매핑과정에서투영방향이반대로바뀌게되는것을유념할것. c M ortho 는다음과같이하나의행렬로나타낼수있는데, 이때 α, β, 그리고 γ 값이무엇인지기술하라. M ortho = 2 r l 0 0 r+l r l 0 α 0 t+b t b 0 0 β γ 0 0 0 1 7. 다음은색깔혼합에관한문제이다. c S α S 와 c D α D 를각각 S 와 D 이미지의대응되는화소의미리곱한색깔 pre-multiplied color 이라할때, 두색깔의합성을통하여생성한결과색깔 c O α O 는다음과같이표현할수있다. co α O = F S cs α S + F D cd α D a 만약값이 0.3, 0.3, 0.3, 0.3 인미리곱한색깔로어떤화소를칠한다고할때, 이는그화소를어떻게칠한다는것인지정확히기술하라. b 그림 4 에도시하는합성연산의경우 F S 와 F D 의값은각각얼마인가? Figure 4: 합성예 1 c 만약 S over D 연산을적용한다면, 합성후 α O 는어떤값을가질지그식을 S 와 D 의관련값을사용하여정확히기술하라. d 그림 5 와같은상황을생각해보자. 지금관찰자가세개의물체 M 0, M 1, M 2 를바라보고있는데, M 0 는실제색깔이 C 0 인유리로서뒤에서들어오는빛을 1 α 0 의비율로통과시킨다. 한편 M 1 은색깔이 C 1 이고빛을 1 α 1 의비율만큼만통과시키고, 제일오른쪽에있는 M 2 는완전히불투명한벽으로서 C 2 의색깔을가진다. 이때 M 0 와 M 1 을앞에서뒤로가면서 frontto-back order 합성한다고할때의불투명도 α 01 값이무엇일지정확히기술하라. α 0 C 0 α 1 C 1 Figure 5: 합성예 2 α 2 =1.0 2 C e 바로위문제에서와같이 M 0 와 M 1 을앞에서뒤로가면서합성한다고할때의결과색깔 C 01 값이무엇일지, 위문제의인자를사용하여정확히기술하라. 여기서 C 0, C 1, 그리고 C 01 은미리곱한색깔이아닌원래의 RGB 색깔을의미함. f 위문제에서모든합성이끝난후결과적으로눈에보이는색깔 C 012 는무엇일지위문제의인자를사용하여정확히기술하라. g 아래의프로그램에서함수 test0 을수행시킬경우그림 6a 와같이서로다른색깔로칠해지는여러영역을볼수있는데, 이때 1 번영역과 2 번영역의 RGB 색깔을정확히기술하라. 주의 : RGB 각채널값은 0 과 1 사이의값을가짐 void rectglfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat R, GLfloat G, GLfloat B, GLfloat A { glcolor4fr, G, B, A; glbegingl QUADS; glvertex2fl, b; glvertex2fr, b; glvertex2fr, t; glvertex2fl, t; glend; void test0void { glclearcolor0.0, 0.0, 0.0, 0.0; glcleargl COLOR BUFFER BIT; glenablegl BLEND; glblendfuncgl ONE, GL ZERO; rect-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0; glblendfuncgl SRC ALPHA, GL DST ALPHA; rect-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0; rect0.0, 4.8, -4.8, 2.0, 0.0, 0.0, 1.0, 1.0; gldisablegl BLEND; void test1void { - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 5/8 1 2 3-3.5-2 4 0 4.8 x 8. 다음은계층적모델링을통하여자동차를그려주는 OpenGL 프로그램으로서, 사용자가마우스를사용하여자동차를경로를따라대화식으로 interactively 움직일때, 네바퀴가적절한속도로진행방향으로회전하며, 특히두앞바퀴는자동차의진행방향에따라적절히좌우로도회전을하도록코딩이되어있다 그림 7 참조. 이프로그램과그림 8 을보면서답하라. a test0 수행결과 1 3 1 2 2-3.5-2 4 3 x b test1 수행결과 Figure 6: 색깔의혼합 glclearcolor0.0, 0.0, 0.0, 0.0; glcleargl COLOR BUFFER BIT; glenablegl BLEND; glblendfuncgl ONE, GL ZERO; rect-2.0, 4.0, -2.0, 4.0, 0.0, 1.0, 0.0, 1.0; glblendfunca, B; rect-3.5, 3.0, -3.5, 3.0, 1.0, 0.0, 0.0, 1.0; gldisablegl BLEND; h 다음함수 test1 을수행시켰을때그림 6b 와같은결과를얻으려면, A 와 B 에어떤인자값이설정되어야할까? 여기서 1, 2, 3 번영역의색깔은각각 0, 0, 0, 1, 0, 0, 0, 1, 0 임 다음값들중적절한인자를선택하라. GL ZERO, GL ONE, GL SRC ALPHA, GL DST ALPHA, GL ONE MINUS SRC ALPHA, GL ONE MINUS DST ALPHA Figure 7: 자동차그리기 void draw wheel and nutvoid { int i; draw wheel; // draw wheel object for i = 0; i < 5; i++ { glpushmatrix; glrotatef72.0*i, 0.0, 0.0, 1.0; gltranslatef1.2, 0, 1.0; draw nut; // draw nut object glpopmatrix; void draw car correctvoid { float angle 1, angle 2; angle 1 = wheel rot angle in 1; angle 2 = wheel rot angle in 2; draw body; // draw body object glpushmatrix; gltranslatef-3.9, -3.5, 4.5; glrotatefangle 1, 0.0, 1.0, 0.0; glrotatefangle 2, 0.0, 0.0, 1.0; draw wheel and nut; // wheel 0 glpopmatrix; glpushmatrix; gltranslatef-3.9, -3.5, -4.5; glrotatefangle 1, 0.0, 1.0, 0.0; glrotatefangle 2, 0.0, 0.0, 1.0; - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 6/8 glscalef1.0, 1.0, -1.0; draw wheel and nut; // wheel 1 glpopmatrix; glpushmatrix; gltranslatef3.9, -3.5, 4.5; // Need a transform draw wheel and nut; // wheel 2 glpopmatrix; glpushmatrix; gltranslatef3.9, -3.5, -4.5; // Need a transform glscalef1.0, 1.0, -1.0; draw wheel and nut; // wheel 3 glpopmatrix; void draw worldvoid { GLfloat m[16];. set up rot matm, cur i; glmatrixmodegl MODELVIEW; glloadidentity; glulookat-15.0, 20.0, 40.0, path[cur i][0]+3, 4.89, path[cur i][2]+3, 0.0, 1.0, 0.0; gltranslatefpath[cur i][0], 4.89, path[cur i][2]; glmultmatrixfm; draw car correct; a 이프로그램에서자동차를세상좌표계로배치해주는모델링변환이강체변환인지아닌지 예 / 아니오 로답하고그이유를간략히설명하라. b 문제삭제 c 눈좌표계를기준으로할때카메라가세상을바라보는방향을벡터로표현하라. d 문맥상이코드에서그림 8 의 M b 행렬의내용을결정하는기하변환관련문장을모두정확히기술하라. e 문맥상이코드에서그림 8 의 M 4 n 행렬의내용을결정하는기하변환관련문장을모두정확히기술하라. f 이프로그램에서는 // wheel 0 과 // wheel 1 문장에서각각앞바퀴를그려주고있다. 문맥상이문장들의바로앞 glrotatefangle 1, 0.0, 1.0, 0.0; 문장은어떤기하변환을목적으로하는지정확히기술하라 그림 8 을잘보고답할것. g 앞문제에이어 문맥상이두문장의바로앞 glrotatefangle 2, 0.0, 0.0, 1.0; 문장은어떤기하변환을목적으로하는지정확히기술하라. h 위의두문제를생각할때, 문맥상 // wheel 2 과 // wheel 3 문장앞의 // Need a transform 부분에공통적으로들어갈내용을기술하라. 9. 다음은 OpenGL 시스템의 fixed-function 파이프라인에관한단답식문제이다. 그림 9 를보면서, OC Object Coordinate, CC, EC, MC, NDC, WC, WdC Window Coordinate 등의좌표계이름을참고하여적절히답하라. a 원근투영을사용하여렌더링을할경우, 원근감이생성되는시점과가장관련이많은 box 의기호를기술하라. b OpenGL 에서는꼭지점이나열된순서정보를통하여불필요한삼각형을제거할수있는데, 이와가장관련이많은 box 의기호를기술하라. c G box 와 H box 사이의지점에해당하는 OpenGL 좌표계의이름은? d 정상적인렌더링상황에서좌표점을동차좌표 x, y, z, w 로표현할때순간적으로 w 가 1 이아닌값이나타날수있는데, 이러한좌표값을기반으로수행되는어떤제거계산과가장관련이높은 box 의기호를기술하라. e 정상적인기하변환을할경우전체파이프라인과정에서항상강체변환이사용되는부분은어느좌표계에서어느좌표계로의변환에해당하는가? f OpenGL 렌더링파이프라인에서 정규화된필름 에해당하는좌표계는이그림에서어느 box 와어느 box 사이일까? g 촬영한사진을현상한후, 인화지에확대하는과정과가장밀접한관련이있는 box 의기호를기술하라. h 정상적인기하변환을할경우주어진물체의꼭지점에대해실제로모델링변환이적용되는 box 의기호를기술하라. - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 7/8 y x z Figure 8: 자동차의계층적표현 - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 8/8 A B C D E F F G G E E F G H I J K Figure 9: OpenGL fixed-function 렌더링파이프라인 - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 1/7 [CSE4170: 기초컴퓨터그래픽스 ] 중간고사 담당교수 : 임인성 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 1. 다음물음에답하라. 2. 다음행렬 M 2 를보고답하라. 1 0 0 10 0 2 M 2 = 2 2 2 0 0 2 2 2 2 0 0 0 0 1 a 동차좌표점 2.0, 0.0, 8.0, 0.5 에해당하는유클리드공간에서의점의좌표는? b RGB 색깔모델로표현된색깔 0.7, 0.6, 0.1 을 CMY 색깔모델을사용하여표현했을때의값은? c 3차원기하변환을나타내는 4행 4열행렬이아핀변환인지아닌지를어떻게구별할수있을까? d 투영참조점이무한대점 point at infinity 에위치한투영변환에관련된 OpenGL 함수의이름은? e gluperspectivefovy, asp, n, f 함수에대한변환행렬 M pers 는다음과같다. 이행렬을이용하여원근투영시 EC의점 x e,y e,z e 가 NDC의점 x nd,y nd,z nd 로변환되는과정에서원근감이생성되는수학적인과정을설명하라. cot fovy 2 asp 0 0 0 0 cot fovy 2 0 0 0 0 f+n f n 2nf f n 0 0 1 0 a 3차원공간에서동일한직선상에존재하는세점 p 0, p 1, 그리고 p 2 에대하여 p 0 p 2 : p 0 p 1 = 3 : 1이라하자. p 0, p 1, 그리고 p 2 를각각위의세점을 M 2를사용하여변환한점이라할경우비율 p 0 p 2 : p 0 p 1 은얼마가될까? b M 2 는강체변환에해당하는행렬일까? 예 / 아니오 로답하고그이유를수학적으로밝혀라. c M 2 를두개의기본변환행렬의곱으로표현하라. d M 2 의역행렬 M2 1 을하나의 4행 4열행렬로표현하라. 어떤식으로계산하였는지밝힐것. 3. 그림 1에서와같이 2차원공간의점 p를직선 L에대하여반사시켜 p 으로변환시켜주는 2차원기하변환을다음 OpenGL 함수들을적절히사용하여 C언어문법에맞게정확히기술하라. 함수호출순서는 OpenGL 프로그래밍관례에따르고, 이동변환이필요하다면 z값은 0으로, 크기변환이필요하다면 z값은 1로설정할것. - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 2/7 y 매핑이된다. p' L a 이때절단좌표계 CC 상에서의절단 clipping 과정후 NDC로투영된꼭지점의 x nd 와 y nd 의좌표값은각각어떤범 p 위의값을가질수있을까? 1 45 x 0 3 y e 2 그림 1: 직선에대한반사 void gltranslatefglfloat x, GLfloat y, GLfloat z; void glscalefglfloat x, GLfloat y, GLfloat z; void glrotatefglfloat angle, GLfloat x, GLfloat y, GLfloat z; 4. 그림 2에서와같이왼편의윈도우의내용을오른쪽윈도우로매핑해주는 2차원변환에대한 3행 3열행렬 M 4 를기본변환행렬 T x, y 이동변환, Sx, y 크기변환, Rangle 회전변환 등의합성을통하여표현하고, 전체곱행렬을구하라. 그림 2: 윈도우매핑 ze l, b, 0 x e r, t, 0 그림 3: glorthol, r, b, t, n, f 함수 b 이함수가호출될때생성되는투영변환행렬 M ortho 를기본변환행렬 T x, y, z 이동변환, Sx, y, z 크기변환, Rangle, x, y, z 회전변환 등의곱으로표현하라. 뷰매핑과정에서투영방향이반대로바뀌게되는것을상기할것. c M ortho 는다음과같이하나의행렬로나타낼수있는데, 이때 α, β, 그리고 γ 값이무엇인지기술하라. 2 r l 0 0 r+l r l 0 α 0 M ortho = t+b t b 0 0 β γ 0 0 0 1 6. 다음의 2차원기하변환에관한프로그램을보고답하라. -n 1 -f 5. OpenGL에서는그림 3에도시한바와같이눈좌표계 EC 상에서 glortho* 함수를사용하여직교투영을위한뷰잉볼륨을설정하면, 이안의내용이정규디바이스좌표계 NDC 의정규화된정육면체영역으로뷰 int iii = 0; void displayvoid { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glpushmatrix; glrotatefiii*90.0, 0.0, 0.0, 1.0; - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 3/7 그림 4: OpenGL 을사용한 2 차원기하변환 gltranslatef-250.0, -250.0, 0.0; glbegingl TRIANGLES; glvertex2f500.0, 0.0; glvertex2f500.0, 500.0; glvertex2f0.0, 500.0; glend; glpopmatrix; glflush; void sogangint button, int state, int x, int y { if button == GLUT LEFT BUTTON && state == GLUT DOWN iii = iii+1%4; glutpostredisplay; void universityint width, int height { glviewport0, 0, width, height; glmatrixmodegl PROJECTION; glloadidentity; glortho0.0, double width, 0.0, double height, -1.0, 1.0; glutpostredisplay; void OpenGLInitandRegisterCallbackvoid { glclearcolor1.0, 1.0, 1.0, 1.0; glpolygonmodegl FRONT AND BACK, GL FILL; glcolor3f1.0, 0.0, 0.0; glutdisplayfuncdisplay; glutreshapefuncuniversity; glutmousefuncsogang; void main int argc, char **argv { glutinit&argc, argv; glutinitdisplaymodeglut RGBA; glutinitwindowsize500, 500; glutcreatewindow"midterm Problem"; OpenGLInitandRegisterCallback; glutmainloop; a 이프로그램은사용자가어떤행동 action 을취할때마다, 네번을주기로화면의내용이반복된다. 과연어떤행동인지정확히기술하라. b 사용자가위문제의행동을취할때화면의그림이어떤식으로순환하는지, 그림 4와같은방식으로그려라. 도형의모양과위치를가급적정확히표시하고어떤부분이적색영역인지분명히밝힐것. c 만약그림 4에도시한방식으로화면이바뀌도록하려면이프로그램을어떻게수정해야하는가? 어느함수의어떤문장과어떤문장사이에어떤문장 들 을삽입함 과같이표시하고, 삽입할문장 들 을 OpenGL 함수들을적절히사용하여 C언어문법에맞게정확히기술하라. - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 4/7 d 원래의프로그램상태에서 university 함수의 glortho 함수문장을아래와같이수정할경우화면의내용이어떻게반복될지, 그림 4와같은방식으로그려라. glortho0.0, width/2.0, 0.0, height/2.0, -1.0, 1.0; e 원래의프로그램상태에서 university 함수의 glortho 함수문장직전에아래와같은문장을삽입할경우화면의내용이어떻게반복될지, 그림 4와같은방식으로그려라. glscalef0.5, 0.5, 1.0; 힌트 : 앞문제의직교투영변환을잘생각해보고, 이크기변환이직교투영에어떤영향을미치는지를생각해볼것 7. 그림 5에서주어진점 p =xyz1 t 을 p = x y z 1 t 로변환해주는 4행 4열의원근투영변환행렬 M 7 을기술하라. x v[0] = ; // Line A if i == 0 { u[0] = p[0][0] - p[1][0]; u[1] = p[0][1] - p[1][1]; u[2] = p[0][2] - p[1][2]; else { u[0] = p[i-1][0] - p[i][0]; u[1] = p[i-1][1] - p[i][1]; u[2] = p[i-1][2] - p[i][2]; normalize vec3u; cross prod vec3u, v, n; m[0] = ; m[15] = 1.0; minv[0] = ; minv[15] = 1.0; void dispalyvoid { GLfloat m[16], minv[16]; glcleargl COLOR BUFFER BIT; set up rot matm, minv, cur i; glmatrixmodegl MODELVIEW; y COP = 0, -1, 0 d p' p glloadidentity; B draw axes; draw path; z PP : y = d 그림 5: 원근투영변환예 8. 다음은주어진경로 p[c i][0], 0.0, p[c i][2] 를따라움직이는자동차에서바라본세상을렌더링해주는코드의일부이다 그림 6 참조. void set up rot matfloat *m, float *minv, int i { GLfloat u[3], v[3], n[3]; glpushmatrix; gltranslatefp[c i][0], 4.89, p[c i][2]; glmultmatrixfm; draw car; glpopmatrix; glutswapbuffers; a 지금 glmultmatrixfm; 에해당하는기하변환후, gltranslatefp[c i][0], 4.89, p[c i][2]; 에해당하는기하변환을통하여자동차의 body를세상좌표계로보내주고있다. 문맥상행렬 m이나 - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 5/7 y R90, 0, 1, 0 T-3, 0.5, 2.5 x z a 운전석카메라프레임 b 세상에서본모습 c 운전석에서바라본세상 그림 6: 자동차그리기 타내는기하변환은이동변환, 크기변환, 회전변환중어떤변환에해당할까? b Line A 에서는 v 벡터의값 v[0], v[1], v[2] 의값을설정하고있는데, 각원소값은문맥상어떤값으로설정되어야할까? 세상좌표계와 body의모델링좌표계모두위쪽이 y축방향에해당함. c 문맥상 set up rot mat 함수안에서배열 m과 minv의값을설정하고있는데, m[4] 와 minv[4] 에저장되어야하는각값을 C 언어문법에맞게기술하라. OpenGL에서의기하변환행렬원소의저장순서를고려할것. d 다음은 set up rot mat 함수안에서호출하는 cross prod vec3 함수의정의이다. n[1] 변수에설정되는값이무엇인지그식을 C 언어문법에맞게기술하라. void cross prod vec3float *u, float *v, float *n { n[0] = ; n[1] = ; n[2] = ; e 그림 6a 는 body의모델링좌표계상에서운전석에카메라를배치하는과정을보여주고있다. 만약자동차를세상에배치한후, 이카메라에서세상을바라보는장면을렌더링할때의뷰잉변환행렬 M V 를기본변환행렬 T x, y, z 이동변환, Sx, y, z 크기변환, Rangle, x, y, z 회전변환 이나이프로그램의변수 m과 minv가나타내는 M m 과 M minv 등의곱으로표현하라. f 지금운전석에배치한카메라를사용하여렌더링한다고가정할때, display 함수의 B 에들어갈뷰잉변환코드를 OpenGL 함수들을적절히사용하여 C언어문법에맞게정확히기술하라. 9. 다음은 OpenGL 프로그램에서뷰잉변환을설정하고있는예를보여주고있다. glmatrixmodegl MODELVIEW; glloadidentity; - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 6/7 glulookat0.0, 0.0, 10.0, 10.0, 0.0, 10.0, 0.0, 1.0, 0.0; a 이코드를수행할때적용되는뷰잉변환행렬 M V 의내용을하나의 4행 4열행렬로표현하라. b 원래의코드에서 glulookat*; 문장을아래와같은두문장으로대치하려하는데, 같은내용의그림이그려지도록하기위해서는각문장의인자가무엇이되어야하는지정확히기술하라. glrotatef*, *, *, *; gltranslatef*, *, *; 10. 다음 OpenGL 코드를보고 draw object 함수가그려주는네개의물체 OBJ1, OBJ2, OBJ3, 그리고 OBJ4 간에존재하는계층성을이진트리로표현하라. glpushmatrix; glrotatefangle, 0.0, 1.0, 0.0; gltranslatef0.0, 0.0, 5.0; glscalef6.5, 6.5, 6.5; draw objectobj1; glpushmatrix; glrotatef10.0*angle, 1.0, 0.0, 0.0; gltranslatef-0.1, 0.0, 0.3; glscalef0.025, 0.025, 0.025; draw objectobj2; glrotatef40.0*angle, 1.0, 0.0, 0.0; gltranslatef0.0, 4.0, 0.0; glscalef0.4, 0.4, 0.4; draw objectobj3; glpopmatrix; gltranslatef0.15, 0.3, 0.0; glscalef0.3, 0.3, 0.3; draw objectobj4; glpopmatrix; 11. 다음은 OpenGL 시스템의 fixed-function 파이프라인에관한단답식문제이다. 그림 7을보고, OC, CC, EC, MC, NDC, WC, WdC 등의좌표계이름을참고하여적절히답하라. a 원근투영을사용하여렌더링을할경우, 원근감이생성되는시점과가장관련이많은 box의기호를기술하라. b OpenGL에서는꼭지점이나열된순서정보를통하여불필요한삼각형을제거할수있는데, 이와가장관련이많은 box의기호를기술하라. c G box와 H box 사이의지점에해당하는 OpenGL 좌표계의이름은? d 정상적인렌더링상황에서좌표점을동차좌표 x, y, z, w 로표현할때순간적으로 w가 1이아닌값이나타날수있는데, 이러한좌표값을기반으로수행되는어떤제거계산과가장관련이높은 box의기호를기술하라. e 정상적인기하변환을할경우전체파이프라인과정에서항상강체변환이사용되는부분은어느좌표계에서어느좌표계로의변환에해당하는가? f OpenGL 렌더링파이프라인에서 정규화된필름 에해당하는좌표계는이그림에서어느 box와어느 box 사이일까? g 촬영한사진을현상한후, 인화지에확대하는과정과가장밀접한관련이있는 box의기호를기술하라. h EE box에서수행되는기하변환은항상아핀변환이라고할수있는가? 예또는아니오로답하고그이유를기술하라. i 정상적인기하변환을할경우주어진물체의꼭지점에대해실제로모델링변환이적용되는 box의기호를기술하라. - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 7/7 A B C D E F F G G E E F G H I J K 그림 7: OpenGL fixed-function 렌더링파이프라인 - 2010 년 4 월 28 일 수 오후 7:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 1/8 [CSE4170: 기초컴퓨터그래픽스 ] 중간고사문제 담당교수 : 임인성 b 그림 2의 B 로표시된지점에해당하는 OpenGL 좌표계의이름은? c 그림 2의 C 로표시된지점에해당하는 OpenGL 좌표계의이름은? 그림 1: 2차원윈도우매핑변환 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 1. 그림 1에서와같이왼쪽의윈도우의내용을오른쪽윈도우안으로매핑을해주는 2차원아핀변환에대한 3행 3열행렬 M을기본아핀변환의합성을통하여구하라 M을기본변환행렬의곱으로표현한후, 최종결과행렬을반드시기술할것. 2. 다음은 OpenGL에서사용하는기하파이프라인에대한단답식문제이다. CC, EC, MC, NDC, WC, WdC 등의좌표계이름과그림 2에표시된기호를사용하거나, 또는 어떤어떤 box의왼쪽 과같은방식으로적절히그리고정확히답하라. a 그림 2의 A 로표시된지점에해당하는 OpenGL 좌표계의이름은? d 기하변환과정중다각형의꼭지점이나열된순서정보를통하여안보이는뒷면에해당하는다각형을제거할수있는데, OpenGL에서는정확히어떤지점에서이계산이수행되는가? e 정상적인기하변환을할경우전체파이프라인과정에서항상강체변환이사용되는부분은어느좌표계에서어느좌표계로의변환에해당하는가? f OpenGL 렌더링파이프라인에서 정규화된필름 에해당하는좌표계가존재하는위치를그림 2에서찾는다면정확히어디인가? g 정상적으로렌더링할경우, 카메라를배치하기위하여적절한 OpenGL 함수를호출할경우, 가장직접적으로영향을미치는 box는어떤것일까? h 정상적으로렌더링을할경우, glortho 함수가가장직접적으로영향을미치는위치는? i 촬영한사진을현상한후, 인화지에확대하는과정과가장밀접한관련이있는곳은? - 2009 년 4 월 25 일 토 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 2/8 3. 다음에주어진간단한 3D 뷰잉관련 OpenGL 코드를보고답하라. void displayvoid { glclearcolor0, 0, 0, 1; glcleargl COLOR BUFFER BIT; glcolor3f1.0, 1.0, 1.0; glpolygonmodegl FRONT AND BACK, GL FILL; // LINE A glbegingl TRIANGLES; glvertex2f-2.0, -2.0; glvertex2f0.0, -2.0; glvertex2f0.0, 0.0; glvertex2f-2.0, 0.0; glend; glflush; void reshapeint W, int H { glviewport0, 0, W, H; void RegisterCallbackvoid{ glutdisplayfuncdisplay; glutreshapefuncreshape; void main int argc, char **argv { glutinit&argc, argv; glutinitdisplaymodeglut RGBA; glutinitwindowsize500, 500; glutcreatewindow"sogang CSE"; RegisterCallback; glutmainloop; a 위코드를수행할경우 500 500 크기의윈도우에어떤그림이그려질지, 가급적정확한척도 화면에눈금을표시한다거나하는등의 를사용하여윈도우의내용을도시하라. b 만약이코드의 LINE A 부분에아래의두문장을삽입한후, 프로그램을수행시키면윈도우에어떤그림이그려질까? 위문제와마찬가지로가급적정확한척도를사용하여그내용을도시하라. glmatrixmodegl PROJECTION; glortho-2, 2, -2, 2, -1, 1; c 바로위문제에서와같이코드의내용을수행할경우, 어떤심각한문제가발생하는데그것이무엇인지기술하라. d 위두문장이삽입된상태에서그문제를해결하려면코드를어떻게수정해야할까? e 이번에는원래의코드의 LINE A 부분에아래의네문장을삽입한후, 프로그램을수행시키면윈도우에어떤그림이그려질까? 위문제와마찬가지로가급적정확한척도를사용하여그내용을도시하라. glmatrixmodegl MODELVIEW; glloadidentity; gltranslatef1, 1, 0; glscalef0.5, 0.5, 0.5; 4. 다음은 OpenGL의뷰잉변환에관한문제이다. 아래에주어진어떤 display callback 함수의내용을보고답하라. 여기서 glutwireteapot2.0; 문장은원점을중심으로적절한크기의주전자를그려주는역할을한다. void displayvoid { glclearcolor1.0, 1.0, 1.0, 1.0; glcleargl COLOR BUFFER BIT; glcolor3f1.0, 0.0, 0.0; glpolygonmodegl FRONT AND BACK, GL FILL; glmatrixmodegl PROJECTION; glloadidentity; gluperspective34.0, 1.0, 0.5, 1000.0; - 2009 년 4 월 25 일 토 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 3/8 glmatrixmodegl MODELVIEW; glloadidentity; glulookat0.0, 0.0, 10.0, 10.0, 0.0, 10.0, 0.0, 1.0, 0.0; gltranslatef10.0, 0.0, 10.0; glutwireteapot2.0; glflush; e 원래의코드를수행시키면그림 3과같은그림이그려진다. 이코드의 glulookat*; 문장의마지막세인자 0.0, 1.0, 0.0을 0.0, 0.0, 1.0로대치하면어떻게그림이그려질까? a 위코드를수행할때적용되는뷰잉변환행렬 M V 의내용을기술하라. b 원래의코드에서 glulookat*; 문장을아래와같은두문장으로대치하려하는데, 같은내용의그림이그려지도록하기위해서는각문장의인자가무엇이되어야하는지정확히기술하라. glrotatef*, *, *; gltranslatef*, *, *; c 뷰잉변환은세상좌표계에서카메라의프레임을위치시키는것에대응된다. 만약바로위의문제에서와같은상태에서카메라프레임을하나의물체라가정한후, 세상좌표계에서이물체를 x w 축방향으로 3.0만큼이동을시켰다면, 이때의뷰잉변환은 gltranslatef3.0, 0.0, 0.0; 또는 gltranslatef-3.0, 0.0, 0.0; 문장중하나를바로위문제의두문장의적절한위치에삽입하면된다. 과연어떻게하면되는가? 이문제는위문제의정답을기술한사람만풀것. d 원래의코드에서 glulookat*; 문장을아래와같은두문장으로대치하려하는데, 같은내용의그림이그려지도록하기위해서는각문장의인자가무엇이되어야할지정확히기술하라. gltranslatef*, *, *; glrotatef*, *, *; 그림 3: 주전자도시 5. 그림 4에는모델링좌표계 MC 에설계되어있는자동차모델을세상좌표계 WC 로배치해주는과정이도시되어있다 이그림에서 z m 과 z w 축은각각오른손좌표계방향으로되어있음. 그림 4: 모델링변환과뷰잉변환 a 자동차의위치와방향에관련된정보가세상좌표계에서한점 e = e x,e y,e z 와길이가 1이고서로수직인세벡터 u = u x,u y,u z, v = 0, 0, 1, n = n x,n y,n z 로주어져있다. 이때적용되는모델링변환에해당하는 4행 4열행렬 M M 을이동변환, 크기변환, 회전변환등의기본변환행렬의곱으로적절히표현 xm u n ym - 2009 년 4 월 25 일 토 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 4/8 하라 예를들어, M M = T 1 R 1 T 2 S 1 와같은방식으로표현하고, 각기본변환행렬의내용을정확히기술하되, 전체곱행렬은계산할필요가없음. b C = e, u, v, n 정보를사용하여카메라를배치하려할때적용되는뷰잉변환 M V 를위의문제에서사용한기본변환의행렬또는그의역행렬을가급적많이사용하여표현하라. 6. 그림 5는다음문제와관련한투영변환에대한그림이다. a OpenGL에서 gluperspective60.0, 1.0, 5.0, 10.0; 과같은문장을수행할경우계산되는투영변환행렬 M P 는 OpenGL에서규정한방식대로눈좌표계 EC 의점 x e,y e,z e 를정규디바이스좌표계 NDC 점 x nd,y nd,z nd 로변환을해준다. z nd 의경우 z nd = α + β z e 와같은형태의변환을사용하여유도할수있는데, 이때 α와 β 값이무엇인지상세히유도하라 위함수의인자값을사용하여문제를풀것. b y nd 를 x e, y e, z e 로표현하라 tan 45 = 1, tan 60 = 3= 1 tan 30.. c M P 행렬의두번째행과네번째행의내용을정확히기술하라 7. 시험지뒤에첨부한프로그램은적절한모델링변환을통하여자동차를그려주는 OpenGL 프로그램이다. 이프로그램을보면서답하라. a 이프로그램은그림 6에주어진자동차에대한트리구조를어떤한방식으로탐색을하고있는가? 자료구조시간에배운용어를사용할것. b 이프로그램에서원근나눗셈 perspective division 과가장관련이있는문장의번호는? c 이프로그램에서는사용자가어떠한방식으로자동차를앞으로움직이게할수있을까? 정확하게기술할것. d 세상좌표계 WC 를기준으로할때카메라가세상을바라보는방향을벡터로표현하라. e 눈좌표계 EC 를기준으로할때카메라가세상을바라보는방향을벡터로표현하라. f 59번의이동변환관련문장이수행되기직전의모델뷰행렬스택의내용을정확하게그려라. M V M P, M VP 와그림 6의행렬기호등을적절히사용하라. 현재 draw wheel and nutangle 함수는 100번문장에서호출한상태임. g 52번문장의 draw wheel and nutangle 함수에서이상한부분을지적하고수정하라. 이유를설명할것. h 83번문장의 void cross prod vec3float *u, float *v, float *n 함수는 3차원벡터에대한외적, 즉 n = u v을계산하기위한함수이다. 내용을메꾸어라. i 이프로그램에서사용하는인자들을사용하여정규디바이스좌표계 NDC 의좌표 x nd,y nd 를윈도우좌표계 WdC 의좌표 x wd,y wd 로어떻게변환시켜주는지뷰폿변환 x와 y 좌표에대해서만 을유도하라. j 이프로그램에서뷰매핑과가장관련이많은문장의번호를기술하라. k 이프로그램에서자동차를세상좌표계로배치해주는모델링변환이강체변환인지아닌지답하고그이유를간략히설명하라. - 2009 년 4 월 25 일 토 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 5/8 그림 2: OpenGL 파이프라인 z e EC y e y e z e, fovy/2 c y e a y' y * * z e -n -f d b M P y nd y nd, z nd c 1 a -1 1 NDC d -1 b z nd 그림 5: 투영변환 - 2009 년 4 월 25 일 토 오후 1:00 -
서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 6/8 WC M b 0 1 2 3 M w M w M w M w 0 1 2 3 M M n0 M 1 n M 4 n0 M 1 n M 4 n n M n0 M 1 n M 4 n M n0 M 1 n M 4 n 0 1 4 0 1 4 0 1 4 0 1 4 그림 6: 자동차의계층적표현 - 2009 년 4 월 25 일 토 오후 1:00 -
filename mvcar.cpp page 1 1 #include <stdio.h> 2 #include <math.h> 3 #include <GL/glut.h> 4 8 5 #define MAX_POLY 200 6 #define MAX_VERT 20 7 #define MAX_PATH 1000 9 #define DRAW_CAR_DUMMY 2001 10 #define DRAW_CAR_CORRECT 2002 11 12 typedef struct { 13 int nvertex; 14 float poly[max_vert][3]; 15 mypolygon; 16 17 mypolygon body[max_poly], wheel[max_poly], nut[max_poly]; 18 int npolyb, npolyw, npolyn; 19 20 float path[max_path][3]; 21 int npath, path_exist, drawing_state = DRAW_CAR_CORRECT; 22 23 double dist; 24 25 int prev_i, cur_i = 0; 26 int rightbuttonpressed = 0; 27 28 void read_objectchar *file, mypolygon *object, int *npoly; 29 void read_pathchar *file; 30 void read_objectsvoid; 31 void draw_axesvoid; 32 void draw_pathvoid; 33 void draw_groundvoid; 34 35 void draw_bodyvoid { 36 // Draw the body. 37... 38 39 40 void draw_wheelfloat angle { 41 // Draw the wheel. 42... 43 44 45 void draw_nutvoid { 46 // Draw the nut. 47... 48 49 50 #define rad 1.7 51 #define ww 1.0 52 void draw_wheel_and_nutfloat angle { 53 int i; 54 55 draw_wheelangle; // draw wheel object 56 for i = 0; i < 5; i++ { 57 // nut i 58 glpushmatrix; 59 gltranslatefrad-0.5, 0, ww; // rad = 1.7, ww = 1.0 60 glrotatef72.0*i, 0.0, 0.0, 1.0; 61 draw_nut; // draw nut object 62 glpopmatrix; 63 64 65 66 #define TO_DEG 57.29579 67 void normalize_vec3float *v { 68... 69 70 71 float dot_prod_vec3float *u, float *v { 72... 73 74 75 float compute_length_mul_two_vec3float *u, float *v { 76... 77 78 79 float angle_between_two_vec3float *u, float *v { 80... 81 82 83 void cross_prod_vec3float *u, float *v, float *n { 84 //??? 85 86 87 88 float wheel_rot_angle_in_yvoid { 89... 90 91 92 float wheel_rot_angle_in_zvoid { 93... 94 95 96 void draw_car_dummyvoid { 97 draw_body; // draw body object 98 glpushmatrix; 99 gltranslatef-3.9, -3.5, 4.5; 100 draw_wheel_and_nut0.0; // wheel 0 101 glpopmatrix; 102 103 glpushmatrix; 104 gltranslatef3.9, -3.5, 4.5; 105 draw_wheel_and_nut0.0; // wheel 1 106 glpopmatrix; 107 108 glpushmatrix; 109 gltranslatef-3.9, -3.5, -4.5; 110 glscalef1.0, 1.0, -1.0; 111 draw_wheel_and_nut0.0; // wheel 2 112 glpopmatrix; 113 114 glpushmatrix; 115 gltranslatef3.9, -3.5, -4.5; 116 glscalef1.0, 1.0, -1.0; 117 draw_wheel_and_nut0.0; // wheel 3 118 glpopmatrix; 119 120 121 void set_up_rot_matfloat *m, int i { 122... 123 124 125 void draw_fenceglfloat r, GLfloat g, GLfloat b { 126... HPSCAT 1.3 printed at 4/20/103, 23:01
filename mvcar.cpp page 2 127 128 129 void draw_fencesvoid { 130... 131 132 133 void draw_world void { 134 GLfloat m[16]; 135 136 glmatrixmodegl_modelview; // Modeling Transformation 137 glloadidentity; 138 glulookat-15.0, 20.0, 40.0, path[cur_i][0], 4.89, path[cur_i][2], 0.0, 1.0, 0.0; 139 140 draw_ground; 141 draw_fences; 142 draw_axes; 143 if path_exist draw_path; 144 145 set_up_rot_matm, cur_i; 146 147 glpushmatrix; 148 gltranslatefpath[cur_i][0], 4.89, path[cur_i][2]; 149 glmultmatrixfm; 150 151 draw_car_dummy; 152 glpopmatrix; 153 154 155 void rendervoid { 156 glcleargl_color_buffer_bit; 157 draw_world; 158 glutswapbuffers; 159 160 161 void keyboard unsigned char key, int x, int y { 162... 163 164 165 int prevx_mouse; 166 void mousepressint button, int state, int x, int y { 167 if button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN { 168 prevx_mouse = x; 169 rightbuttonpressed = 1; 170 171 else if button == GLUT_RIGHT_BUTTON && state == GLUT_UP 172 rightbuttonpressed = 0; 173 174 175 void mousemoveint x, int y { 176 double deltax; 177 178 if rightbuttonpressed { 179 deltax = x - prevx_mouse; 180 prevx_mouse = x; 181 if cur_i + deltax > 0 && cur_i + deltax < npath-1 { 182 prev_i = cur_i; cur_i += deltax; 183 dist = sqrtpath[cur_i][0]-path[prev_i][0]*path[cur_i][0]-path[prev_i][ 0] + 184 path[cur_i][1]-path[prev_i][1]*path[cur_i][1]-path[prev_i][1] + 185 path[cur_i][2]-path[prev_i][2]*path[cur_i][2]-path[prev_i][2] ; 186 if deltax < 0.0 dist *= -1.0; 187 glutpostredisplay; 188 189 190 191 192 void reshapeint width, int height { 193 glviewport0, 0, width, height; 194 195 glmatrixmodegl_projection; 196 glloadidentity; 197 gluperspective30.0, width/double height, 1.0, 150.0; 198 199 200 void init_openglvoid { 201... 202 203 204 void init_windowsvoid { 205 glutinitdisplaymodeglut_rgb GLUT_DOUBLE; 206 glutinitwindowsize1280, 1024; 207 glutcreatewindow"car in Hierarchy 2"; 208 glutdisplayfuncrender; 209 glutkeyboardfunckeyboard; 210 glutmousefuncmousepress; 211 glutmotionfuncmousemove; 212 glutreshapefuncreshape; 213 214 215 void mainint argc, char **argv { 216 read_objects; 217 glutinit&argc, argv; 218 init_windows; 219 init_opengl; 220 glutmainloop ; 221 222 HPSCAT 1.3 printed at 4/20/103, 23:01
CSE4170 כ 1/6 [CSE4170: ] : כ. כ.. 1.. כ OC, CC, EC, MC, NDC, WC, WdC OpenGL. a 3.0, 6.0, 9.0, 2.0 3 x, y, z? b 3 4 4 M. c R S? d,? e OpenGL glvertex3f? f OpenGL NDC. 2. 1 2 3 3 M 2,, כ. 1: 2 3. 2 OpenGL glorthol,r,b,t,n,f,, [ 1, 1] [ 1, 1] [ 1, 1] M ortho OpenGL כ כ. α, β, γ כ כ כ. 2 r l 0 0 α 2 0 M ortho = t b 0 β 2 0 0 f n γ 0 0 0 1 z e l, b, 0 y e 0 x e r, t, 0 2: glortho 2 -n 1 -f 3-2008 4 23 2:45 -
CSE4170 כ 2/6 4. normal vector n 4 4 M כ. 3. n p ØŒ M p p' 0 p' 0 3: a n =M 1 t n. 3 p = xyz1 t n =n x n y n z 0 t. p p 0 =x 0 y 0 z 0 1 t n t p 0 p =0. p, p 0, n M p = x y z 1 t, p 0 = x 0 y 0 z 0 1t, n =n x n y n z 0 t, p = M p p 0 = M p 0 p p 0. b n., M, M = a 11 a 12 a 13 v 1 a 21 a 22 a 23 v 2 a 31 a 32 a 33 v 3 0 0 0 1 n', v 1, v 2, v 3 כ כ? c - 3 3 a 1, a 2, a 3,. d b, M M 1 t. b כ. 5.. a 4 OpenGL gluperspectivefovy, aspec, n, f x e,y e,z e EC NDC x nd,y nd,z nd. z nd z nd = α + β z e, α β כ כ כ. b x y x nd = cot fovy cot fovy 2 x asp e z e y 2 y nd = e z e, M pers. 6.. 5a,, x, y, z. y 90, x, y, z -3.0, 0.5, 2.5,. 5b m x, y, z x0, y0, z0. 5c OpenGL API. A B C OpenGL API minv m. glmatrixmodegl MODELVIEW; glloadidentity; A glmultmatrixfminv; B 7. 3. 6. - 2008 4 23 2:45 -
CSE4170 כ 3/6 z e EC y e y e z e, fovy/2 c y e a y' y * * z e -n d -f b M P y nd y nd, z nd c 1 a -1 1 NDC d -1 b z nd 4: a 1 u = u x u y u z t, v = v x v y v z t, n = n x n y n z t p =e x e y e z t., x, y, z 4 4 M V R T R T. b a, b, c LEGS, ARM, CAR. d c angle = -45.0 r angle = 0.0, 16 ARM., A C. c r angle? d M V. e glulookat. f e d. B C, e. void draw world { int i; draw axes; glpushmatrix; draw floor; draw LEGS; // r angle = 0.0 glrotatefr angle,0,0,1; fori = 0; i < 16; i++ { glpushmatrix; glrotatefa, 0.0, 0.0, 1.0; draw ARM; glpushmatrix; gltranslatef0.0, 6.0, 0.0; // B glrotatefr angle, 0.0, 0.0, 1.0; glrotatef-22.5*i,0.0, 0.0, 1.0; // C glscalef0.12, 0.12, 0.12; draw CAR; glpopmatrix; glpopmatrix; glpopmatrix; void render3void { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; // c angle = -45.0 glrotatefc angle, 0.0, 1.0, 0.0; gltranslatef-25.0, 1.0, -25.0; draw world; glutswapbuffers; - 2008 4 23 2:45 -
CSE4170 כ 4/6 a MC b c 5: 8. OpenGL. 7, OC, CC, EC, MC, NDC, WC, WdC. a, OpenGL box. b, OpenGL, box. c OpenGL GL CCW box. d G box H box OpenGL? e OpenGL NDC p y nd כ? f OpenGL, box. g, glortho, box. h x, y, z, w w 1 כ box. - 2008 4 23 2:45 -
CSE4170 כ 5/6 a LEGS in MC b ARM in MC c CAR in MC d e 6: - 2008 4 23 2:45 -
CSE4170 כ 6/6 A B C D E F F G G E E F G H I J K 7: OpenGL - 2008 4 23 2:45 -
43-170 1/7 [43-170: ] : כ. כ.. 1. normal vector n 4 4 M כ. 1. n p ØŒ M p p' 0 p' 0 1: a n =M 1 t n. 1 p = xyz1 t n =n x n y n z 0 t. p p 0 =x 0 y 0 z 0 1 t n t p 0 p =0. p, p 0, n M p = x y z 1 t, p 0 = x 0 y 0 z 0 1t, n =n x n y n z 0 t, p = M p p 0 = M p 0 p p 0. b n., M n', M = a 11 a 12 a 13 v 1 a 21 a 22 a 23 v 2 a 31 a 32 a 33 v 3 0 0 0 1, v 1, v 2, v 3 כ כ? c - 3 3 a 1, a 2, a 3,. d b, M M 1 t. b כ. 2.. 2. a OpenGL API gluperspectivefovy, asp, n, f x e,y e,z e EC NDC x nd,y nd,z nd, y nd x e, y e, z e. כ. b z nd z nd = α + β z e. α β כ. 3. OpenGL API 2 2D viewing. 3a p = 50, 50 50, 10 p y. a 4-2007 4 25 3:00 -
43-170 2/7 z e EC y e y e z e, fovy/2 c y e a y' y * * z e -n d -f b M P y nd y nd, z nd c 1 a -1 1 NDC d -1 b z nd 2: a b 3:, A,,, OpenGL API. b p 100 45. 3b, B,, OpenGL API. c, B. glortho-50.0, 50.0, -50.0, 50.0, -1.0, 1.0; d A B. glmatrixmodegl MODELVIEW;,?? e 4 4 M VP 0 1 0, כ. 4. 3. a 10, 0, 0,,, 0, 0, 1, 0, 1, 0, 1, 0, 0.,, OpenGL API. b glulookat *. - 2007 4 25 3:00 -
43-170 3/7 void draw boxvoid { glbegingl QUADS; glvertex2f0.5, 0.5; glvertex2f-0.5, 0.5; glvertex2f-0.5, -0.5; glvertex2f0.5, -0.5; glend; void draw crossvoid { glbegingl LINES; glvertex2f-0.5, 0.0; glvertex2f0.5, 0.0; glvertex2f0.0, -0.5; glvertex2f0.0, 0.5; glend; void displayvoid { int i; glcleargl COLOR BUFFER BIT; glviewport0, 0, 500, 500; glmatrixmodegl PROJECTION; glloadidentity; B glmatrixmodegl MODELVIEW; glloadidentity; for i = 3; i < 8; i++ { glpushmatrix; A draw box; glpopmatrix; glpushmatrix; gltranslatef50.0, 50.0, 0.0; glscalef50.0, 50.0, 1.0; draw cross; glpopmatrix; glflush; 4: OpenGL c 6 glulookat*., כ z[0], z[1], z[2]. d. 5. OpenGL.. a 7,? b OpenGL view mapping, OC, EC, NDC, WdC, CC, MC, WC. c. d, CC כ 1. e WC. f MS WM PAINT כ? g. h. i 59. M V M P, M VP 7. draw wheel and nutangle 100. - 2007 4 25 3:00 -
43-170 4/7 j 52 draw wheel and nutangle. כ. k. z angle z 7? l. כ. כ f, W כ 1 כ? g pixel shader? A D B C E 5: NVIDIA GeForce 6 Series GPU 6. 5 NVIDIA GeForce 6 Series GPU. A, B, C, D, E. a? b? c depth buffer? d? e? - 2007 4 25 3:00 -
43-170 5/7 void glulookat GLdouble ax, GLdouble ay, GLdouble az, GLdouble bx, GLdouble by, GLdouble bz, GLdouble cx, GLdouble cy, GLdouble cz { GLdouble m[16]; GLdouble x[3], y[3], z[3]; GLdouble mag; z[0] = ax - bx; z[1] = ay - by; z[2] = az - bz; mag = sqrt z[0]*z[0] + z[1]*z[1] + z[2]*z[2] ; if mag { z[0] /= mag; z[1] /= mag; z[2] /= mag; y[0] = cx; y[1] = cy; y[2] = cz; x[0] = y[1]*z[2] - y[2]*z[1]; x[1] = -y[0]*z[2] + y[2]*z[0]; x[2] = y[0]*z[1] - y[1]*z[0]; y[0] = z[1]*x[2] - z[2]*x[1]; y[1] = -z[0]*x[2] + z[2]*x[0]; y[2] = z[0]*x[1] - z[1]*x[0]; mag = sqrt x[0]*x[0] + x[1]*x[1] + x[2]*x[2] ; if mag { x[0] /= mag; x[1] /= mag; x[2] /= mag; mag = sqrt y[0]*y[0] + y[1]*y[1] + y[2]*y[2] ; if mag { y[0] /= mag; y[1] /= mag; y[2] /= mag; #define Mrow,col m[row*4+col] M0,0 = x[0]; M0,1 = x[1]; M0,2 = x[2]; M0,3 = 0.0; M1,0 = y[0]; M1,1 = y[1]; M1,2 = y[2]; M1,3 = 0.0; M2,0 = z[0]; M2,1 = z[1]; M2,2 = z[2]; M2,3 = 0.0; M3,0 = 0.0; M3,1 = 0.0; M3,2 = 0.0; M3,3 = 1.0; #undef M glmultmatrixd m ; gltranslated -ax, -ay, -az ; 6: glulookat* WC M b 0 1 2 3 M w M w M w M w 0 1 2 3 M M n0 M 1 n M 4 n0 M 1 n M M 4 n n n0 M 1 n M M 4 n n0 M 1 n M 4 n 0 1 4 0 1 4 0 1 4 0 1 4 7: - 2007 4 25 3:00 -
filename mvcar.cpp page 1 1 #include <stdio.h> 2 #include <math.h> 3 #include <GL/glut.h> 4 8 5 #define MAX_POLY 200 6 #define MAX_VERT 20 7 #define MAX_PATH 1000 9 #define DRAW_CAR_DUMMY 2001 10 #define DRAW_CAR_CORRECT 2002 11 12 typedef struct { 13 int nvertex; 14 float poly[max_vert][3]; 15 mypolygon; 16 17 mypolygon body[max_poly], wheel[max_poly], nut[max_poly]; 18 int npolyb, npolyw, npolyn; 19 20 float path[max_path][3]; 21 int npath, path_exist, drawing_state = DRAW_CAR_CORRECT; 22 23 double dist; 24 25 int prev_i, cur_i = 0; 26 int rightbuttonpressed = 0; 27 28 void read_objectchar *file, mypolygon *object, int *npoly; 29 void read_pathchar *file; 30 void read_objectsvoid; 31 void draw_axesvoid; 32 void draw_pathvoid; 33 void draw_groundvoid; 34 35 void draw_bodyvoid { 36 // Draw the body. 37... 38 39 40 void draw_wheelfloat angle { 41 // Draw the wheel. 42... 43 44 45 void draw_nutvoid { 46 // Draw the nut. 47... 48 49 50 #define rad 1.7 51 #define ww 1.0 52 void draw_wheel_and_nutfloat angle { 53 int i; 54 55 draw_wheelangle; // draw wheel object 56 for i = 0; i < 5; i++ { 57 // nut i 58 glpushmatrix; 59 gltranslatefrad-0.5, 0, ww; // rad = 1.7, ww = 1.0 60 glrotatef72.0*i, 0.0, 0.0, 1.0; 61 draw_nut; // draw nut object 62 glpopmatrix; 63 64 65 66 #define TO_DEG 57.29579 67 void normalize_vec3float *v { 68... 69 70 71 float dot_prod_vec3float *u, float *v { 72... 73 74 75 float compute_length_mul_two_vec3float *u, float *v { 76... 77 78 79 float angle_between_two_vec3float *u, float *v { 80... 81 82 83 void cross_prod_vec3float *u, float *v, float *n { 84 //??? 85 86 87 88 float wheel_rot_angle_in_yvoid { 89... 90 91 92 float wheel_rot_angle_in_zvoid { 93... 94 95 96 void draw_car_dummyvoid { 97 draw_body; // draw body object 98 glpushmatrix; 99 gltranslatef-3.9, -3.5, 4.5; 100 draw_wheel_and_nut0.0; // wheel 0 101 glpopmatrix; 102 103 glpushmatrix; 104 gltranslatef3.9, -3.5, 4.5; 105 draw_wheel_and_nut0.0; // wheel 1 106 glpopmatrix; 107 108 glpushmatrix; 109 gltranslatef-3.9, -3.5, -4.5; 110 glscalef1.0, 1.0, -1.0; 111 draw_wheel_and_nut0.0; // wheel 2 112 glpopmatrix; 113 114 glpushmatrix; 115 gltranslatef3.9, -3.5, -4.5; 116 glscalef1.0, 1.0, -1.0; 117 draw_wheel_and_nut0.0; // wheel 3 118 glpopmatrix; 119 120 121 void set_up_rot_matfloat *m, int i { 122... 123 124 125 void draw_fenceglfloat r, GLfloat g, GLfloat b { 126... HPSCAT 1.3 printed at 4/20/103, 23:01
filename mvcar.cpp page 2 127 128 129 void draw_fencesvoid { 130... 131 132 133 void draw_world void { 134 GLfloat m[16]; 135 136 glmatrixmodegl_modelview; // Modeling Transformation 137 glloadidentity; 138 glulookat-15.0, 20.0, 40.0, path[cur_i][0], 4.89, path[cur_i][2], 0.0, 1.0, 0.0; 139 140 draw_ground; 141 draw_fences; 142 draw_axes; 143 if path_exist draw_path; 144 145 set_up_rot_matm, cur_i; 146 147 glpushmatrix; 148 gltranslatefpath[cur_i][0], 4.89, path[cur_i][2]; 149 glmultmatrixfm; 150 151 draw_car_dummy; 152 glpopmatrix; 153 154 155 void rendervoid { 156 glcleargl_color_buffer_bit; 157 draw_world; 158 glutswapbuffers; 159 160 161 void keyboard unsigned char key, int x, int y { 162... 163 164 165 int prevx_mouse; 166 void mousepressint button, int state, int x, int y { 167 if button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN { 168 prevx_mouse = x; 169 rightbuttonpressed = 1; 170 171 else if button == GLUT_RIGHT_BUTTON && state == GLUT_UP 172 rightbuttonpressed = 0; 173 174 175 void mousemoveint x, int y { 176 double deltax; 177 178 if rightbuttonpressed { 179 deltax = x - prevx_mouse; 180 prevx_mouse = x; 181 if cur_i + deltax > 0 && cur_i + deltax < npath-1 { 182 prev_i = cur_i; cur_i += deltax; 183 dist = sqrtpath[cur_i][0]-path[prev_i][0]*path[cur_i][0]-path[prev_i][ 0] + 184 path[cur_i][1]-path[prev_i][1]*path[cur_i][1]-path[prev_i][1] + 185 path[cur_i][2]-path[prev_i][2]*path[cur_i][2]-path[prev_i][2] ; 186 if deltax < 0.0 dist *= -1.0; 187 glutpostredisplay; 188 189 190 191 192 void reshapeint width, int height { 193 glviewport0, 0, width, height; 194 195 glmatrixmodegl_projection; 196 glloadidentity; 197 gluperspective30.0, width/double height, 1.0, 150.0; 198 199 200 void init_openglvoid { 201... 202 203 204 void init_windowsvoid { 205 glutinitdisplaymodeglut_rgb GLUT_DOUBLE; 206 glutinitwindowsize1280, 1024; 207 glutcreatewindow"car in Hierarchy 2"; 208 glutdisplayfuncrender; 209 glutkeyboardfunckeyboard; 210 glutmousefuncmousepress; 211 glutmotionfuncmousemove; 212 glutreshapefuncreshape; 213 214 215 void mainint argc, char **argv { 216 read_objects; 217 glutinit&argc, argv; 218 init_windows; 219 init_opengl; 220 glutmainloop ; 221 222 HPSCAT 1.3 printed at 4/20/103, 23:01
43-170 1/4 43-170 : : : : כ. כ.. p q α L r q' p' 1. 1 2 3 3 M,. n 0, 0, 0 p' n q q' α q p 1 x 6 y 3: 1 y M 1: 2. 2 MC 2 WC. WC e =e x e y 1 u =u x u y v =v x v y, כ 3 3 M 3 3,. כ y m MC x m M y w 1 WC e xm 2: 2 5 v u x w x ym 3. 3. 3 n = n x n y n z t L p =xyz t α p =x y z t. L, L r, r p p q q. a q q n, α. b p p = A +p n p ncosα+ n psinα, A. c p p. n psinα {sin α Sp 3 3 S p, S. 4.. a e =ex ey ez t 1 u =ux uy uz t, v =vx vy vz t, n =nx ny nz t - 2006 4 19 6:00 -
43-170 2/4 u v, n. M V 4 4, 16 כ. b OpenGL., 1 m1[16] m1[0], m1[1], m2[2],, m1[15]. GLfloat m1[16], m2[16];. glmatrixmodegl MODELVIEW; glloadidentity; glmultmatrixfm1; glmultmatrixfm2; c כ, a0, a1, a2,, a5 כ. GLfloat m1[16], m2[16];. glmatrixmodegl MODELVIEW; glloadidentity; glulookatex, ey, ez, a0, a1, a2, a3, a4, a5; 5. 4 Pixar RenderMan API. כ. a? b? c, OpenGL? d OpenGL glulookat*? 6. OpenGL. CC, EC, MC, NDC, WC, WdC. a 5 A OpenGL? b 5 B OpenGL? c 5 C OpenGL? d OpenGL? e? f OpenGL NDC p z כ? 7.. 6. a A, B, C, D... b 7. c B,? d,. e B C M M i M 1 i M i M 1 i i כ. - 2006 4 19 6:00 -
43-170 3/4 01 void mainvoid { RtFloat fov = 45, intensity1 = 0.08, intensity2 = 0.8;. 02 RtColor opacity1 = {0.3, 0.3, 0.3; 03 char *txtname = "redchecker"; 04 RiBeginRI NULL; 05 RiFormat480, 360, 1; 06 RiPixelSamples2, 2; 07 RiFrameBegin1; 08 RiDisplay"3spheres.tif", "file", "rgba", RI NULL; 09 RiProjection"perspective", "fov", &fov, RI NULL; 10 RiRotate-110.0, 1, 0, 0; 11 RiTranslate0.0, -2.0, 8.0; 12 RiWorldBegin; 13 RiLightSource"ambientlight", "intensity", &intensity1, RI NULL;. 14 RiAttributeBegin; 15 RiTranslate-2.25, 0.0, 2.0; 16 RiColorsphcolor1;. 17 RiSphere1.0, -1.0, 1.0, 360.0, RI NULL; 18 RiAttributeEnd; 19 RiAttributeBegin; 20 RiTranslate0.0, 0.0, 2.0; 21 RiColorsphcolor2; 22 RiShadingRate0.25; 23 RiShadingInterpolation"constant"; 24 RiSurface"screen", "Ka", &Ka2, "Kd", &Kd2; 25 RiSphere1.0, -1.0, 1.0, 360.0, RI NULL; 26 RiAttributeEnd; 27 RiWorldEnd; 28 RiFrameEnd; 29 RiEnd; 30 4: RenderMan - 2006 4 19 6:00 -
43-170 4/4 5: OpenGL 01 glpushmatrix; 02 glrotatefangle, 0.0, 1.0, 0.0; 03 gltranslatef0.0, 0.0, 5.0; 04 glscalef6.5, 6.5, 6.5; 05 draw cow; // draw object A 06 glpushmatrix; 07 glrotatef10.0*angle, 1.0, 0.0, 0.0; 08 gltranslatef-0.1, 0.0, 0.3; 09 glscalef0.025, 0.025, 0.025; 10 draw box; // draw object C 11 glpushmatrix; 12 glrotatef40.0*angle, 1.0, 0.0, 0.0; 13 gltranslatef0.0, 4.0, 0.0; 14 glscalef0.4, 0.4, 0.4; 15 draw box; // draw object D 16 glpopmatrix; 17 glpopmatrix; 18 gltranslatef0.15, 0.3, 0.0; 19 glscalef0.3, 0.3, 0.3; 20 draw cow; // draw object B 21 glpopmatrix; 6: - 2006 4 19 6:00 -
43-170 1/5 43-170 : : : כ. כ.. 1. Win32 event message ID כ. a OpenGL pixel format b glutpostredisplay c 2. M 2 3. 1 0 0 10 0 2 M 2 = 2 2 2 0 0 2 2 2 2 0 0 0 0 1 a 3 p 0, p 1, p 2 p 0 p 2 : p 0 p 1 =3:1. p 0, p 1, p 2 M 2 p 0 p 2 : p 0 p 1? b M 2?. c M 2. d OpenGL CC, EC, MC, NDC, WC, WdC, M 2? 3. 1 p =xyz1 t p = x y z 1 t 4 4 M 3. y z x COP = 0, -1, 0 d PP : y = d 1: 4. 2 Frame 1 Frame 2 u =u x u y u z t, v = v x v y v z t, n = n x n y n z t u = u x u y u z t, v = v x v y v z t, n = n x n y n z t. Frame 1 Frame 2 4 4 M 4 M 4 = R 1 R 2 4 4 R 1 R 2. M 4-3 3 u, v, n, u, v, n. 5. OpenGL. CC, EC, MC, NDC, WC, WdC. a 3 [ 1, 1] [ 1, 1] [ 1, 1]? b? p' p - 2005 4 22 7:00 -
43-170 2/5 Frame 2 u' z n v' y p v M 4 n' p' u Frame 1 2: c? d OpenGL? e? f,? g Fixed-function pipeline OpenGL Gouraud? h OpenGL vertex shader. line a? struct output { float4 position: POSITION; float4 p: TEXCOORD0; float3 n: TEXCOORD1; ; output main float4 position: POSITION, float4 normal: NORMAL, uniform float4x4 ModelViewProj, uniform float4x4 ModelView, uniform float4x4 ModelViewIT { x output OUT; OUT.position= mulmodelviewproj, position; // line a OUT.p = mulmodelview, position; OUT.n = mulmodelviewit, normal.xyz; return OUT; i,? j,? k MS Direct3D? D3DXMATRIX out; D3DXVECTOR3 eye2, 3, 3; D3DXVECTOR3 at2, 3, 3; D3DXVECTOR3 up2, 3, 3; D3DXMatrixLookAtLH&out, &eye, &at, &up; 6. 3 OpenGL glortho*. M 6, α, β, γ כ כ. 2 r l 0 0 0 2 0 M 6 = t b 0 0 2 0 0 f n 0 0 0 0 1 1 0 0 α 0 1 0 β 0 0 1 γ 0 0 0 1 7. OpenGL. typedef struct scene { int nobject; char *fname[256]; Object *objects; int nlight; Light *lights; Scene; - 2005 4 22 7:00 -
43-170 3/5 #undef M y e 0 2 1 -f 3 printf"[field of Veiw in y]: scanf"%f", &cam->fovy;. \n"; ze l, b, 0 x e r, t, 0 3: glorthol, r, b, t, n, f typedef struct cam { float pos[3]; float uaxis[3], vaxis[3], naxis[3]; GLfloat mat[16]; A GLfloat mat inv[16]; int move, upanddown; GLdouble fovy, aspect, near c, far c; Camera; -n void draw axis void { glbegingl LINES; glcolor3f1.0, 0.0, 0.0; glvertex3f-5.0, 0.0, 0.0; glvertex3f5.0, 0.0, 0.0; glcolor3f0.0, 1.0, 0.0; glvertex3f0.0, -5.0, 0.0; glvertex3f0.0, 5.0, 0.0; glcolor3f0.0, 0.0, 1.0; glvertex3f0.0, 0.0, -5.0; glvertex3f0.0, 0.0, 5.0; glend; void reset cameracamera *cam { float prp[3], vrp[3], vup[3]; float x[3], y[3], z[3], mag; printf"[proj. Ref. Pt.]: \n"; scanf"%f %f %f", prp, prp+1, prp+2; printf"[view Ref. Pt.]: \n"; scanf"%f %f %f", vrp, vrp+1, vrp+2; printf"[view-up Vec.]: \n"; scanf"%f %f %f", vup, vup+1, vup+2;. B cam->pos[0] = prp[0]; cam->pos[1] = prp[1]; cam->pos[2] = prp[2]; cam->uaxis[0] = x[0]; cam->uaxis[1] = x[1]; cam->uaxis[2] = x[2]; cam->vaxis[0] = y[0]; cam->vaxis[1] = y[1]; cam->vaxis[2] = y[2]; cam->naxis[0] = z[0]; cam->naxis[1] = z[1]; cam->naxis[2] = z[2]; #define Mrow,col cam->mat[ C ] M0,0 = x[0]; M0,1 = x[1]; M0,2 = x[2]; M0,3 = 0.0; M1,0 = y[0]; M1,1 = y[1]; M1,2 = y[2]; M1,3 = 0.0; M2,0 = z[0]; M2,1 = z[1]; M2,2 = z[2]; M2,3 = 0.0; M3,0 = 0.0; M3,1 = 0.0; M3,2 = 0.0; M3,3 = 1.0; void cam object to ECScene *scene { glpushmatrix; gltranslatef D ; draw object&scene->objects[6]; glpopmatrix; void cam object to therescene *scene, Camera *cam { glpushmatrix; gltranslatefcam->pos[x], cam->pos[y], cam->pos[z]; glmultmatrixfcam->mat inv; cam object to ECscene; glpopmatrix; void draw scenescene *scene, Camera *cam { int i, j; glviewport530, 0, 750, 750; glmatrixmodegl PROJECTION; glloadidentity; gluperspectivecam->fovy, cam->aspect, cam->near c, cam->far c; glmatrixmodegl MODELVIEW; glloadidentity; glmultmatrixfcam->mat; gltranslatef-cam->pos[x], -cam->pos[y], - 2005 4 22 7:00 -
43-170 4/5 draw axis; -cam->pos[z]; for i = 0; i < scene->nobject; i++ { glpushmatrix; glmultmatrixfglfloat * &scene->objects[i].xform; draw object&scene->objects[i]; glpopmatrix; a A mat, mat inv? 1 0 0 0 0 2 mat = 2 2 2 0 0 2 2 2 2 0 0 0 0 1 b reset camera* Camera. B EC. prp = 10, 5, 5, vrp = 13, 5, 9, vup = 0, 1, 0 B, z[0], z[1], z[2] כ כ? c, x[0], x[1], x[2] כ כ? d C C. e draw axis* glvertex3f*. draw scene* draw axis; CC, EC, MC, NDC, WC, WdC OpenGL כ? f draw scene* glviewport530, 0, 750, 750; glmatrixmodegl MODELVIEW;? g 6 scene->object[6] 3, 4, 10 ENG כ. cam object to EC*, D C. h cam object to ECscene; draw scene* כ? i cam object to therescene, cam; draw scene* draw axis;. cam object to there* cam object to ECscene; OpenGL 4 4? j g-h כ. cam object to there*; glpushmatrix; glpopmatrix;?. 8. Direct3D. protected void Render { float angle = Environment.TickCount /500.0F; device.clearclearflags.target, Color.Bisque, 1.0F, 0; device.beginscene; device.transform.world = Matrix.RotationYangle; device.transform.view = Matrix.LookAtLHnew Vector30, 0.5F, -3, new Vector30, 0.5F, - 2005 4 22 7:00 -
43-170 5/5 0, new Vector30, 1, 0; device.transform.projection = Matrix.PerspectiveFovLHfloat Math.PI/4.0F, 1.0F, 1.0F, 5.0F; device.setstreamsource0, vertices, 0; device.drawprimitives PrimitiveType.TriangleList, 0, 1; device.endscene; device.present; a? b OpenGL x, y, z w? c OpenGL. d MC WC? e OpenGL glvertex3f*? f? 3 כ. 10. - 2005 4 22 7:00 -
43-170 1/4 43-170 : : : : כ. כ.. 1.. a Win32 message ID. A This message is sent when the window is first produced, and gives you a chance to do any setup, initialization, or resource allocation. B This message is sent whenever your window s contents need repainting. This can occur for a number of reasons: the window was moved or resized by the user, another application popped up and obscured yours, and so on. C This message is sent to your window when the window is about to be killed. Usually, this is a direct result of the user clicking on the window s close icon or closing from the window s system menu. Either way, b complementary color? RGB כ כ. A pair of colors which can be additively combined to produce white light are called complementary colors, because together they complete the spectrum. c. The vectors v i are if α 1 v 1 + α 2 v 2 + + α m v m = 0 for constants α i only if v 1 = v 2 = = v m = 0. d 3 1, 0, 3, 2. e 4 4? f glscalefx, y, z /,,? כ, +/-=, *=, /=. g R S. כ? h 3? 4 4. i?. j / /? A, B, C. D. k OpenGL? l OpenGL? m OpenGL? - 2004 4 21 4:00 -
43-170 2/4 2.. int angle e = 0, angle r = 0, angle l = 0;. void keyboardunsigned char key, int x, int y { switch key { case e : angle e = angle e + 1%360; glutpostredisplay; break; case r : angle r = angle r + 1%360; glutpostredisplay; break; case l : angle l = angle l + 1%360; glutpostredisplay; break; case m :. void draw boxvoid { glbegingl POLYGON; glvertex2f0.5, 0.5; glvertex2f0.5, -0.5; glvertex2f-0.5, -0.5; glvertex2f-0.5, 0.5; glend; void practice modevoid { glpushmatrix; gltranslatef250.0, 250.0, 0.0; glscalef100.0, 100.0, 1.0; glrotatefangle e, 0.0, 0.0, 1.0; glpushmatrix; /* A */ glscalef1.0, 0.1, 1.0; glcolor3f0.0, 1.0, 0.0; draw box glpopmatrix; glpushmatrix; gltranslatef-0.5, 0.0, 0.0; glrotatefangle l, 0.0, 0.0, 1.0; gltranslatef-0.2, 0.0, 0.0; glscalef0.5, 0.15, 1.0; glcolor3f1.0, 0.0, 0.0; draw box; glpopmatrix; glpushmatrix; /* B */ gltranslatef0.5, 0.0, 0.0; glrotatefangle r, 0.0, 0.0, 1.0; gltranslatef0.2, 0.0, 0.0; glscalef0.5, 0.15, 1.0; glcolor3f0.0, 0.0, 1.0; draw box; glpopmatrix; /* C */ glpopmatrix; practice mode practice. angle e, angle r, angle l 0 keyboard כ. 500 500 2 MS,.. a. b l r 45, e 90. c practice mode A. d B C - 2004 4 21 4:00 -
43-170 3/4. 3.. a 1 u = u x u y u z t, v = v x v y v z t, n = n x n y n z t p = e x e y e z t. x, y, z 4 4 M V. b R T R T.. c. glmatrixmodegl MODELVIEW; glloadidentity; glrotatef90.0, 1.0, 0.0, 0.0; gltranslatef-10.0, 0.0, 0.0; glulookat 9. כ. 4.. 3 1, 1, 1 6, 6, 11 1, 1, 1 1, 1, 1 4 4 M ortho. 1 z. 5. 2 PEXlib 3 API. a PEXlib OpenGL? b OpenGL PEXlib. API. 6. Direct3D. protected void SetupMatrices { float angle = Environment.TickCount /500.0F; device.transform.world = Matrix.RotationYangle; device.transform.view = Matrix.LookAtLHnew Vector30, 0.5F, -3, new Vector30, 0.5F, 0, new Vector30, 1, 0; device.transform.projection = Matrix.PerspectiveFovLHfloat Math.PI/4.0F, 1.0F, 1.0F, 5.0F; protected void Render { device.clearclearflags.target, Color.Bisque, 1.0F, 0; device.beginscene; SetupMatrices; device.setstreamsource0, vertices, 0; device.drawprimitives PrimitiveType.TriangleList, 0, 1; device.endscene; device.present; a? b? c OpenGL. d? e OpenGL glvertex3f*? f? 2 3 כ. 1 2 4 7. - 2004 4 21 4:00 -
43-170 4/4 $! "#" " 1: 2: PEXlib 3-2004 4 21 4:00 -