0503중간고사.dvi

Similar documents
서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/8) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의

0503중간고사.dvi

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 (1/7) [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 (담당교수: 임 인 성) 답은 연습지가 아니라 답안지에 기술할 것. 답 안지 공간이 부족할 경우, 답안지 뒷면에 기술 하고, 해당

Microsoft Word - cg07-midterm.doc

PowerPoint 프레젠테이션

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (2/8) 다음과같이설정되어있는데, cam.pos[0] = 0.0, cam.pos[1] = 0.0, cam.pos[2] = 500.0; 이때의 cam.naxis[] 벡터의세원소값을기술하라. Figure

Open GL

Microsoft PowerPoint - 13prac.pptx

Microsoft PowerPoint - lecture11-ch4

Microsoft PowerPoint - lecture11-ch4.ppt

단국대학교멀티미디어공학그래픽스프로그래밍중간고사 (2011 년봄학기 ) 2011 년 4 월 26 일학과학번이름 중간고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/9) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사 담당교수 : 임인성 답은연습지가아니라답안지에기술할것. 답안지공간이부족할경우, 답안지뒷면에기술하고, 해당답안지칸에그사실을명기할것. 연습지는수거하

Microsoft Word - cg09-final-answer.doc

PowerPoint 프레젠테이션

Microsoft Word - cg09-midterm.doc

Vector Differential: 벡터 미분 Yonghee Lee October 17, 벡터미분의 표기 스칼라미분 벡터미분(Vector diffrential) 또는 행렬미분(Matrix differential)은 벡터와 행렬의 미분식에 대 한 표

Microsoft PowerPoint - lecture4-ch2.ppt

Łø·ŸÕ=¤ ¬ ÇX±xÒ¸ 06 - Èpº– 1

