3차원 물체 그리기.

Slides:



Advertisements
Similar presentations
10-7 부동소수점 (Floating-Point) 계산  컴퓨터에서 숫자를 표기하는 방법  가수 (Fraction) : 부호화된 고정소수점 숫자 지수 (Exponent) : 소수점의 위치를 표시 ( 예 )10 진수 를 표기하면 Fraction Exponent.
Advertisements

2. 속력이 일정하게 증가하는 운동 Ⅲ.힘과 운동 2.여러 가지 운동. 도입 Ⅲ.힘과 운동 2. 여러 가지 운동 2. 속력이 일정하게 증가하는 운동.
1. 도형의 연결 상태 2. 꼭지점과 변으로 이루어진 도형 Ⅷ. 도형의 관찰 도형의 연결상태 연결상태가 같은 도형 단일폐곡선의 성질 연결상태가 같은 입체도형 뫼비우스의 띠.
1.3.1 원의 방정식. 생각해봅시다. SK 텔레콤에서는 중화동에 기지국을 세우려고 한다. 이 기지국은 중화고, 중화우체국, 뚝방에 모두 전파를 보내야 한다. 기지국은 어디에 세워야 할까 ? 중화동의 지도는 다음과 같다 원의 방정식.
수학을 통해 배우는 IT 과학의 세계 전북대: 한상언 교수.
School of Computer, Information and Communication Engineering
Chapter 3. 뷰잉(Viewing).
5. 좌표변환과 OpenGL행렬 이론.
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Lecture #8 제 5 장. 관측(viewing).
Entity Relationship Diagram
공차 및 끼워맞춤.
제 9 장 구조체와 공용체.
사원수 (Quaternion)
1장 – 그래픽스 시스템과 모델 2장 – 그래픽스 프로그래밍 3장 – 입력과 상호작용 4장 – 기하학적 객체와 변환 5장 관측
학습목표 7장. 투상변환과 뷰포트변환 평행투상과 원근투상의 차이점을 이해한다. 가시부피 설정방식을 이해한다.
7장. 투상변환과 뷰포트변환 학습목표 평행투상과 원근투상의 차이점을 이해한다. 가시부피 설정방식을 이해한다.
학습목표 7장. 투상변환과 뷰포트변환 평행투상과 원근투상의 차이점을 이해한다. 가시부피 설정방식을 이해한다.
질의 사항 Yield Criteria (1) 소재가 평면응력상태에 놓였을 때(σ3=0), 최대전단응력조건과 전단변형에너지 조건은σ1 – σ2 평면에서 각각 어떤 식으로 표시되는가? (2) σ1 =σ2인 등이축인장에서 σ = Kεn로 주어지는 재료의 네킹시 변형율을 구하라.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
멀티미디어 시스템 (아날로그 이미지,신호를 디지털로 변환 방법) 이름 : 김대진 학번 :
23장. 구조체와 사용자 정의 자료형 2.
행렬 기본 개념 행렬의 연산 여러가지 행렬 행렬식 역행렬 연립 일차 방정식 부울행렬.
컴퓨터 프로그래밍 : 실습3 2장 데이터와 식.
11장. 1차원 배열.
3차원 객체 모델링.
제4장 제어 시스템의 성능.
10강. JSP 본격적으로 살펴보기-II 스크립트릿, 선언, 표현식 지시자 주석 Lecturer Kim Myoung-Ho
Open GL GLUT 라이브러리 국내 관련사이트 다운받으세요.
Chapter03 캔버스(1) HTML5 Programming.
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
CHAP 5. 레이아웃.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
Clipping 이진학.
정다면체, 다면체와 정다각형, 다각형의 관계 한림초등 학교 영제 6학년 5반 송명훈.
다면체 다면체 다면체: 다각형인 면만으로 둘러싸인 입체도 형 면: 다면체를 둘러싸고 있는 다각형
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
CAD 실습 2013년 2학기.
균형이진탐색트리 이진 탐색(binary search)과 이진 탐색 트리(binary search tree)와의 차이점
Real time Interaction HyoungSeok Kim
MATLAB Image Processing Toolbox
Window, Viewport Window, Viewport.
2장. 일차원에서의 운동 2.1 평균 속도 2.2 순간 속도 2.3 분석 모형: 등속 운동하는 입자 2.4 가속도
서울대학교 컴퓨터공학부 김명수 행렬과 2차원 변환 서울대학교 컴퓨터공학부 김명수
2장 변형률 변형률: 물체의 변형을 설명하고 나타내는 물리량 응력: 물체내의 내력을 설명하고 나타냄
Chapter 1 단위, 물리량, 벡터.
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
Word2Vec.
Chapter 1 단위, 물리량, 벡터.
3D 프린팅 프로그래밍 03 – 도형 회전 (손잡이컵 만들기) 강사: 김영준 목원대학교 겸임교수.
1. 정투상법 정투상법 정투상도 (1) 정투상의 원리
9 브라우저 객체 모델.
상관계수.
우선 각 평면도에서 점선으로 강조한 직육면체 형상의 피처를 생성한다. 여기서 컴퓨터응용가공산업기사 준비를
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
Ⅳ. 제도의 기초 1. 물체를 나타내는 방법 3) 물체의 표현 방법 (2) 입체도법 지도학급 : 태화중학교 1학년 4반
2014년 가을학기 손시운 지도 교수: 문양세 교수님 행렬과 배열 2014년 가을학기 손시운 지도 교수: 문양세 교수님.
수학10-나 1학년 2학기 Ⅱ.부등식의 영역 3. 부등식의 영역에서 최대, 최소(5/5) 부등식 영역 수업계획 수업활동.
SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
: 3차원에서 입자의 운동 방정식 제일 간단한 경우는 위치만의 함수 : 시간, 위치, 위치의 시간미분 의 함수
7 생성자 함수.
6 객체.
Lecture #6 제 4 장. 기하학적 객체와 변환 (1).
BoardGame 보드게임 따라가기.
Presentation transcript:

