lecture 7 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Lecture #7 PowerPoint Presentation
Download Presentation
Lecture #7

Loading in 2 Seconds...

play fullscreen
1 / 47

Lecture #7 - PowerPoint PPT Presentation


  • 238 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Lecture #7' - walden


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
lecture 7

Lecture #7

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

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

1. 어파인 변환

2. 회전, 이동, 크기변환

3. 동차 좌표계에서의 변환

4. 변환의 연결

5. 변환의 구현

6. 예제 -회전 입방체 그리기

affine transformation
어파인 변환(Affine Transformation)
  • 변환
  • 선형변환

P = f (P)

P = f (P1 + P2) =  f( P1) +  f(P2)

정점들의

선형조합

변환된 정점들의

선형조합

선형 변환의 중요성 : 정점만 변환해도 됨

slide5
어파인 변환의 행렬 표현

P = f (P)

P = M P

v = M v

v = f (v)

어파인 변환 : 4째 행이 [0 0 0 1]의 값을 가짐

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

Projective

Affine

slide7
기본적인 어파인 변환
  • 이동(Translation)
  • 회전(Rotation)
  • 크기변환(Scaling)
  • 밀림(Shearing)
translation
이동(Translation)
  • p’ = p + d

이차원 이동 변환의 행렬 표현

(b)

rotation
회전(Rotation)

이차원 회전 변환의 행렬 표현

회전의 중심 : 원점

fixed point
고정점(fixed point)
  • 변환의 고정점 : 변환에 의해 변경되지 않는 점
    • 회전 변환의 고정점은 원점
  • 2차원 회전은 z축에 대한 3차원 회전과 동일

회전하기 전에 먼저 고정점을 원점으로 이동해야 함

고정점

slide11
3D 회전
  • 고정점 Pf
  • 각도 
  • 회전 중심축 v
scaling 1
크기변환(Scaling) (1)
  • 크기변환 : 비강체(non-rigid-body) 변환
scaling 11
크기변환(Scaling) (1)
  • 크기 변환의 고정점 : 원점

비균일

크기변환

이차원 크기변환의 행렬 표현

균일 크기변환

reflection
반사 변환(Reflection)
  • 일종의 크기변환
shearing
밀림(Shearing)

x 밀림 변환

x 밀림 변환의 행렬 표현

y 밀림 변환의 행렬 표현

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

동차 좌표를 사용함으로써 행렬의 곱셈으로 표현

slide20
동차 좌표계에서의 회전 (1)
  • 원점을 고정점으로 하고 세가지 축을 중심으로 하는 회전을 정의할 수 있음
  • z-축 중심으로 회전
slide21
동차 좌표계에서의 회전 (2)
  • x-축 중심으로 회전
  • y-축 중심으로 회전
slide22
동차 좌표계에서의 회전 (3)
  • 회전의 역변환

 R() : 직교 행렬(Orthogonal Matrix)

transformation concatenation
변환의 연결 (Transformation Concatenation)
  • q = C ( B ( A p ) ) = C B A p
  • q = M p , where M = C B A
  • 많은 정점에 효율적
  • 파이프라인 구조에 적합
slide25
변환 연결 - 고정점에 대한 회전 (1)
  • 원점에 고정점이 정의된 변환
    • 회전, 크기 변환, 밀림

 원점이 아닌 점이 고정점인 경우는?

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

1) z축에 대한 회전

slide28
변환 연결 - 일반적인 회전 (2)

2) y축에 대한 회전

(b)

(a)

slide30
변환 연결 - 임의의 축에 대한 회전

1. Po 를 원점으로 옮김

2. u 를 z-축과 일치시킴

3. z-축 중심으로  만큼 회전

4. 2번 역순

5. 1번 역순

instance

효율적인 구성 방법

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

사면체의 한 사례

slide33

CTM

정점들

정점들

변환의 구현
  • 현재 변환 행렬 (CTM)
    • 파이프라인의 일부
    • 시스템 상태의 일부

C  I 단위 행렬로 초기화 (C = CTM)

C  CT

C  CS 이동, 크기, 회전 변환을 곱함으로써 수정

C  CR

opengl 1

정점들

정점들

모델-관측

투영

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);

opengl 2
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)
slide36
회전하는 입방체 그리기
  • 3차원 객체 정의
  • 모델링
  • 카메라 프레임으로 변환
  • 절단
  • 투영
  • 은면 제거
  • 래스터화
slide37
입방체의 모델링
  • 정점의 정의

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();

  • 다른 다섯 면도 같은 방법으로 정의할 수 있다
slide38
내향면과 외향면
  • 다각형의 정점들을 정의하는 순서에 의해서 면의 방향을 정의
  • 오른손 법칙
slide39
입방체의 데이터 구조
  • 위상을 표현할 수 있는 데이터 구조
slide40
색 입방체 (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]);

각 정점마다 색을 지정하고 다각형 내부는 정점들의 색을 보간

slide41
색 입방체 (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);

}

bilinear interpolation
쌍일차 보간(bilinear interpolation)

참고 : 양선형 보간이라 번역하기도 함

scan line interpolation
주사선 보간(scan-line interpolation)
  • 주사선보간
    • 이차원으로 투영된 후에 보간
slide44
#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)
slide45
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)
slide46
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)
slide47
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)