1 / 47

Lecture #7

Lecture #7. 제 4 장 . 기하학적 객체와 변환 (2). 강의 내용 (1). 어떻게 기본적인 기하학적 형들을 표현 특정 표현 방식에 독립적인 방식으로 기본적인 기하학적 객체를 표현할 수 있는가 ? 표현 사이의 변환 컴퓨터 그래픽스 = 변환 모델 좌표계  세계 좌표계  카메라 좌표계  이미지 좌표계  장치 좌표계 . 강의 내용 (2). 1. 어파인 변환 2. 회전 , 이동 , 크기변환 3. 동차 좌표계에서의 변환 4. 변환의 연결

walden
Download Presentation

Lecture #7

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lecture #7 제 4 장. 기하학적 객체와 변환 (2)

  2. 강의 내용 (1) • 어떻게 기본적인 기하학적 형들을 표현 • 특정 표현 방식에 독립적인 방식으로 기본적인 기하학적 객체를 표현할 수 있는가? • 표현 사이의 변환 • 컴퓨터 그래픽스 = 변환 • 모델 좌표계  세계 좌표계  카메라 좌표계 이미지 좌표계  장치 좌표계

  3. 강의 내용 (2) 1. 어파인 변환 2. 회전, 이동, 크기변환 3. 동차 좌표계에서의 변환 4. 변환의 연결 5. 변환의 구현 6. 예제 -회전 입방체 그리기

  4. 어파인 변환(Affine Transformation) • 변환 • 선형변환 P = f (P) P = f (P1 + P2) =  f( P1) +  f(P2) 정점들의 선형조합 변환된 정점들의 선형조합 선형 변환의 중요성 : 정점만 변환해도 됨

  5. 어파인 변환의 행렬 표현 P = f (P) P = M P v = M v v = f (v) 어파인 변환 : 4째 행이 [0 0 0 1]의 값을 가짐

  6. 어파인 변환의 종류 • 직선을 보존 • 평행선을 보존 • 대표적인 어파인 변환 • 이동 • 회전 • 크기 변환 • 밀림(shear) Projective Affine

  7. 기본적인 어파인 변환 • 이동(Translation) • 회전(Rotation) • 크기변환(Scaling) • 밀림(Shearing)

  8. 이동(Translation) • p’ = p + d 이차원 이동 변환의 행렬 표현 (b)

  9. 회전(Rotation) 이차원 회전 변환의 행렬 표현 회전의 중심 : 원점

  10. 고정점(fixed point) • 변환의 고정점 : 변환에 의해 변경되지 않는 점 • 회전 변환의 고정점은 원점 • 2차원 회전은 z축에 대한 3차원 회전과 동일 회전하기 전에 먼저 고정점을 원점으로 이동해야 함 고정점

  11. 3D 회전 • 고정점 Pf • 각도  • 회전 중심축 v

  12. 크기변환(Scaling) (1) • 크기변환 : 비강체(non-rigid-body) 변환

  13. 크기변환(Scaling) (1) • 크기 변환의 고정점 : 원점 비균일 크기변환 이차원 크기변환의 행렬 표현 균일 크기변환

  14. 반사 변환(Reflection) • 일종의 크기변환

  15. 밀림(Shearing) x 밀림 변환 x 밀림 변환의 행렬 표현 y 밀림 변환의 행렬 표현

  16. 동차 좌표계에서의 변환 • 이동 • 크기변환 • 회전 • 밀림

  17. 동차 좌표계에서의 이동 동차 좌표를 사용함으로써 행렬의 곱셈으로 표현

  18. 이동 변환의 역

  19. 동차 좌표계에서의 크기변환 • p’=S p 역변환 :

  20. 동차 좌표계에서의 회전 (1) • 원점을 고정점으로 하고 세가지 축을 중심으로 하는 회전을 정의할 수 있음 • z-축 중심으로 회전

  21. 동차 좌표계에서의 회전 (2) • x-축 중심으로 회전 • y-축 중심으로 회전

  22. 동차 좌표계에서의 회전 (3) • 회전의 역변환  R() : 직교 행렬(Orthogonal Matrix)

  23. y (x,y) (x’,y’) q x 동차 좌표계에서의 밀림 b a

  24. 변환의 연결 (Transformation Concatenation) • q = C ( B ( A p ) ) = C B A p • q = M p , where M = C B A • 많은 정점에 효율적 • 파이프라인 구조에 적합

  25. 변환 연결 - 고정점에 대한 회전 (1) • 원점에 고정점이 정의된 변환 • 회전, 크기 변환, 밀림  원점이 아닌 점이 고정점인 경우는? • z-축 중심으로 회전

  26. 변환 연결 - 고정점에 대한 회전 (2) • 변환 연결로 해결

  27. 변환 연결 - 일반적인 회전 (1) • 원점에 대한 임의의 회전은 세 축에 대한 세 번의 연속된 회전으로 구성할 수 있다 1) z축에 대한 회전

  28. 변환 연결 - 일반적인 회전 (2) 2) y축에 대한 회전 (b) (a)

  29. 변환 연결 - 일반적인 회전 (3) 3) x축에 대한 회전

  30. 변환 연결 - 임의의 축에 대한 회전 1. Po 를 원점으로 옮김 2. u 를 z-축과 일치시킴 3. z-축 중심으로  만큼 회전 4. 2번 역순 5. 1번 역순

  31. 효율적인 구성 방법 • 정육면체를 한번만 정의 • 사례 변환을 통하여 각 사례를 생성 변환 연결 - 사례(instance) 변환 • 많은 간단한 객체들로 구성된 장면 사면체의 한 사례

  32. 변환 연결 - 사례(instance) 변환

  33. CTM 정점들 정점들 변환의 구현 • 현재 변환 행렬 (CTM) • 파이프라인의 일부 • 시스템 상태의 일부 C  I 단위 행렬로 초기화 (C = CTM) C  CT C  CS 이동, 크기, 회전 변환을 곱함으로써 수정 C  CR

  34. 정점들 정점들 모델-관측 투영 CTM OpenGL 변환 행렬 (1) • OpenGL의 CTM • 행렬 적재 glLoadIdentity(); glLoadMatrixf(pointer_to_matrix); vx, vy, vz : 회전 중심 벡터 • 회전, 이동, 크기 변환 glRotatef(angle, vx, vy, vz) glTranslatef(dx,dy,dz); glScalef(sx,sy,sz);

  35. OpenGL 변환 행렬 (2) • OpenGL에서 고정점에 대한 회전 glMatrixMode(GL_MODEVIEW) glLoadIdentity(); glTranslatef(4.0,5.0,6.0); glRotatef(45.0,1.0,2.0,3.0); glTranslatef(-4.0,-5.0,-6.0); • 변환순서 • 가장 최근에 지정된 변환이 가장 먼저 적용되는 변환 • C  I • C  T(4.0,5.0,6.0) • C  R(45.0,1.0,2.0,3.0) • C  T(-4.0,-5.0,-6.0) • C = T(4.0,5.0,6.0)R(45.0,1.0,2.0,3.0)T(-4.0,-5.0,-6.0)

  36. 회전하는 입방체 그리기 • 3차원 객체 정의 • 모델링 • 카메라 프레임으로 변환 • 절단 • 투영 • 은면 제거 • 래스터화

  37. 입방체의 모델링 • 정점의 정의 typedef float point[3]; point node[8] ={{-1.0, -1.0, -1.0}, {1.0, -1.0, -1.0}, {1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, 1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}}; • 한면의 정의 glBegin(GL_POLYGON); glVertex3fv(node[0]); glVertex3fv(node[3]); glVertex3fv(node[2]); glVertex3fv(node[1]); glEnd(); • 다른 다섯 면도 같은 방법으로 정의할 수 있다

  38. 내향면과 외향면 • 다각형의 정점들을 정의하는 순서에 의해서 면의 방향을 정의 • 오른손 법칙

  39. 입방체의 데이터 구조 • 위상을 표현할 수 있는 데이터 구조

  40. 색 입방체 (1) typedef GLfloat point[3]; point node[8] ={{-1.0,-1.0,-1.0}, {1.0,-1.0,-1.0}, {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; GLfloat colors[][3] ={{0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0, 1.0, 1.0}}; void quad(int a, int b, int c, int d) { glBegin(GL_POLYGON); glColor3fv(colors[a]); glVertex3fv(node[a]); glColor3fv(colors[b]); glVertex3fv(node[b]); 각 정점마다 색을 지정하고 다각형 내부는 정점들의 색을 보간

  41. 색 입방체 (2) glColor3fv(colors[c]); glVertex3fv(node[c]); glColor3fv(colors[d]); glVertex3fv(node[d]); glEnd(); } void colorcube() { quad(0, 3, 2, 1); quad(2, 3, 7, 6); quad(0, 4, 7, 3); quad(1, 2, 6, 5); quad(4, 5, 6, 7); quad(0, 1, 5, 4); }

  42. 쌍일차 보간(bilinear interpolation) 참고 : 양선형 보간이라 번역하기도 함

  43. 주사선 보간(scan-line interpolation) • 주사선보간 • 이차원으로 투영된 후에 보간

  44. #include <stdio.h> #include <GL/glut.h> Glfloat vertices[][3]={{-1.0,-1.0,1.0}, {1.0,-1.0,-1.0}, {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0}, {1.0,1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; Glfloat normals[][3]={{-1.0,-1.0,-1.0}, {1.0,-1.0,-1.0}, {1.0,1.0,-1.0}, {-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, {1.0,1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; Glfloat colors[][3]={{0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}}; void polygon(int a, int b, int c, int d) {glBegin(GL_POLYGON); glColor3fv(colors[a]); glNormal3fv(normals[a]); glVertex3fv(vertices[a]); glColor3fv(colors[b]); glNormal3fv(normals[b]); glVertex3fv(vertices[b]); glColor3fv(colors[c]); glNormal3fv(normals[c]); glVertex3fv(vertices[c]); glColor3fv(colors[d]); glNormal3fv(normals[d]); glVertex3fv(vertices[d]); glEnd(); } 색 입방체의 회전 (1)

  45. Void colorcube(void) { polygon(0,3,2,1); polygon(2,3,7,6); polygon(0,4,7,3); polygon(1,2,6,5); polygon(4,5,6,7); polygon(0,1,5,4); } static Glfloat theta[] = {0.0,0.0,0.0}; static Glint axis = 2; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glRotatef(theta[0],1.0,0.0,0.0); glRotatef(theta[1],0.0,1.0,0.0); glRotatef(theta[2],0.0,0.0,1.0); colorcube();glFlush();glutSwapBuffers(); } void spincube() {theta[axis] += 2.0;if(theta[axis] > 360.0) theta[axis] -= 360.0; display(); } 색 입방체의 회전 (2)

  46. Void mouse(int btn, int state, int x, int y) {if(btn==GLUT_LEFT_BUTTON & state==GLUT_DOWN) axis = 0;if(btn==GLUT_MIDDLE_BUTTON & state==GLUT_DOWN) axis = 1;if(btn==GLUT_RIGHT_BUTTON & state==GLUT_DOWN) axis = 2; } void myReshape(int w, int h) {glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h) glOrtho(-2.0, 2.0, -2.0*(GLfloat) h / (GLfloat) w, 2.0*(GLfloat) h / (GLfloat) w, -10.0, 10.0);else glOrtho(-2.0*(Glfloat) w / (Glfloat) h, 2.0*(Glfloat) w / (Glfloat) h, -2.0, 2.0, -10.0, 10.0);glMatrixMode(GL_MODELVIEW); } 색 입방체의 회전 (3)

  47. void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500,500); glutCreateWindow(“colorcube”); glutReshapeFunc(myReshape); glutDisplayFunc(display); glutIdleFunc(spinCube); glutMouseFunc(mouse); glutEnable(GL_DEPTH_TEST); glutMainLoop(); } 색 입방체의 회전 (4)

More Related