3차원 물체 그리기

3차원 물체 그리기 OpenGL의 모델 좌표계에서 지정된 한 점이 스크린에 나타나기까지의 과정

모델링 변환 (Modeling Transformation, Model-view Matrix) 정점(x,y,z)은 원점을 기준으로 표현된 객체의 좌표점이다. 모델을 만들기 위해 사용한 기본 모델(raw model) 좌표계를 관측점(viewpoint)에서 보았을 때 위치(눈을 원점으로 간주)하는 좌표계로 변환한다. 이때 사용되는 행렬은 모델뷰 행렬 이다. 즉, 첫 번째 변환에서는 원점을 기준으로 하는 객체 좌표계(기본 모델 좌표계)의 좌표점을 관측점(눈/카메라)을 원점으로 하는 실세계 좌표계의 한 점으로 변환한다.

2)투영 변환 (Projection Transformation, Projection Matrix) 관측 볼륨에서(viewing volume)에서 벗어난 영역을 제거한다. 따라서 화면에서 볼 수 있는 물체만을 가지게 된다. 관측 볼륨은 관측자 시야에 들어오는 영역을 의미한다.

3)원근감 있는 영역(Perspective Division) 투영 변환에 의해서 정점이 앞에 있는지 뒤에 있는지 3차원에서의 위치가 정해지고 정점들을 정규화된 장치 좌표(normalized device coordinate)로 변환을 한다.

4) 뷰포트 변환(Viewport transformation) 3차원 물체(3D 좌표계)를 보여줄 윈도의 좌표(2D 좌표계)로 변환(랜더링) 한다. => OpenGL은 3차원 상의 정점을 2차원 평면에 나타내기 위해 4개의 변환과정을 거친다. 이들 변환은 4*4 행렬로 되어 있으며 정점의 좌표에 이들 행렬을 곱함으로써 변환을 하게 된다.

일반 변환 함수들 OpenGL에서는 행렬(matrix)에 의해서 변형(transformation)이 표현되고, OpenGL상의 모든 변환(transformation)은 두 개 또는 그 이상의 행렬(matrix)에 의해 나타내어진다. 기본 변환 행렬에 사용되는 함수 void glMatrixMode(GLenum mode); //C Sub glMatrixMode(mode As glMatrixModeConstants) 'VB glMatrixMode()함수는 행렬(matrix) 모드를 설정하는데, 모델 뷰(mmModelView), 투영(mmProjection), 텍스처(mmTexture) 행렬(mmMatrix)중 하나를 결정한다.