Structure and Interpretation of Computer Programs: Assignment 3 Seung-Hoon Na October 4, George (아래 3개의 문제에 대한 구현이 모두 포함된 george.rkt파일을 제출하시오.

0503기말고사.dvi

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

(Microsoft PowerPoint - CNVZNGWAIYSE.ppt [\310\243\310\257 \270\360\265\345])

(Microsoft PowerPoint - JXQEUPXIEBNZ.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

0503기말고사.dvi

<B4EBC7D0BCF6C7D02DBBEFB0A2C7D4BCF62E687770>

Microsoft Word - cg07-final.doc

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long Max

Microsoft Word - cg08-final-answer.doc

Microsoft Word - cg12-midterm-answer

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스기말고사 (1/10) [CSE4170: 기초컴퓨터그래픽스 ] 기말고사 담당교수 : 임인성 답은연습지가아니라답안지에기술할것. 답안지공간이부족할경우, 답안지뒷면에기술하고, 해당답안지칸에그사실을명기할것. 연습지는수거

Let G = (V, E) be a connected, undirected graph with a real-valued weight function w defined on E. Let A be a set of E, possibly empty, that is includ

KNK_C_05_Pointers_Arrays_structures_summary_v02

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap04-연산자.pptx

Open GL

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

단국대학교멀티미디어공학그래픽스프로그래밍기말고사 (2012 년봄학기 ) 2012 년 6 월 12 일학과학번이름 기말고사 담당교수 : 단국대학교멀티미디어공학전공박경신 l 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤

1 경영학을 위한 수학 Final Exam 2015/12/12(토) 13:00-15:00 풀이과정을 모두 명시하시오. 정리를 사용할 경우 명시하시오. 1. (각 6점) 다음 적분을 구하시오 Z 1 4 Z 1 (x + 1) dx (a) 1 (x 1)4 dx 1 Solut

Microsoft PowerPoint - lecture2-opengl.ppt [호환 모드]

Microsoft PowerPoint - 06-Body Data Class.pptx

문제지 제시문 2 보이지 않는 영역에 대한 정보를 얻기 위하여 관측된 다른 정보를 분석하여 역으로 미 관측 영역 에 대한 정보를 얻을 수 있다. 가령 주어진 영역에 장애물이 있는 경우 한 끝 점에서 출발하여 다른 끝 점에 도달하는 최단 경로의 개수를 분석하여 장애물의

슬라이드 1

OCW_C언어 기초

완벽한개념정립 _ 행렬의참, 거짓 수학전문가 NAMU 선생 1. 행렬의참, 거짓개념정리 1. 교환법칙과관련한내용, 는항상성립하지만 는항상성립하지는않는다. < 참인명제 > (1),, (2) ( ) 인경우에는 가성립한다.,,, (3) 다음과같은관계식을만족하는두행렬 A,B에

Microsoft PowerPoint - ch02-1.ppt

벡터(0.6)-----.hwp

Python과 함께 배우는 신호 해석 제 5 강. 복소수 연산 및 Python을 이용한 복소수 연산 (제 2 장. 복소수 기초)

chapter2.hwp

04_오픈지엘API.key

Open GL

Microsoft PowerPoint - lecture11-ch5.ppt [호환 모드]

K&R2 Reference Manual 번역본

회원번호 대표자 공동자 KR000****1 권 * 영 KR000****1 박 * 순 KR000****1 박 * 애 이 * 홍 KR000****2 김 * 근 하 * 희 KR000****2 박 * 순 KR000****3 최 * 정 KR000****4 박 * 희 조 * 제

<B1B9BEEE412E687770>

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - lecture15-ch6.ppt

Microsoft PowerPoint 다변수 방정식과 함수(1).ppt

LIDAR와 영상 Data Fusion에 의한 건물 자동추출

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

1 peaieslvfp3 1. 두점사이의거리 수직선위의두점사이의거리를구할수있다. 좌표평면위의두점사이의거리를구할수있다. 수직선위의두점사이의거리 todrkrgo qhqtlek 오른쪽그림은충무로역을중심으로한서울시지하철 3`호선노선도의일부분이다. 충무로역을` 0, 을지로 3`

제 2 교시 2019 학년도 3 월고 1 전국연합학력평가문제지수학영역 1 5 지선다형 1. 의값은? [2점] 일차방정식 의해는? [2 점 ] 두수, 의최대공약수는? [2 점 ] 일차함수 의그래프에서

Microsoft PowerPoint - lecture16-ch6

1 1 장. 함수와극한 1.1 함수를표현하는네가지방법 1.2 수학적모형 : 필수함수의목록 1.3 기존함수로부터새로운함수구하기 1.4 접선문제와속도문제 1.5 함수의극한 1.6 극한법칙을이용한극한계산 1.7 극한의엄밀한정의 1.8 연속

歯Lecture2.PDF

고 학년도 9월고수학 1 전국연합학력평가영역문제지 1 1 제 2 교시 수학영역 5 지선다형 3. 두다항식, 에대하여 는? [ 점 ] 1. 의값은? ( 단, ) [ 점 ] 다항식 이 로인수분해될때, 의값은? ( 단,,

chap 5: Trees

Microsoft PowerPoint - [2009] 02.pptx

(Microsoft PowerPoint - FZBDPQDCSHAN.ppt [\310\243\310\257 \270\360\265\345])

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

02장.배열과 클래스

컴퓨터그래픽스 소프트웨어

C 언어 프로그래밊 과제 풀이

Microsoft PowerPoint - 05geometry.ppt

Microsoft PowerPoint - chap11-포인터의활용.pptx

슬라이드 1

슬라이드 1

7) 다음의 다음 9) 남학생과 9. zb 여학생 각각 명이 갖고 있는 여름 티 셔츠의 개수를 조사하여 꺾은선그래프로 나타낸 것 이다. 이 두 그래프의 설명으로 옳지 않은 것은? ㄱ. ㄴ. 회째의 수학 점수는 점이다. 수학 점수의 분산은 이다. ㄷ. 영어점수가 수학 점

11장 포인터

ch15

일반각과호도법 l 삼각함수와미분 1. 일반각 시초선 OX 로부터원점 O 를중심으로 만큼회전이동한위치에동경 OP 가있을때, XOP 의크기를나타내는각들을 ( 은정수 ) 로나타내고 OP 의일반각이라한다. 2. 라디안 rad 반지름과같은길이의호에대한중심각의 크기를 라디안이라한

슬라이드 1

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - IP11.pptx

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<4D F736F F D20BECBB1E220BDACBFEE20BAA4C5CD2C20C1C2C7A5B0E82C20C1C2C7A5BAAFC8AFC7E0B7C4>

슬라이드 1

Microsoft PowerPoint - LA_ch6_1 [호환 모드]

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

01

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - Week04_Rendering Pipeline.pptx

Microsoft PowerPoint - chap05-제어문.pptx

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

중간고사

초4-1쌩큐기본(정답)본지

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

Transcription:

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 1/8 [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 담당교수: 임 인 성 답은 연습지가 아니라 답안지에 기술할 것 있는 변환 행렬은 일반적으로 어떤 좌표계 에서 어떤 좌표계로의 변환을 위하여 사용 하는가? 답안지 공간이 부족할 경우, 답안지 뒷면에 기 술하고, 해당 답안지 칸에 그 사실을 명기할 것 i 투영 참조점이 무한대점 point at infinity 에 위치한 투영 변환의 이름은 무엇인가? 1 다음 단답식 문제에 답하라 j 다음과 같은 gluperspectivefovy, asp, n, f 함수에 대한 변환 행렬 Mpers 를 통하여 원 근 투영을 수행할 때 진행되는 원근 나눗 셈에서 분모로 사용되는 W 좌표 wc 값은 무엇인가? a 3차원 공간의 두 벡터 p = px py pz t 와 q = qx qy qz t 에 대하여 외적 cross product 연산을 통해 구한 벡터 r = p q = rx ry rz t 의 x 좌표 rx 의 값을 기술하라 b 3차원 투영공간의 점 50, 50, 100, 20에 대응하는 아핀공간의 점의 좌표 x, y, z를 기술하라 c RGB 모델로 03, 05, 10로 표현되는 색 깔을 CMY 모델로 나타내면? cot f ovy 2 asp 0 0 0 d 2차원 공간에서의 회전 변환에 해당하는 3 행 3열 아핀 변환 행렬 Rθ을 기술하라 e 주어진 4행 4열 행렬이 3차원 공간에서의 아핀 변환에 해당하는지를 알 수 있는 방법 은 무엇인가? f 3차원 공간에서의 이동 변환, 크기 변 환, 그리고 회전 변환에 대한 4행 4 열 행렬 T tx, ty, tz, Ssx, sy, sz, 그리고 Rθ, nx, ny, nz 를 고려하자 다음 행렬 M 의 역행렬 M 1 을 위의 기본 변환 행렬의 곱으로 표현하라 반드시 위의 행렬 기호를 사용할 것 2 22 M = 2 0 0 2 2 0 0 0 5 0 0 1 5 0 1 0 0 f2nf n 0 k 위 문제에서 wc 값의 직관적인 의미를 설 명하라 2 3행 3열 행렬로 표현되는 2차원 이동 변환 T tx, ty, 크기 변환 Ssx, sy, 그리고 회전 변환 Rθ를 고려하자 그림 1a의 직사각형 영역의 내용을 b의 직사각형 영역으로 매핑해주는 3 행 3열의 기하 변환 행렬 M 을 i 위의 기본 변 환 행렬들의 곱으로 표현한 후, ii 최종 3행 3열 행렬의 내용을 구하라 22 0 0 cot f ovy 0 2 f +n 0 f n 0 1 y y 5 1-1 g OpenGL 렌더링 파이프라인에서 카메라 의 위치와 방향을 설정 해주는 과정에 해 당하는 기하 변환의 이름은 무엇인가? h OpenGL fixed-function 파이프라인에서 glvertex3f 함수를 사용하여 설정한 꼭 지점에 곱해지는 첫 번째 행렬 스택의 탑에 1 x -1 2 2 a 변환 전 6 b 변환 후 Figure 1: 2차원 윈도우 매핑 - 2014년 4월 25일금 오전 11:30 AS 414 c 2014 서강대학교 공과대학 컴퓨터공학과 임인성 x

서강대학교 공과대학 컴퓨터공학과 3 아래의 코드는 그림 2에 도시한 원점 주변의 0 번 비행기와 4사분면의 1번 비행기를 그려주는 OpenGL 코드이다 Figure 2: 2차원 기하 변환 draw airplane; // airplane 0 glpushmatrix; gltranslatef1500, -1000, 00; glrotatef900, 00, 00, 10; glscalef20, 20, 10; draw airplane; // airplane 1 glpopmatrix; a 이제 이 그림에서처럼 1번 비행기를 직선 y = x + 100에 대하여 반사시켜 2사분면의 2번 비행기와 같이 그려주려 한다 아래의 코드는 이를 위한 코드인데, A와 B에 들어갈 내용을 각각 한 번의 OpenGL API 함수 호출을 통하여 C/C++ 언어 문법에 맞게 기술하라 glpushmatrix; gltranslatef-1000, 00, 00; A glscalef-10, 10, 10; B gltranslatef2500, -1000, 00; glrotatef900, 00, 00, 10; glscalef20, 20, 10; draw airplane; // airplane 2 glpopmatrix; b 3행 3열 행렬로 표현되는 2차원 이동 변 환 T tx, ty, 크기 변환 Ssx, sy, 그리고 회 CSE4170 기초 컴퓨터 그래픽스 중간고사 2/8 전 변환 Rθ를 고려하자 RθS 1, 1 = S 1, 1Rα 식을 만족시켜주는 α 값은 무 엇인가? c S 1, 1T tx, ty = T β, γs 1, 1 식을 만족시켜주는 β와 γ 값은 무엇인가? d RθT tx, ty = T δ, Rθ 식을 만족시켜 주는 δ와 값은 무엇인가? e 이제 2번 비행기를 그리는 작업은 아래와 같은 방식으로도 구현할 수 있다 이때 C 에 들어갈 내용을 한 번의 OpenGL API 함수 호출을 통하여 C/C++ 언어 문법에 맞게 기술하라 glpushmatrix; gltranslatef-1000, 00, 00; glrotatef-900, 00, 00, 10; C gltranslatef2500, -1000, 00; glrotatef900, 00, 00, 10; glscalef20, 20, 10; draw airplane; // airplane 2 glpopmatrix; f 마찬가지로 아래와 같은 방식으로 2번 비행기를 그리려 한다 이때 공란으로 되어있는 각 OpenGL API 함수의 인자 다섯 개를 순서대로 기술하라 힌트: 1번 문제의 답을 잘 이용할 것 glpushmatrix; gltranslatef,, 00; glrotatef, 00, 00, 10; glscalef,, 10; draw airplane; // airplane 2 glpopmatrix; 4 다음은 프레임간의 변환에 관한 문제이다 a 그림 3의 A 소는 점 4, 4, 1을 원점으로 하는 자신의 프레임을 기준으로 세상 좌표 계에 존재하고 있는데, 이 프레임의 각 축 의 방향이 축 옆에 기술되어 있다 이때 이 프레임을 0, 0, -1 방향과 0, 1, 0 방향 이 각각 세상 좌표계의 xw 축과 yw 방향과 일치하는 방식으로 세상 좌표계와 일치시 켜주려한다 이때 필요한 4행 4열 행렬 M1 의 내용을 기술하라 b 한편 B 소는 점 1, 0, 2을 중심으로 하는 프레임을 기준으로 세상 좌표계에 존재하 고 있는데, A 소의 각 꼭지점들을 B 소의 - 2014년 4월 25일금 오전 11:30 AS 414 c 2014 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 yw 4, 4, -1 CSE4170 기초 컴퓨터 그래픽스 중간고사 y 0, 1, 0 0, 0, -1 p COP: 1, 0, 0-1, 0, 2 p' B 0, 0, -1 A 1, 0, 0 x 9 z PP: x = 9 1, 0, 0 zw 3/8 a 문제 a 그림 xw y 0, -1, 0 p Figure 3: 프레임간의 변환 1 대응되는 점으로 매핑해주는 4행 4열 행렬 M2 를 네 개의 기본 변환 행렬의 곱으로 표 현하라 반드시 네 개의 4행 4열 행렬의 내 용을 곱해지는 순서대로 기술할 것 p' 1 x 5 다음은 원근 투영 변환에 관한 문제이다 a 그림 4a에서와 같이 COPCenter of Projecton가 1, 0, 0이고 PPProjection Plane이 x = 9인 상황에서, 주어진 점 p = x y z 1t 을 p0 = x0 y 0 z 0 1t 로 변환해 주는 4행 4열의 원근 투영 변환 행렬 M1 을 구하라 반드시 유도과정이 있어야 함 b 그림 4b는 임의의 점 p를 이 점과 원점 을 지나는 직선과 세 점 1, 0, 0, 0, 1, 0, 그리고 0, 0, 1을 지나는 평면과의 교점 p0 로 투영해주는 모습을 도시하고 있다 이때 이에 대한 원근 투영 변환 행렬 M2 를 구하 라 반드시 유도과정이 있어야 함 6 다음은 간단한 모델링 변환에 관한 문제이다 a 아래의 코드는 그림 5a에 도시한 그림을 그려주는 OpenGL 프로그램의 일부이다 glmatrixmodegl MODELVIEW; glloadidentity; glulookat200, 150, 200, 00, 00, 00, 00, 10, 00; draw axis; draw floor; draw cow; // Line a for angle = 00; angle < 3600; angle += 450 { z 1 b 문제 b 그림 Figure 4: 원근 투영 변환 glpushmatrix; // Line c gltranslatef40, 00, 00; draw cow; // Line b glpopmatrix; 여기서 Line a의 함수는 원점에 배치되 어 있는 소를 그려주고, Line b의 함수는 원점을 둘레로 반경 4인 원을 따라 회전하 고 있는 소를 그려주는 역할을 하고 있는데, 이 코드에는 회전에 필요한 OpenGL API 함수 호출 문장이 결여되어 있다 위 프로그 램이 제대로 작동하기 위하여 어느 지점에 어떤 문장이 필요한지, 그 내용을 OpenGL 및 C/C++ 언어 문법에 맞게 정확히 기술 하라 답은 어떤 문장 직전 또는 직후에 다음 OpenGL 문장이 필요함 과 같이 기술 하되, 두 개 이상의 OpenGL 문장이 필요할 수 있음 b 다음 프로그램에서 그림 5b와 같은 결과를 얻기 위하여 필요한 회전에 필요한 문장을 위 문제에서와 동일한 방식으로 답하라 - 2014년 4월 25일금 오전 11:30 AS 414 c 2014 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 4/8 y x z a 문제 a 그림 y Figure 6: glulookat* 함수를 통한 뷰잉 변환 8 다음은 뷰잉 변환에 관한 문제이다 x z b 문제 b 그림 Figure 5: 간단한 모델링 변환 for int i = 0; i < 5; i++ { glpushmatrix; // Line d gltranslatef20*i-40, 00, 00; draw cow; // Line e glpopmatrix; 7 다음은 glulookat* 함수를 통한 뷰잉 변환에 관한 문제이다 그림 6의 뷰잉 변환 계산 과정과 그림 7의 함수 구현 코드를 보면서 답하라 a 이 코드에서 이 그림의 VRP와 가장 밀접한 관련이 있는 변수들을 정확히 기술하라 b 이 코드에서 이 그림의 v와 가장 밀접한 관 련이 있는 변수들을 정확히 기술하라 c 문맥 상 이 코드의 A, B, 그리고 C 부 분에 들어갈 내용을 C/C++ 언어 문법에 맞게 정확히 기술하라 d 이 코드에는 분명히 잘못된 부분이 있다 그 부분을 명시한 후 올바르게 바로 잡아라 a 한 점 e와 서로 수직이고 길이가 1인 세 개의 벡터 u 카메라 기준 오른쪽 방향, v 카메라 기준 위쪽 방향, n 카메라에서 세상을 바라보는 방향의 정반대 방향으로 정의되는 카메라 프레임을 생각하자 지금 점 e가 원점에, 그리고 u, v, n 벡터가 각각 세상 좌표계의 xw, yw, zw 축 방향을 향하도록 카메라 프레임이 초기화되어 있다 이 상태서 이 카메라 프레임을 yw 축 둘레로 90도만큼 회전시킨 후, xw 축 방향으로 -10만큼 이동을 시켰다고 하자 이때의 뷰잉 변환을 아래의 코드처럼 구현하려 할때, A 부분에 들어갈 내용을 C/C++ 언어 문법에 맞게 OpenGL API 함수 호출을 통하여 구현하라 GLfloat matrix[16]; glmatrixmodegl MODELVIEW; glloadidentity; A glgetfloatvgl MODELVIEW MATRIX, matrix; b 여기서 glgetfloatv*; 문장은 이 문장 수행 당시의 현재 행렬 스택의 탑의 내용 을 배열 matrix[16]으로 추출해주는 역할 을 한다 이때 이 배열에 저장되는 16개의 원소 값을 순서대로 기술하라 OpenGL 시 스템에서 2차원 배열이 저장되는 순서를 상 기할 것 9 지금 다음처럼 카메라 변수 cam을 정의한 후, typedef struct cam { float pos[3], uaxis[3], vaxis[3], - 2014년 4월 25일금 오전 11:30 AS 414 c 2014 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 5/8 void glulookatgldouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz { GLdouble m[16]; GLdouble x[3], y[3], z[3]; GLdouble mag; z[0] = eyex - centerx; z[1] = eyey - centery; z[2] = eyez - centerz; mag = sqrtz[0]*z[0] + z[1]*z[1] + z[2]*z[2]; if mag { z[0] /= mag; z[1] /= mag; z[2] /= mag; y[0] = upx; y[1] = upy; y[2] = upz; 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] = A ; y[1] = B ; y[2] = C ; mag = sqrtx[0]*x[0] + x[1]*x[1] + x[2]*x[2]; if mag { x[0] /= mag; x[1] /= mag; x[2] /= mag; mag = sqrty[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[col*4+row] M0,0 = x[0]; M0,1 = x[1]; M0,2 = x[2]; M0,3 = 00; M1,0 = y[0]; M1,1 = y[1]; M1,2 = y[2]; M1,3 = 00; M2,0 = z[0]; M2,1 = z[1]; M2,2 = z[2]; M2,3 = 00; M3,0 = 00; M3,1 = 00; M3,2 = 00; M3,3 = 10; #undef M glmultmatrixdm; gltranslatedeyex, eyey, eyez; Figure 7: glulookat* 함수의구현 naxis[3]; GLfloat mat[16]; GLdouble fovy, aspect, near c, far c; Cam; Cam cam; 디스플레이컬백함수에서다음과같이물체를그리려한다 여기서 sfactor 는 float 타입의전역변수임 void display void { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; // Line a glmultmatrixfcammat; gltranslatef-campos[0], -campos[1], -campos[2]; // Line b glpushmatrix; glscalefsfactor, sfactor, sfactor; // Line c draw teapot; glpopmatrix; glflush; a 보편적인관점에서, Line a 와 Line b 지점에서 glvertex** 함수로꼭지점의좌표를기술하면이꼭지점은각각눈좌표계, 모델링좌표계, 그리고세상좌표계중어느좌표계에서의의미를가질까? b 다음과같은함수를사용하여세상좌표계의좌표축을그려주려한다 void draw axesvoid { gllinewidth20; glbegingl LINES; glcolor3f10, 00, 00; // x 축 glvertex3f00, 00, 00; glvertex3f1500, 00, 00; glend; gllinewidth10; 이함수를 Line a, Line b, 그리고 Line c 중어느시점에서호출을해야 - 2014 년 4 월 25 일 금 오전 11:30 AS 414 - c 2014 서강대학교공과대학컴퓨터공학과임인성

서강대학교 공과대학 컴퓨터공학과 할까? c 그림 8은 이 프로그램의 초기 렌더링 결과 를 보여주고 있다 여기서 세상 좌표계의 x축과 y축이 각각 오른쪽과 위쪽 방향으로 그려져 있고, z축은 화면 앞으로 튀어 나오고 있음 초기에 카메라의 위치는 다음과 같이 설정되어 있는데, campos[0] = 00, campos[1] = 00, campos[2] = 5000; CSE4170 기초 컴퓨터 그래픽스 중간고사 6/8 set rotate matcammat; glutpostredisplay; break; e 위 스페셜 컬백 함수를 사용할 경우, 아래 화살표 키를 누를 때마다 화면에서 물주전 자가 어떤 식으로 움직일지를 적절한 수치 를 사용하여 정확히 기술하라 이때의 camuaxis[] 벡터의 세 원소 값을 10 그림 9는 아래에 주어진 디스플레이 컬백 함수를 통하여 세상 좌표계 WC에서 동일한 기술하라 소 모델을 사용하여 렌더링한 모습을 도시하고 있다 yw WC 㞚㰖 zw xw Figure 8: 물주전자 그리기 㠊 d 다음은 스페셜 컬백 함수의 일 부이다 이 코드에서 문맥상 set rotate matcammat; 문장은 cammat[] 배열에 어떤 값들을 어떻게 넣어주는 역할을 할지 정확히 기술하라 case GLUT KEY DOWN: { float c, s, tx, ty; c = cos3141592*450/1800; s = sin3141592*450/1800; tx = c*camnaxis[2] - s*camnaxis[0]; ty = s*camnaxis[2] + c*camnaxis[0]; camnaxis[2] = tx, camnaxis[0] = ty; tx = c*camuaxis[2] - s*camuaxis[0]; ty = s*camuaxis[2] + c*camuaxis[0]; camuaxis[2] = tx, camuaxis[0] = ty; campos[0] = 5000*camnaxis[0]; campos[1] = 5000*camnaxis[1]; campos[2] = 5000*camnaxis[2]; Figure 9: 간단한 계층적 모델링 void rendervoid { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; draw floor0533, 0271, 0075; draw axes30, 15; // WC 좌표축 draw axes10, 50; draw cow0243, 0627, 0333; // 소 glpushmatrix; A glscalef11, 11, 11; draw axes10, 50; glpushmatrix; gltranslatef-01, 088, 00; draw cow10, 10, 10; - 2014년 4월 25일금 오전 11:30 AS 414 c 2014 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 glpopmatrix; glscalef25, 25, 25; draw cow0914, 0671, 0090; glpopmatrix; glutswapbuffers; a 이 프로그램에서 세 개의 draw cow*; 문 장들은 각각 소, 송아지, 그리고 어미소를 그려주고 있다 여기서 송아지를 그려주는 문장은 어떤 것인지 해당 함수의 세 개의 인자를 통하여 답하라 b 프로그램 문맥상 어미소는 원점 주변의 소 의 몇 배 크기를 가질까? c 지금 타이머 컬백 함수에 의해 변수 angle 의 값이 1씩 증가하면서 0과 359 사이에서 순환 위의 디스플레이 컬백 함수가 호출 되고 있다 어미소와 송아지가 세상 좌표계 의 yw 축 둘레로 반경 4인 원을 따라 같이 회전을 하게 하게 하기 위하여 A 지점에 필요한 내용을 C/C++ 언어 문법에 맞게 OpenGL API 함수 호출을 통하여 구현하 라 어미소와 송아지의 얼굴이 진행 방향을 가리킴 d 위 코드에서 소, 어미소, 송아지 등 각 물 체를 그려주는 문장이 수행되는 시점에는 각 물체 자신만의 좌표계가 설정되어 있 다고 할 수 있다 이때 송아지를 그려주는 문장이 수행되는 시점에서 한 꼭지점에 어 떤 기하 변환을 가하면 어미소를 그려주 는 문장이 수행되는 시점의 좌표계로 변환 할 수 있을까? T tx, ty, tz, Rα, rx, ry, rz, Ssx, sy, sz 행렬과 그것들의 역행렬을 적 절히 사용하여 그 기하 변환을 합성하라 CSE4170 기초 컴퓨터 그래픽스 중간고사 7/8 느 영역인지 자신이 붙인 이름을 사용하 여 밝히고, ii 어떠한 사용자 인터액션 을 통해 메뉴를 화면에 도시하는지, 그리고 iii 각 메뉴 요소 선택을 통하여 어떤 일을 할 수 있는지 명확히 기술하라 c 어떤 특정 영역은 왼쪽 마우스 버튼 클릭에 대하여 반응을 한다 어떤 영역인지 자신 이 붙인 이름을 사용하여 기술하라 d 그 영역에서 왼쪽 마우스 버튼을 눌러다가 뗄 때 어떤 영역의 내용이 어떻게 바뀌는 지 정확히 기술하라 그 어떤 작용에 대하여 필요하다면 마우스 커서의 위치를 정확히 기술할 것 e 만약 9번과 10번 문장 사이에 다음 문장을 삽입하고, glutsetwindowsubwindow0; 20번 문장을 다음 두 문장으로 대치 할 경우에 대하여, glutsetwindowsubwindow0; glclearcolor00, 10, 00, 10; 바로 위 문제에 대하여 답하라 <수고 많았습니다!> 11 그림 10에 주어진 GLUT API 함수를 통한 윈도 우 프로그래밍 코드를 보고 답하라 a 이 프로그램을 처음 수행시키면 가로-세로 1000 픽셀 크기의 윈도우가 화면에 도시된 다 이 윈도우 안에는 두 개의 사각형이 그 려지는데, 전체 윈도우 안에서의 이 두 사 각형의 정확한 크기와 위치를 그리고 이 두 사각형으로 인하여 생성되는 세 영역의 초 기 색깔을 명확히 기술하라 이 세 영역에 대하여 적절히 A, B, 그리고 C로 이름 을 붙이고, 이후 문제에서는 이 영역 이름을 사용하여 답할것 b 이 프로그램에서는 특정 윈도우 영역에서 메뉴를 사용할 수 있는데, i 그 영역이 어 - 2014년 4월 25일금 오전 11:30 AS 414 c 2014 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 8/8 01 02: int MainWindow, SubWindow0, SubWindow1; 03: void mouseint button, int state, int x, int y { 04: if button == GLUT LEFT BUTTON && state == GLUT DOWN { 05: if y <= 200 { 06: glclearcolor00, 00, 00, 10; 07: glutpostredisplay; 08: 09: else { 10: glclearcolor10, 10, 10, 10; 11: glutpostredisplay; 12: 13: 14: else if button == GLUT LEFT BUTTON && state == GLUT UP { 15: if y <= 200 { 16: glclearcolor00, 00, 10, 10; 17: glutpostredisplay; 18: 19: else { 20: glclearcolor00, 00, 10, 10; 21: glutpostredisplay; 22: 23: 24: 25: void displayvoid { glcleargl COLOR BUFFER BIT; glflush; 26: void helloint value { 27: if value { glclearcolor10, 10, 00, 10; glutpostredisplay; 28: else { glclearcolor10, 00, 00, 10; glutpostredisplay; 29: 30: void main int argc, char **argv { 31: glutinit&argc, argv; glutinitdisplaymodeglut RGBA; glutinitwindowsize1000,1000; 32: MainWindow = glutcreatewindow"2014 CSE3170 Midterm Exam"; 33: glutcreatemenuhello; 34: glutaddmenuentry"boy", 0; glutaddmenuentry"girl", 1; 35: glutattachmenuglut RIGHT BUTTON; 36: glutdisplayfuncdisplay; 37: glclearcolor10, 00, 00, 10; 38: SubWindow0 = glutcreatesubwindowmainwindow, 100, 100, 400, 200; 39: glutdisplayfuncdisplay; 40: glclearcolor00, 10, 00, 10; 41: SubWindow1 = glutcreatesubwindowmainwindow, 600, 500, 200, 400; 42: glutdisplayfuncdisplay; 43: glutmousefuncmouse; 44: glclearcolor00, 00, 10, 10; 45: glutmainloop; 46: Figure 10: GLUT 함수를통한윈도우프로그래밍예 - 2014 년 4 월 25 일 금 오전 11:30 AS 414 - c 2014 서강대학교공과대학컴퓨터공학과임인성

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 1/5 [CSE4170: 기초 컴퓨터 그래픽스] 중간고사 담당교수: 임 인 성 답은 반드시 답안지에 기술할 것 공간이 부족할 경우 반드시 답안지 마지막 공간에 답이 있다고 명 기한 후 기술할 것 그 외에 연습지에 기술한 내용은 답안으로 인정 안함 2 아래의 코드는 그림 2에 도시한 원점 주변의 0 번 비행기와 1사분면의 1번 비행기를 그려주는 OpenGL 코드이다 1 2차원 아핀 변환인 이동 변환 T tx, ty, 크기 변 환 Ssx, sy, 그리고 회전 변환 Rθ에 해당하는 3행 3열 행렬들을 고려하자 a 3행 3열 행렬 Rθ를 기술하라 b RθS1, 1 = S1, 1Rθ 라 할 때, θ 의 값을 유도하라 힌트: 이 문제의 등식에 서 Rθ 행렬을 계산한 후, θ 를 구할 것 c T tx, ty S1, 1 = S1, 1T t x, t y 라 할 때, t x 와 t y 의 값을 유도하라 d RθT tx, ty = T t x, t y Rθ라 할 때, t x 와 t y 의 값을 유도하라 e 임의의 점 x, y를 y, x로 변환해주는 3 행 3열의 기하 변환 행렬 M 을 위의 기본 변환 행렬들의 곱으로 표현한 후, 최종 3행 3열 행렬의 내용을 기술하라 힌트: 위의 b, c, d에서 유도한 사실을 이용할 것 f 그림 1a의 직사각형 영역의 내용을 b의 직사각형 영역으로 매핑해주는 3행 3열의 기하 변환 행렬 M 을 위의 기본 변환 행렬 들의 곱으로 표현한 후, 최종 3행 3열 행렬 의 내용을 기술하라 y 2 5 1 2 7 2 6 a 변환 전 x 10 x' y' Figure 2: 2차원 기하 변환 draw airplane; // airplane 0 glpushmatrix; gltranslatef300, 250, 00; glrotatef900, 00, 00, 10; draw airplane; // airplane 1 glpopmatrix; a 이제 이 그림에서처럼 1번 비행기를 2배 확대하여 직선 y = x + 100에 대하여 반사시켜 3사분면의 2번 비행기와 같이 그려주려 한다 아래의 코드는 이를 위한 코드인데, A에 들어갈 내용을 5개의 OpenGL API 함수 호출을 통하여 C/C++ 언어 문법에 맞게 기술하라 b 변환 후 Figure 1: 2차원 윈도우 매핑 glpushmatrix; A gltranslatef3000, 2500, 00; - 2013년 4월 26일금 오전 11:00 AS 414 c 2013 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 CSE4170 기초 컴퓨터 그래픽스 중간고사 2/5 glrotatef900, 00, 00, 10; glscalef20, 20, 10; draw airplane; // airplane 2 glpopmatrix; b 위의 문제와 동일한 내용을 아래와 같은 방식으로 구현하려 한다 이때 공란으로 되어있는 각 OpenGL API 함수의 인자를 기술하라 힌트: 1번 문제의 답을 잘 이용할 것 glpushmatrix; gltranslatef,, 00; glrotatef,,, glscalef,, 10; draw airplane; // airplane 2 glpopmatrix; ; Figure 3: 3차원 기하 변환 y c 그림 3은 아래의 코드의 for-loop에서 i가 3일 때까지 그림을 그려준 상태이다 이때 i가 6일 때 이 원뿔이 어느 지점에 어떻게 그려질지 그 모습을 가급적 정확히 그려 라 i가 6일 때만의 물체의 모습을 그릴것 u' Frame 2 3 그림 4에는 원점을 중심으로, 각각 세 개의 벡터 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 에 의해 정의가 되는 두 개의 프레임 이 도시되어 있다 여기서 각 프레임의 세 벡터 는 서로 수직인 단위 벡터들임 이때 Frame 1을 Frame 2로 맞추어 주는 아핀변환에 해당하는 4 p' v n' n glpushmatrix; glcolor3f10, 00, 00; glrotatef-900, 10, 00, 00; // 원점 주변 원뿔 glutwirecone500, 1000, 10, 10; glpopmatrix; for i = 0; i <= 6; i++ { glpushmatrix; gltranslatef3000, 00, 00; glrotatef300*i, 10, 00, 00; gltranslatef00, 2500, 00; glrotatef300*i, 00, 00, 10; glcolor3f00, 00, 10; glrotatef-900, 10, 00, 00; glutwirecone500, 1000, 10, 10; glpopmatrix; M p z x u v' Frame 1 Figure 4: 프레임간의 좌표 변환 z p COP = 1, 0, 0 p' x -9 y PP : x = -9 Figure 5: 원근 투영 변환 행 4열 행렬 M 을 두 개의 회전 변환의 곱으로 표현하라 최종 변환 행렬이 아니라 곱해지는 각 행렬들의 16개 원소들을 정확히 기술할 것 4 그림 5에서 주어진 점 p = x y z 1t 을 p0 = x0 y 0 z 0 1t 로 변환해주는 4행 4열의 원근 투영 변환 행렬 M 을 기술하라 - 2013년 4월 26일금 오전 11:00 AS 414 c 2013 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 5 다음은 뷰잉 변환에 관한 문제이다 a 그림 6에는 카메라의 위치와 방향을 설정해주는 프레임이 도시되어 있다 이 경우에 해당하는 뷰잉변환을 설정해주 는 OpenGL 코드를 gltranslatefx, y, z, glscalefx, y, z, 그리고 glrotatefa, x, y, z 등의 함수만을 사용하여 가급적 적은 회수의 함수 호출을 통하여 구현하라 yw CSE4170 기초 컴퓨터 그래픽스 중간고사 3/5 라 c 바로 위 문제에서의 뷰잉 변환을 다음과 같이 구현하려한다 GLfloat m[16]; glmatrixmodegl MODELVIEW; glloadidentity; glmultmatrixfm; gltranslatef a, b c ; 이때 a, b, c의 값과 배열 m에 저장되 어야할 16개 원소 값을 순서대로 기술하라 WC 5 6 지금 아래처럼 카메라 변수 cam을 정의한 후, xw 5 ᄗ ᇷ ޗ #ᄬ zw ᰚ #ᄬ ᬧ #ᄬ Figure 6: 카메라의 배치 b 한 점 p와 서로 수직이고 길이가 1인 세 개의 벡터 u 카메라 기준 오른쪽 방향, v 카메라 기준 위쪽 방향, n 카메라에서 세상을 바라보는 정반대 방향으로 정의되 는 카메라 프레임을 생각하자 지금 비행기 물체를 자신의 모델링 좌표계 Modeling Coordinate에서 설계하고 있다 카메라 프레임이 원점에서 u, v, n 벡터가 각각 모델링 좌표계의 x, y, z 축과 일치하여 있는 상태에서 모델링 좌표계의 z축 둘레로 90도 회전한 후 x축 방향으로 10 만큼 이동하여 카메라 프레임을 조종석에 배치하였다고 하자 이제 비행기 물체에 대해 y축 둘레로 90도만큼 회전시킨후, y축으로 -10만큼, 그리고 z축으로 5만큼 이동시켜 세상 좌표계 World Coordinate 로 배치하였다고 하자 이때에 해당하는 뷰잉 변환을 다음과 같이 OpenGL API 함수를 사용하여 구현하려 한다 glmatrixmodegl MODELVIEW; glloadidentity; B 여기서 B에 들어갈 내용을 네 개의 OpenGL API 함수 호출을 통하여 구현하 typedef struct cam { float pos[3], uaxis[3], vaxis[3], naxis[3]; GLfloat mat[16]; GLdouble fovy, aspect, near c, far c; Cam; Cam cam; 디스플레이 컬백 함수에서 다음과 같이 물체를 그리려 한다 여기서 sfactor는 float 타입의 전역 변수임 void display void { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; // Line a glmultmatrixfcammat; gltranslatef-campos[0], -campos[1], -campos[2]; // Line b glpushmatrix; glscalefsfactor, sfactor, sfactor; // Line c draw teapot; glpopmatrix; glflush; a 보편적인 관점에서 Line a와 Line b 지점 은 각각 눈 좌표계 Eye Coordinate, 모델 - 2013년 4월 26일금 오전 11:00 AS 414 c 2013 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 링 좌표계, 세상 좌표계 중 어느 좌표계에 서의 의미를 가질까? b 다음과 같은 함수를 사용하여 세상 좌표계 의 좌표축을 그려주려 한다 void draw axesvoid { gllinewidth20; glbegingl LINES; glcolor3f10, 00, 00; // x축 glvertex3f00, 00, 00; glvertex3f1500, 00, 00; glend; gllinewidth10; 이 함수를 Line a, Line b, Line c 중 어느 시점에서 호출을 해야할까? c 문맥상 set rotate matcammat; 문장 은 cammat[] 배열에 어떤 값들을 어떻게 넣어주는 역할을 할지 정확히 기술하라 d 그림 7은 이 프로그램의 초기 렌더링 결과 를 보여주고 있다 여기서 세상 좌표계의 x축과 y축이 각각 오른쪽과 위쪽 방향으로 그려져 있고, z축은 화면 앞으로 튀어 나오고 있음 초기에 카메라의 위치는 다음과 같이 설정되어 있는데, campos[0] = 00, campos[1] = 00, campos[2] = 5000; CSE4170 기초 컴퓨터 그래픽스 중간고사 e 다음은 스페셜 컬백 함수의 일부이다 case GLUT KEY DOWN: { float c, s, tx, ty; c = cos3141592*450/1800; s = sin3141592*450/1800; tx = c*camnaxis[2] - s*camnaxis[0]; ty = s*camnaxis[2] + c*camnaxis[0]; camnaxis[2] = tx, camnaxis[0] = ty; tx = c*camuaxis[2] - s*camuaxis[0]; ty = s*camuaxis[2] + c*camuaxis[0]; camuaxis[2] = tx, camuaxis[0] = ty; campos[0] = 5000*camnaxis[0]; campos[1] = 5000*camnaxis[1]; campos[2] = 5000*camnaxis[2]; set rotate matcammat; glutpostredisplay; break; 아래 화살표 키를 누를 때마다 화면에서 물 주전자가 어떤 식으로 움직일지를 적절한 수치를 사용하여 정확히 기술하라 7 그림 8은 아래와 같은 어떤 디스플레이 컬백 함수를 통하여 렌더링한 모습을 도시하고 있다 여기서 세상 좌표계의 x축은 오른쪽 아래로, y 축은 위쪽을 향하고 있음 이때의 camnaxis[] 벡터의 세 원소 값을 기술하라 Figure 7: 물주전자 그리기 4/5 Figure 8: 계층적 모델링 - 2013년 4월 26일금 오전 11:00 AS 414 c 2013 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 glmatrixmodegl MODELVIEW; glloadidentity; glulookat100, 100, 100, 00, 00, 00, 00, 10, 00; draw cow02, 02, 02; // 원점 주변 소 glpushmatrix; // Line a glscalef40, 40, 40; draw cow00, 00, 00; // 어미소 glpushmatrix; glrotatef100*angle, 10, 00, 00; gltranslatef-01, 00, 03; glscalef0025, 0025, 0025; draw box; // 상자 glpopmatrix; glpushmatrix; gltranslatef015, 03, 00; glscalef03, 03, 03; draw cow00, 00, 10; // 송아지 glpopmatrix; glpopmatrix; a 프로그램 문맥상 송아지는 원점 주변 소의 몇 배 크기를 가질까? b 지금 타이머 컬백 함수에 의해 변수 angle 의 값이 1씩 증가하면서 0과 359 사이 순 환 위의 디스플레이 컬백 함수가 호출되고 있다 어미소, 송아지, 상자 물체들이 세상 좌표계의 y축 둘레로 반경 5인 원을 따라 같 이 회전을 하게 하게 하기 위하여 Line a 지점에 필요한 OpenGL 함수를 기술하라 c 이때 상자는 어떤 물체를 기준으로 어떠한 방식으로 어떤 속도로 움직일까? d 위 프로그램에서 제거를 해도 아무런 문제 가 없는 문장을 모두 정확히 기술하라 예를 들어, // 상자 문장 위의 glscalef0025, 0025, 0025; 문장 처럼 기술하고, 주어진 코드 뒤에 다른 물체를 그리는 코드가 올 수 있음 e 위 코드에서 원점 주변 소, 어미소, 송아 지, 상자 등 각 문장이 수행되는 시점에는 자신만의 좌표계가 설정되어 있다고 할 수 있다 이때 송아지 문장이 수행되는 시점에 서 한 꼭지점에 어떤 기하 변환을 가하면 상 자 문장이 수행되는 시점의 좌표계로 변환 할 수 있을까? T tx, ty, tz, Rα, rx, ry, rz, CSE4170 기초 컴퓨터 그래픽스 중간고사 5/5 Ssx, sy, sz 행렬과 그것들의 역행렬을 적 절히 사용하여 그 기하 변환을 합성하라 8 다음 단답식 문제에 답하라 a 3차원 투영공간의 점 60, 60, 90, 30에 해당하는 아핀공간의 점의 좌표 x, y, z를 기술하라 b RGB 모델로 값이 03, 05, 10인 색깔을 CMY 모델로 나타내면? c 다음 행렬의 역행렬 M 1 의 내용을 기술하 라 1 0 0 10 0 2 22 0 2 M = 2 2 0 0 2 2 0 0 0 1 d 어떤 4행 4열 행렬이 아핀 변환 행렬이 되 기위한 조건을 기술하라 e OpenGL의 뷰잉 파이프라인에서 카메라 의 위치와 방향을 설정 해주는 변환은 정 확히 어느 좌표계에서 어느 좌표계로 보내 주는 변환인가? f 3차원 공간의 두 벡터 p = px py pz t 와 q = qx qy qz t 에 대하여 외적 cross product 연산을 가한 벡터 r = p q = rx ry rz t 의 y 좌표 ry 의 값을 기술하라 g glulookat-10, 00, 00, 20, 00, 00, 00, 09, 00; 문장 수행 시 계산이 되는 뷰잉 변환 행렬 MV = mij, i, j = 1, 2, 3, 4의 세 번째 행의 원소들 m31, m32, m33, m34 의 내용을 기술하라 h 3차원 아핀 변환을 나타내는 4행 4열 행렬 이 변환 후에도 물체의 크기와 모양을 보존 해주기 위한 조건을 정확히 기술하라 i 주어진 회전 변환 R과 크기 변환 S간에 교 환 법칙이 성립하기 위한 조건은 무엇일까? j 만약 여러분이 gltranslatefx, y, z 함수를 가장 적은 회수의 산술 연산만 사용 하여 구현한다고 할 때, 덧셈/뺄셈, 곱셈, 그리고 나눗셈 연산이 각각 몇 번씩 필요 할까? 여기서 스택에 있는 행렬은 임의의 값을 가질 수 있다고 가정함 k 두 직선 3x + 2y + 5 = 0과 6x + 4y + 5 = 0의 교점에 대한 투영 공간에서의 동차 좌표를 상수만 사용하여 기술하라 l 사진 촬영시 피사체를 배치하는 과정을 OpenGL 렌더링에서는 어떤 변환을 통하 여 구현하는가? <수고 많았습니다!> - 2013년 4월 26일금 오전 11:00 AS 414 c 2013 서강대학교 공과대학 컴퓨터공학과 임인성

서강대학교 공과대학 컴퓨터공학과 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으로 초기화되어 있고, 각 원의 반지름은 02*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 3141592/1800 void timerint value { gluttimerfunc15, timer, 2; angle2 = angle2 + 1 % 180; if angle2 == 0 phase = phase + 1 % 4; trans2 x = 02*win height *cosdouble TO RAD*angle2 + 10; trans2 y = 02*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-04*win height, 00, 00; glscalef10, -10, 10; break; case 2: glscalef B, 10; break; case 3: gltranslatef02*win height, 00, 00; glscalef-10, 10, 10; gltranslatef-02*win height, 00, 00; glscalef10, -10, 10; gltranslateftrans2 x, trans2 y, 00; 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 = 00; M3,0 = M3,1 = M3,2 = 00; M3,3 = 10; void rendervoid { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; glmultmatrixfcammat; gltranslatef,, ; draw axis; draw world; // Modeling Transform here glutswapbuffers; #define CAM TSPEED 005 void renew cam pos xint del { campos[0] += CAM TSPEED*del* A ; campos[1] += CAM TSPEED*del* B ; campos[2] += CAM TSPEED*del* C ; void renew cam pos yint del { void renew cam pos zint del { #define TO RADIAN 001745329 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 matcamuaxis[0], camuaxis[1], camuaxis[2], CAM RSPEED*angle, m; camvaxis[0] = m[0][0]*tmpx=camvaxis[0] + m[0][1]*tmpy=camvaxis[1] + m[0][2]*tmpz=camvaxis[2]; camvaxis[1] = m[1][0]*tmpx + m[1][1]*tmpy + m[1][2]*tmpz; camvaxis[2] = m[2][0]*tmpx + m[2][1]*tmpy + m[2][2]*tmpz; camnaxis[0] = ; camnaxis[1] = ; camnaxis[2] = ; set rotate matcammat; 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* 함수는 점 campos와 세 벡터 camuaxis, camvaxis, camnaxis 로 정의된 카메라 프레임을 camuaxis 방 향을 따라 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*900, 00, 00, 10; glbegingl TRIANGLES; glvertex2f10, 00; glvertex2f10, 10; glvertex2f00, 10; 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 { glclearcolor10, 10, 10, 10; glpolygonmodegl FRONT AND BACK, GL FILL; glcolor3f10, 00, 00; 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-10, -10, 00; d 바로 위 문제의 프로그램 상태에서, 즉 이 동 변환 관련 문장이 삽입된 상태에서 reshape 함수의 glutpostredispaly; 문장 바로 직전에 아래와 같은 문장을 삽입 할 경우 화면의 내용이 어떻게 반복될지, 그림 6과 같은 방식으로 그려라 glortho00, 10, 00, 10, -10, 10; 8 다음 단답식 문제에 답하라 필요할 경우 OC Object Coordinate, CC, EC, MC, NDC, WC, WdC Window Coordinate 등의 OpenGL 좌표계 이름을 적절히 사용하라 a 3차원 투영공간의 점 60, 60, 90, 30에 해당하는 아핀공간의 점의 좌표 x, y, z를 기술하라 b RGB 모델로 값이 03, 05, 10인 색깔을 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-10, 00, 00, 20, 00, 00, 00, 09, 00; 문장 수행 시 계산이 되는 뷰잉 변환 행렬 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 mvcarcpp page 1 1 #include <stdioh> 2 #include <mathh> 3 #include <GL/gluth> 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 17 51 #define ww 10 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-05, 0, ww; // rad = 17, ww = 10 60 glrotatef720*i, 00, 00, 10; 61 draw_nut; // draw nut object 62 glpopmatrix; 63 64 65 66 #define TO_DEG 5729579 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-39, -35, 45; 100 draw_wheel_and_nut00; // wheel 0 101 glpopmatrix; 102 103 glpushmatrix; 104 gltranslatef39, -35, 45; 105 draw_wheel_and_nut00; // wheel 1 106 glpopmatrix; 107 108 glpushmatrix; 109 gltranslatef-39, -35, -45; 110 glscalef10, 10, -10; 111 draw_wheel_and_nut00; // wheel 2 112 glpopmatrix; 113 114 glpushmatrix; 115 gltranslatef39, -35, -45; 116 glscalef10, 10, -10; 117 draw_wheel_and_nut00; // 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 mvcarcpp 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-150, 200, 400, path[cur_i][0], 489, path[cur_i][2], 00, 10, 00; 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], 489, 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 < 00 dist *= -10; 187 glutpostredisplay; 188 189 190 191 192 void reshapeint width, int height { 193 glviewport0, 0, width, height; 194 195 glmatrixmodegl_projection; 196 glloadidentity; 197 gluperspective300, width/double height, 10, 1500; 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/40, 00, 00; glrotatef450, 00, 00, 10; glscalefsx, sy, 10; glrotatef-450, 00, 00, 10; gltranslateftx, ty, 00; glrotatef2700, 00, 00, 10; glscalef20, 20, 10; 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/40, H/40 지점으로이동시켜그린상태를보여주고있다 이러한그림이그려지도록 // Transforms for B 부분의내용을 OpenGL 함수를사용하여기술하라 b 비행기 C는비행기 A를시계방향으로 90 도회전한후, 그중심을 W/25, H/80 지점으로이동시켜그린상태를보여주고있다 지금그러한비행기 C를두배확대한후 y = x H 40 둘레로반사시켜비행기 D를그려주려한다 이때필요한 sx, sy 와 tx, ty의내용을정확히기술하라 c 비행기 D 를그려주는코드는아래와같이단순화시킬수있다 glpushmatrix; gltranslatefttx, tty, 00; glrotatefra, rx, ry, rz; glscalefssx, ssy, 10; 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; glcolor3f02, 05, 02; glpushmatrix; // We need a modeling transform here draw cow; glpopmatrix; glflush; a 위의코드에서 draw cow 함수는자신의모델링좌표계 Modeling Coordinate, MC 에서정의된소를구성하는삼각형을그려주는함수이다 그림 2a 는이소를각축방향으로 5 배확대하여, x 축둘레로 90 도회전한후, 50, 50, 15 만큼이동시켜그려준상태를보여주고있다 이때 // 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 에배치된소가이좌표계에서 50, 50, 15 점을지나고 z w 축 그림에서수직방향의축 에평행한직선둘레로 5 도씩회전하도록하려한다 그림 2b 참조 위문제에서기술한여러분의코드를어떻게확장하면될지정확히기술하라 c 이문제에서는카메라가세상좌표계의 150, 50, 15 지점에서 50, 50, 15 지점을바라보고있으며, 양의 z w 방향이위쪽방향으로설정되어있다 이에필요한 glulookat 함수의 9 개인자를정확히기술하라 d 이프로그램이정상적으로수행될때 // ModelView matrix 시점에서모델뷰행렬스택의탑에있는 4 행 4 의뷰잉변환행렬 M V 의내용을정확히기술하라 e 이뷰잉변환행렬 M V 는세상좌표계의벡터 50, 50, 15 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 만약값이 03, 03, 03, 03 인미리곱한색깔로어떤화소를칠한다고할때, 이는그화소를어떻게칠한다는것인지정확히기술하라 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 =10 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 { glclearcolor00, 00, 00, 00; glcleargl COLOR BUFFER BIT; glenablegl BLEND; glblendfuncgl ONE, GL ZERO; rect-20, 40, -20, 40, 00, 10, 00, 10; glblendfuncgl SRC ALPHA, GL DST ALPHA; rect-35, 30, -35, 30, 10, 00, 00, 10; rect00, 48, -48, 20, 00, 00, 10, 10; gldisablegl BLEND; void test1void { - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 5/8 1 2 3-35 -2 4 0 48 x 8 다음은계층적모델링을통하여자동차를그려주는 OpenGL 프로그램으로서, 사용자가마우스를사용하여자동차를경로를따라대화식으로 interactively 움직일때, 네바퀴가적절한속도로진행방향으로회전하며, 특히두앞바퀴는자동차의진행방향에따라적절히좌우로도회전을하도록코딩이되어있다 그림 7 참조 이프로그램과그림 8 을보면서답하라 a test0 수행결과 1 3 1 2 2-35 -2 4 3 x b test1 수행결과 Figure 6: 색깔의혼합 glclearcolor00, 00, 00, 00; glcleargl COLOR BUFFER BIT; glenablegl BLEND; glblendfuncgl ONE, GL ZERO; rect-20, 40, -20, 40, 00, 10, 00, 10; glblendfunca, B; rect-35, 30, -35, 30, 10, 00, 00, 10; 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; glrotatef720*i, 00, 00, 10; gltranslatef12, 0, 10; 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-39, -35, 45; glrotatefangle 1, 00, 10, 00; glrotatefangle 2, 00, 00, 10; draw wheel and nut; // wheel 0 glpopmatrix; glpushmatrix; gltranslatef-39, -35, -45; glrotatefangle 1, 00, 10, 00; glrotatefangle 2, 00, 00, 10; - 2011 년 4 월 27 일 수 오후 3:00 AS 412 - c 2011 서강대학교공과대학컴퓨터공학과임인성

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 6/8 glscalef10, 10, -10; draw wheel and nut; // wheel 1 glpopmatrix; glpushmatrix; gltranslatef39, -35, 45; // Need a transform draw wheel and nut; // wheel 2 glpopmatrix; glpushmatrix; gltranslatef39, -35, -45; // Need a transform glscalef10, 10, -10; draw wheel and nut; // wheel 3 glpopmatrix; void draw worldvoid { GLfloat m[16]; set up rot matm, cur i; glmatrixmodegl MODELVIEW; glloadidentity; glulookat-150, 200, 400, path[cur i][0]+3, 489, path[cur i][2]+3, 00, 10, 00; gltranslatefpath[cur i][0], 489, 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, 00, 10, 00; 문장은어떤기하변환을목적으로하는지정확히기술하라 그림 8 을잘보고답할것 g 앞문제에이어 문맥상이두문장의바로앞 glrotatefangle 2, 00, 00, 10; 문장은어떤기하변환을목적으로하는지정확히기술하라 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 동차좌표점 20, 00, 80, 05 에해당하는유클리드공간에서의점의좌표는? b RGB 색깔모델로표현된색깔 07, 06, 01 을 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*900, 00, 00, 10; - 2010 년 4 월 28 일 수 오후 7:00 -

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 3/7 그림 4: OpenGL 을사용한 2 차원기하변환 gltranslatef-2500, -2500, 00; glbegingl TRIANGLES; glvertex2f5000, 00; glvertex2f5000, 5000; glvertex2f00, 5000; 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; glortho00, double width, 00, double height, -10, 10; glutpostredisplay; void OpenGLInitandRegisterCallbackvoid { glclearcolor10, 10, 10, 10; glpolygonmodegl FRONT AND BACK, GL FILL; glcolor3f10, 00, 00; 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와같은방식으로그려라 glortho00, width/20, 00, height/20, -10, 10; e 원래의프로그램상태에서 university 함수의 glortho 함수문장직전에아래와같은문장을삽입할경우화면의내용이어떻게반복될지, 그림 4와같은방식으로그려라 glscalef05, 05, 10; 힌트 : 앞문제의직교투영변환을잘생각해보고, 이크기변환이직교투영에어떤영향을미치는지를생각해볼것 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] = 10; minv[0] = ; minv[15] = 10; 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], 00, 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], 489, p[c i][2]; glmultmatrixfm; draw car; glpopmatrix; glutswapbuffers; a 지금 glmultmatrixfm; 에해당하는기하변환후, gltranslatefp[c i][0], 489, p[c i][2]; 에해당하는기하변환을통하여자동차의 body를세상좌표계로보내주고있다 문맥상행렬 m이나 - 2010 년 4 월 28 일 수 오후 7:00 -

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 5/7 y R90, 0, 1, 0 T-3, 05, 25 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 glulookat00, 00, 100, 100, 00, 100, 00, 10, 00; a 이코드를수행할때적용되는뷰잉변환행렬 M V 의내용을하나의 4행 4열행렬로표현하라 b 원래의코드에서 glulookat*; 문장을아래와같은두문장으로대치하려하는데, 같은내용의그림이그려지도록하기위해서는각문장의인자가무엇이되어야하는지정확히기술하라 glrotatef*, *, *, *; gltranslatef*, *, *; 10 다음 OpenGL 코드를보고 draw object 함수가그려주는네개의물체 OBJ1, OBJ2, OBJ3, 그리고 OBJ4 간에존재하는계층성을이진트리로표현하라 glpushmatrix; glrotatefangle, 00, 10, 00; gltranslatef00, 00, 50; glscalef65, 65, 65; draw objectobj1; glpushmatrix; glrotatef100*angle, 10, 00, 00; gltranslatef-01, 00, 03; glscalef0025, 0025, 0025; draw objectobj2; glrotatef400*angle, 10, 00, 00; gltranslatef00, 40, 00; glscalef04, 04, 04; draw objectobj3; glpopmatrix; gltranslatef015, 03, 00; glscalef03, 03, 03; 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; glcolor3f10, 10, 10; glpolygonmodegl FRONT AND BACK, GL FILL; // LINE A glbegingl TRIANGLES; glvertex2f-20, -20; glvertex2f00, -20; glvertex2f00, 00; glvertex2f-20, 00; 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; glscalef05, 05, 05; 4 다음은 OpenGL의뷰잉변환에관한문제이다 아래에주어진어떤 display callback 함수의내용을보고답하라 여기서 glutwireteapot20; 문장은원점을중심으로적절한크기의주전자를그려주는역할을한다 void displayvoid { glclearcolor10, 10, 10, 10; glcleargl COLOR BUFFER BIT; glcolor3f10, 00, 00; glpolygonmodegl FRONT AND BACK, GL FILL; glmatrixmodegl PROJECTION; glloadidentity; gluperspective340, 10, 05, 10000; - 2009 년 4 월 25 일 토 오후 1:00 -

서강대학교공과대학컴퓨터공학과 CSE4170 기초컴퓨터그래픽스중간고사 3/8 glmatrixmodegl MODELVIEW; glloadidentity; glulookat00, 00, 100, 100, 00, 100, 00, 10, 00; gltranslatef100, 00, 100; glutwireteapot20; glflush; e 원래의코드를수행시키면그림 3과같은그림이그려진다 이코드의 glulookat*; 문장의마지막세인자 00, 10, 00을 00, 00, 10로대치하면어떻게그림이그려질까? a 위코드를수행할때적용되는뷰잉변환행렬 M V 의내용을기술하라 b 원래의코드에서 glulookat*; 문장을아래와같은두문장으로대치하려하는데, 같은내용의그림이그려지도록하기위해서는각문장의인자가무엇이되어야하는지정확히기술하라 glrotatef*, *, *; gltranslatef*, *, *; c 뷰잉변환은세상좌표계에서카메라의프레임을위치시키는것에대응된다 만약바로위의문제에서와같은상태에서카메라프레임을하나의물체라가정한후, 세상좌표계에서이물체를 x w 축방향으로 30만큼이동을시켰다면, 이때의뷰잉변환은 gltranslatef30, 00, 00; 또는 gltranslatef-30, 00, 00; 문장중하나를바로위문제의두문장의적절한위치에삽입하면된다 과연어떻게하면되는가? 이문제는위문제의정답을기술한사람만풀것 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에서 gluperspective600, 10, 50, 100; 과같은문장을수행할경우계산되는투영변환행렬 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 mvcarcpp page 1 1 #include <stdioh> 2 #include <mathh> 3 #include <GL/gluth> 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 17 51 #define ww 10 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-05, 0, ww; // rad = 17, ww = 10 60 glrotatef720*i, 00, 00, 10; 61 draw_nut; // draw nut object 62 glpopmatrix; 63 64 65 66 #define TO_DEG 5729579 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-39, -35, 45; 100 draw_wheel_and_nut00; // wheel 0 101 glpopmatrix; 102 103 glpushmatrix; 104 gltranslatef39, -35, 45; 105 draw_wheel_and_nut00; // wheel 1 106 glpopmatrix; 107 108 glpushmatrix; 109 gltranslatef-39, -35, -45; 110 glscalef10, 10, -10; 111 draw_wheel_and_nut00; // wheel 2 112 glpopmatrix; 113 114 glpushmatrix; 115 gltranslatef39, -35, -45; 116 glscalef10, 10, -10; 117 draw_wheel_and_nut00; // 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 13 printed at 4/20/103, 23:01

filename mvcarcpp 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-150, 200, 400, path[cur_i][0], 489, path[cur_i][2], 00, 10, 00; 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], 489, 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 < 00 dist *= -10; 187 glutpostredisplay; 188 189 190 191 192 void reshapeint width, int height { 193 glviewport0, 0, width, height; 194 195 glmatrixmodegl_projection; 196 glloadidentity; 197 gluperspective300, width/double height, 10, 1500; 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 13 printed at 4/20/103, 23:01

CSE4170 כ 1/6 [CSE4170: ] : כ כ 1 כ OC, CC, EC, MC, NDC, WC, WdC OpenGL a 30, 60, 90, 20 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 -30, 05, 25, 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 = -450 r angle = 00, 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 = 00 glrotatefr angle,0,0,1; fori = 0; i < 16; i++ { glpushmatrix; glrotatefa, 00, 00, 10; draw ARM; glpushmatrix; gltranslatef00, 60, 00; // B glrotatefr angle, 00, 00, 10; glrotatef-225*i,00, 00, 10; // C glscalef012, 012, 012; draw CAR; glpopmatrix; glpopmatrix; glpopmatrix; void render3void { glcleargl COLOR BUFFER BIT; glmatrixmodegl MODELVIEW; glloadidentity; // c angle = -450 glrotatefc angle, 00, 10, 00; gltranslatef-250, 10, -250; 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-500, 500, -500, 500, -10, 10; 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; glvertex2f05, 05; glvertex2f-05, 05; glvertex2f-05, -05; glvertex2f05, -05; glend; void draw crossvoid { glbegingl LINES; glvertex2f-05, 00; glvertex2f05, 00; glvertex2f00, -05; glvertex2f00, 05; 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; gltranslatef500, 500, 00; glscalef500, 500, 10; 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 = 00; M1,0 = y[0]; M1,1 = y[1]; M1,2 = y[2]; M1,3 = 00; M2,0 = z[0]; M2,1 = z[1]; M2,2 = z[2]; M2,3 = 00; M3,0 = 00; M3,1 = 00; M3,2 = 00; M3,3 = 10; #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 mvcarcpp page 1 1 #include <stdioh> 2 #include <mathh> 3 #include <GL/gluth> 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 17 51 #define ww 10 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-05, 0, ww; // rad = 17, ww = 10 60 glrotatef720*i, 00, 00, 10; 61 draw_nut; // draw nut object 62 glpopmatrix; 63 64 65 66 #define TO_DEG 5729579 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-39, -35, 45; 100 draw_wheel_and_nut00; // wheel 0 101 glpopmatrix; 102 103 glpushmatrix; 104 gltranslatef39, -35, 45; 105 draw_wheel_and_nut00; // wheel 1 106 glpopmatrix; 107 108 glpushmatrix; 109 gltranslatef-39, -35, -45; 110 glscalef10, 10, -10; 111 draw_wheel_and_nut00; // wheel 2 112 glpopmatrix; 113 114 glpushmatrix; 115 gltranslatef39, -35, -45; 116 glscalef10, 10, -10; 117 draw_wheel_and_nut00; // 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 13 printed at 4/20/103, 23:01

filename mvcarcpp 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-150, 200, 400, path[cur_i][0], 489, path[cur_i][2], 00, 10, 00; 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], 489, 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 < 00 dist *= -10; 187 glutpostredisplay; 188 189 190 191 192 void reshapeint width, int height { 193 glviewport0, 0, width, height; 194 195 glmatrixmodegl_projection; 196 glloadidentity; 197 gluperspective300, width/double height, 10, 1500; 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 13 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 = 008, intensity2 = 08; 02 RtColor opacity1 = {03, 03, 03; 03 char *txtname = "redchecker"; 04 RiBeginRI NULL; 05 RiFormat480, 360, 1; 06 RiPixelSamples2, 2; 07 RiFrameBegin1; 08 RiDisplay"3spherestif", "file", "rgba", RI NULL; 09 RiProjection"perspective", "fov", &fov, RI NULL; 10 RiRotate-1100, 1, 0, 0; 11 RiTranslate00, -20, 80; 12 RiWorldBegin; 13 RiLightSource"ambientlight", "intensity", &intensity1, RI NULL; 14 RiAttributeBegin; 15 RiTranslate-225, 00, 20; 16 RiColorsphcolor1; 17 RiSphere10, -10, 10, 3600, RI NULL; 18 RiAttributeEnd; 19 RiAttributeBegin; 20 RiTranslate00, 00, 20; 21 RiColorsphcolor2; 22 RiShadingRate025; 23 RiShadingInterpolation"constant"; 24 RiSurface"screen", "Ka", &Ka2, "Kd", &Kd2; 25 RiSphere10, -10, 10, 3600, 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, 00, 10, 00; 03 gltranslatef00, 00, 50; 04 glscalef65, 65, 65; 05 draw cow; // draw object A 06 glpushmatrix; 07 glrotatef100*angle, 10, 00, 00; 08 gltranslatef-01, 00, 03; 09 glscalef0025, 0025, 0025; 10 draw box; // draw object C 11 glpushmatrix; 12 glrotatef400*angle, 10, 00, 00; 13 gltranslatef00, 40, 00; 14 glscalef04, 04, 04; 15 draw box; // draw object D 16 glpopmatrix; 17 glpopmatrix; 18 gltranslatef015, 03, 00; 19 glscalef03, 03, 03; 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; OUTposition= mulmodelviewproj, position; // line a OUTp = mulmodelview, position; OUTn = mulmodelviewit, normalxyz; 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; glcolor3f10, 00, 00; glvertex3f-50, 00, 00; glvertex3f50, 00, 00; glcolor3f00, 10, 00; glvertex3f00, -50, 00; glvertex3f00, 50, 00; glcolor3f00, 00, 10; glvertex3f00, 00, -50; glvertex3f00, 00, 50; 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 = 00; M1,0 = y[0]; M1,1 = y[1]; M1,2 = y[2]; M1,3 = 00; M2,0 = z[0]; M2,1 = z[1]; M2,2 = z[2]; M2,3 = 00; M3,0 = 00; M3,1 = 00; M3,2 = 00; M3,3 = 10; 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 = EnvironmentTickCount /5000F; deviceclearclearflagstarget, ColorBisque, 10F, 0; devicebeginscene; devicetransformworld = MatrixRotationYangle; devicetransformview = MatrixLookAtLHnew Vector30, 05F, -3, new Vector30, 05F, - 2005 4 22 7:00 -

43-170 5/5 0, new Vector30, 1, 0; devicetransformprojection = MatrixPerspectiveFovLHfloat MathPI/40F, 10F, 10F, 50F; devicesetstreamsource0, vertices, 0; devicedrawprimitives PrimitiveTypeTriangleList, 0, 1; deviceendscene; devicepresent; 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; glvertex2f05, 05; glvertex2f05, -05; glvertex2f-05, -05; glvertex2f-05, 05; glend; void practice modevoid { glpushmatrix; gltranslatef2500, 2500, 00; glscalef1000, 1000, 10; glrotatefangle e, 00, 00, 10; glpushmatrix; /* A */ glscalef10, 01, 10; glcolor3f00, 10, 00; draw box glpopmatrix; glpushmatrix; gltranslatef-05, 00, 00; glrotatefangle l, 00, 00, 10; gltranslatef-02, 00, 00; glscalef05, 015, 10; glcolor3f10, 00, 00; draw box; glpopmatrix; glpushmatrix; /* B */ gltranslatef05, 00, 00; glrotatefangle r, 00, 00, 10; gltranslatef02, 00, 00; glscalef05, 015, 10; glcolor3f00, 00, 10; 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; glrotatef900, 10, 00, 00; gltranslatef-100, 00, 00; 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 = EnvironmentTickCount /5000F; devicetransformworld = MatrixRotationYangle; devicetransformview = MatrixLookAtLHnew Vector30, 05F, -3, new Vector30, 05F, 0, new Vector30, 1, 0; devicetransformprojection = MatrixPerspectiveFovLHfloat MathPI/40F, 10F, 10F, 50F; protected void Render { deviceclearclearflagstarget, ColorBisque, 10F, 0; devicebeginscene; SetupMatrices; devicesetstreamsource0, vertices, 0; devicedrawprimitives PrimitiveTypeTriangleList, 0, 1; deviceendscene; devicepresent; 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 -