glMatrixMode() 함수의 mode인자 행렬 모드를 특정 모드로 설정한 다음 다음에 지정할 변환(투영 설정 또는 이동/회전/크기조절)이 효과를 나타낼 수 있도록 현재의 행렬을 초기화하는 glLoadIdentity() 함수를 사용해야 하며, 투영 모드로 설정한 다음 다시 모델뷰 모드로 설정해야 화면에 그림을 그릴 수 있다. glMatrixMode mmProjection ‘투영모드로 설정한다. glLoadIdentity ‘단위 행렬을 곱한다. glFrustum -1.0, 1.0, -1.0, 1.0, 1.5, 20.0 ‘원근 투영을 설정한다. glMatrixMode mmModelView ‘다시 모델뷰 모드로 설정한다.

일반 변환 함수들-2 현재의 행렬을 4*4 단위행렬로 설정하는 함수 현재 행렬의 16개 값을 m에 대입하는 함수 void glLoadIdentity(void); //C Sub glLoadIdentity() ‘VB 현재 행렬의 16개 값을 m에 대입하는 함수 void glLoadMatrix{fd}(const유형*m); //C Sub glLoadMatrix{fd}(m As 유형) ‘VB 현재의 행렬에 m을 곱한다. C를 현재의 행렬이라고 하며 Cm 이 된다. m은 당연히 스칼라 상수이다. void glMultMatrix{fd}(유형*m) ; //C Sub glMultMatrix{fd}(m As 유형) ‘VB

다양한 변환 모델링변환(Modeling Transformation)과 투영변환(Projection Transformation) 및 뷰포트 변환(Viewport Transformation)

관측 및 모델링 변환 (Viewing and Modeling Transformations) 모델링 변환 : 모델과 물체 자체를 조정하고 다루는 것. 모델뷰 : 원래의 좌표점 데이터와 모델뷰 행렬(Modelview matrix)을 곱하여 새롭게 만든 시계 좌표점(eye coordinate)을 의미한다. 모델링 변환 유형 : 이동(translation), 회전(rotation), 크기조절(scaling).

이동(translate)시키는 행렬 함수 현재의 행렬에 물체를 x, y, z 만큼 이동시키는 행렬을 곱한다. 주어진 x, y, z 로 평행 이동 행렬이 만들어져서 현재 행렬과 곱해진다. 주어진 값만큼 평행 이동한다. void glTranslate{fd}(유형 x, 유형 y, 유형z): //C Sub glTranslate{fd}(x As 유형, y As 유형, z As 유형) ‘VB

회전(rotation)시키는 행렬 함수 현재의 행렬에 물체를 회전시키는 행렬을 곱하며, 회전 각도는 degree 단위이고, 회전 방향은 반시계 방향이다. 회전축에 멀리 있는 객체가 가까이에 있는 객체보다 커다란 궤도로 회전 변환한다. void glRotate{fd}(유형 angle, 유형 x, 유형y, 유형z); //C Sub glRotate{fd}(angle As 유형, x As 유형, y As 유형, z As 유형) ‘VB glRotatef 45, 1, 1, 1 ‘x, y, z, 축으로 (1, 1, 1)을 갖는 벡터에 45도 반시계 방향으로 회전

크기변환(scaleing)시키는 행렬 함수 현재의 행렬에 물체를 확대, 축소, 반전시키는 행렬을 곱한다. 크기 변환 값이 1.0보다 크면 늘어나고, 1.0보다 작으면 줄어들고, 마이너스 값이면 축에 대하여 반사된 모습을 나타낸다. void glScale{fd}(유형 x, 유형y, 유형y); //C Sub glScale{fd}(x As 유형, y As 유형, z As 유형) ‘VB glScalef 2, 1, 2 ‘x,z축으로 두배 확대한다.

모델링 변환 순서 모델링 변환 행렬들은 그려지는 이미지 객체에 설정된 반대순서로 적용된다. 즉, 가장 최근에 지정된 변환이 가장 먼저 적용된다. (a)의 경우 glRotatef ‘회전 헹렬, 두 번째로 적용되는 변환 glTranslatef ‘이동 변환 행렬, 첫 번째로 적용되는 변환 .... ‘그리기 (b)의 경우 glTranslatef ‘이동 변환 행렬, 두 번째로 적용되는 변환 glRotatef ‘회전 헹렬, 첫 번째로 적용되는 변환 .... ‘그리기

관측 변환 관측자(viewer) 또는 카메라의 위치를 결정 관찰자의 위치가 원점에서 -Z축으로 내려다보는 경우 : 원점에 관측점(point of observation)이 위치하면 +Z축은 관찰자의 뒤쪽에 있게 되어 볼 수 없게 되고 Z축의 -쪽만 보이게 될 것이다. 관측 변환(viewing transformation)에 의해서 관측점(point of observation)의 위치와 어떤 방향으로 바라보는가를 원하는 대로 바꿀 수 있다. 관측 변환(viewing transformation)은 반드시 다른 어떤 변환(transformation)보다 먼저 지정되어야 한다. 왜냐하면 현재 작업중인 좌표계 시스템이 시계 좌표(eye coordinate)시스템에 대하여 이동하기 때문이다.

관측 변환 방법-1 관측 변환을 위해 눈(카메라)의 위치와, 방향을 설정(변환)하는 세가지 방법 : 1) 모델링 변환 명령의 사용 관측 변환은 앞의 모델링 변환 함수들을 사용하여 구현할 수 있다. 단지 물체를 축소시키기만 해도 시점을 뒤로 이동하는 것과 같은 효과를 볼 수 있다.

관측 변환 방법-2 2) gluLookAt() 함수의 사용. void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz) ; //C Sub gluLookAt(eyex As GLdouble, eyey As GLdouble, eyez As GLdouble, centerx As GLdouble, centery As GLdouble, centerz As GLdouble, upx As GLdouble, upy As GLdouble, upz As GLdouble) ‘VB gluLookAt() 함수를 사용하지 않은 경우에는 다음과 같은 인자값을 가진 gluLookAt() 함수를 호출한 것과 같다. 즉 이 인자 값이 기본 관측점이 된다. 눈의 위치는(0,0,0)이고, -z 방향을 보고 있으며 y축 1만큼 되는 방향이 관측점의 위쪽 방향으로 설정된다. gluLookAt 0, 0, 0, 0, 0, -100, 0, 1, 0

관측 변환 방법-3 3) 사용자 정의 루틴 사용. 관측점을 변환시키도록 하는 좌표 값 행렬을 곱하는 방법으로 사용자가 임의로 작성하여 적용할 수 있다.

투영 변환(Projection Transformations) 투영은 실제로 시야에 들어오는 범위인 관측 볼륨(viewing volume)과 절단면(clipping plane) 설정으로 정의된다. 관측 볼륨 안에 들어 있는 객체들을 관측면(투영면) z=0인 평면에 그리는 것이다. 투영 종류 : 직교 투영 변환과 원근 투영 직교 투영(orthorgraphic projection) : 간단한 객체를 모델링 => 사람의 위치와 거리에 영향을 받지 않는 정사 투영 원근 투영(perspective projection) : 많은 물체가 여러 공간을 차지하거나 큰 물체가 보는 사람의 관점에 따라 다른 모양을 나타냄을 보여주려고 할 때 사용.

원근 투영(Perspective Projection) 가까운 물체는 크게, 먼 물체는 작게 보이게 하는 변환. void glFrustum(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far); //C Sub glFrustum(left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble, zNear As GLdouble, zFar As GLdouble) 'VB 인자 left는 near평면에서 x최소값이고, right는 x최대값이며, bottom은 y최소값이고, top은 y최대값이 된다. zNear와 zFar값 : 각각 near와 far에 해당되며 모두 양수 값으로 설정해야 하는데, z축을 기준으로 관측자 눈으로부터의 거리를 의미한다. 그리고 이 두면은 모두 z=0인 평면에 평행이며 깊이 버퍼(Z버퍼)에서 랜더링 할 z의 최소값과 최대값을 설정하는 것으로 보면 된다. 즉 z최소값보다 작거나 z최대값보다 크면 즉,너무 가깝거나 멀면 그 객체는 표현되지 않는다.

원근 투영(Perspective Projection)-2 void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar); //C Sub gluPerspective(fovy As GLdouble, aspect As GLdouble, zNear As GLdouble, zFar As GLdouble) 'VB gluPerspective는 glFrustum과 비슷하지만 상하좌우의 값을 설정하는 대신에 y방향의 시선각도(화각)인 fovy(FOV는 Field Of View의 약자)와 종횡비인 aspect를 이용한다는 점이 다르다. 이때의 회전 각도는 관측 각도, 시야 각도로 생각하면 된다. fovy값이 커지면 객체의 크기가 줄어드는데, 시야가 넓어져서 한정된 공간에 그 모든 것을 표현하려면 각 객체의 크기를 줄여야 하는 원리이다. 또한 aspect값이 1이아닌 값이라면 객체가 좌우나 상하로 늘어나서 표현된다.

직교 투영(Orthographic Projection) 직교 투영에서는 점(x,y,z)를 점(x,y,0)로 투영한다. 직교 투영 행렬을 생성하여 현재의 행렬에 곱한다. 다른 변환이 없을 경우 투영 방향은 z축에 평행하게 된다. void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble up,GLdouble near,GLdouble far) ; //C void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top); //C Sub glOrtho(left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble, zNear As GLdouble, zFar As GLdouble) 'VB Sub gluOrtho2D(left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble) 'VB gluOrtho2D 함수는 glOrtho의 near와 far를 각각 -1, 1로 정한 것이다. glOrtho –1,1,-1,1,-1,1 => 한 변의 길이가 2인 정육면체에 그림을 그리겠다고 선언

glOrtho 함수 표현되는 이미지는 z=0인 평면에 만들어지기 때문에 평면 z=0이 near와 far사이에 위치하면 이차원 평면은 관측 공간을 가로지르게 된다. 인자 left,right,top,bottom은 glFrustum과 동일하다. 만일 glOrtho -1,1,-1,1,-1,1라고 정의하면 한 변의 길이가 2인 정육면체에다가 그림을 그리겠다고 선언을 하게 되는 것이다.

(3) 뷰포트 변환(Viewport Transformation) 최종 이미지를 매핑할 윈도우에 픽셀 사각형을 정의한다. 2차원 화면 상에 우리가 그린 물체가 보일 2차원 사각 영역을 설정 윈도우 창에서 우리가 보고 싶은 영역까지만 출력할 수 있게 한다. void glViewport(GLint x, GLint y, GLint width, GLint height); //C Sub glViewport(x As GLint, y As GLint, width As GLsizei, height As GLsizei) 'VB x,y는 좌측 상단 모서리의 좌표값이며 wididth, height는 뷰포트 사각형의 크기이고 초기 뷰포트 값은 (0,0, 폼의Width, 폼의Height) 이다. VisualBasic에서는 폼의 scaleMode 속성에서 정한 단위로 초기의 폼의 높이와 너비간의 비율을 유지하는 scaleWidth와 scaleHeight 속성 값을 glViewport함수의 인자로 설정하여 폼의 크기가 변하더라도 초기의 뷰포트 비율을 그대로 유지하도록 하는 것이 일반적인 방법이다.

행렬 스택의 관리 스택 : last-in first-out 형태의 자료구조 OpenGL은 행렬 스택을 이용하여 현재의 행렬을 보존하고, 필요한 변환 작업을 수행 후, 스택에 보존되었던 행렬을 꺼내어 원래의 좌표계로 복원. void glPushMatrix(void); //C Void glPopMatrix(void); //C Sub glPushMatrix( ) 'VB Sub glPopMatrix( ) 'VB Push : 스택에 이전 행렬을 집어 넣는다. Pop : 스택 최상위에 있는 행렬을 꺼낸다.

클리핑 평면 클리핑 평면 : 잘라내는 면을 뜻하며, 대상 물체에 클리핑 평면을 지정하면 평면의 밖에 있는 부분이 잘려나간다. void glClipPlane(Glenum plane, const Gldouble *equation); //C Sub glClipPlane(plane As glClipPlaneConstants, equation As GLdouble) 'VB 평면의 방정식이 Ax+By+Cz = 0 이라고 할 때, Ax*+By*+Cz* >= 0인 점들만이 표시된다. plane 인자는 클리핑 평면을 지정하는 인덱스로서 cpClipPlanei의 값을 갖는다. 여기서 i = 0 , 1, 2, …. 로서 몇 번째 평면인 가를 나타낸다. equation 인자는 평면을 정의하는 A, B, C, D 값을 가지, 배열로서 표현된다.