계층적 , 객체지향적 그래픽스 최 수 미 [email protected] sejong.ac.kr/~smchoi

35
1 컴컴컴 컴컴컴컴 컴컴 컴컴컴 , 컴컴컴컴컴 컴컴컴컴 컴 컴 컴 [email protected] http://www.sejong.ac.kr/~smchoi

Upload: olympia-clarke

Post on 15-Mar-2016

100 views

Category:

Documents


6 download

DESCRIPTION

계층적 , 객체지향적 그래픽스 최 수 미 [email protected] http://www.sejong.ac.kr/~smchoi. 모델링. 실세계. 모델. 예 : 뉴턴의 법칙. 기하학적 모델. 형상. 네 가지 접근방법 1. 기본요소를 이용해서 구성 2. 절차적 모델링 예 ) 유한상태 오토마타 , 프랙탈 3. 물리기반 예 ) 입자 시스템 (particle system) 4. 해석적 기술방법 예 ) 곡선 , 곡면 , 입체. 기호와 사례. 기호 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

1

컴퓨터 그래픽스 강좌

계층적 , 객체지향적그래픽스

최 수 미[email protected]

http://www.sejong.ac.kr/~smchoi

Page 2: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

2

컴퓨터 그래픽스 강좌

실세계 모델예 : 뉴턴의 법칙

형상 기하학적모델

• 모델링

Page 3: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

3

컴퓨터 그래픽스 강좌

• 네 가지 접근방법

1. 기본요소를 이용해서 구성

2. 절차적 모델링예 ) 유한상태 오토마타 , 프랙탈

3. 물리기반예 ) 입자 시스템 (particle system)

4. 해석적 기술방법예 ) 곡선 , 곡면 , 입체

Page 4: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

4

컴퓨터 그래픽스 강좌 기호와 사례• 기호

– 그래픽 라이브러리의 기본요소들( 다각형 , 직선 , 입방체 , 원기둥 , …)

– 폰트– 각 응용에 따른 그래픽 객체들

기본적인 구성요소

Page 5: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

5

컴퓨터 그래픽스 강좌

• 사례 변환

M = T R S

모델좌표계 세계좌표계

Page 6: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

6

컴퓨터 그래픽스 강좌

glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef( ... );glRotatef( ... );glScalef( ... );glutSolidCylinder( ... ); /* 또는 다른 기호 */

Page 7: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

7

컴퓨터 그래픽스 강좌

• 각 기호는 자신의 식별자를 가질 수 있음• 객체를 그리기 위한 정보를 포함 그러나 객체들 사이의 관계는 포함하지 않음

Symbol Scale Rotate Translate

12311...

Sx, Sy, Sz

x, y, z dx, dy, dz

기호 - 사례 변환표

Page 8: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

8

컴퓨터 그래픽스 강좌

• 예

• 표현해야 할 것 :1. 기하학적 관계2. 물리적 제약3. 동일 객체의 다중 사례

계층적 모델

Page 9: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

9

컴퓨터 그래픽스 강좌

• 계층적 표현을 사용하면 애니메이션이 용이

Page 10: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

10

컴퓨터 그래픽스 강좌

• 좋지 않은 방법 – 구성요소 사이의 관계가 표현되지 않음

main(){

float s = ...; /* 속도 */float d[3] = ... ; /* 방향 */draw_right_front_wheel(s, d);draw_left_front_wheel(s, d);draw_right_rear_wheel(s, d);draw_left_rear_wheel(s, d);draw_chassis(s, d);

}

Page 11: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

11

컴퓨터 그래픽스 강좌

• 트리에 의해서 표현된 관계

• 단말 노드는 기호의 사례들• 노드는 객체를 그리는 방법에 대한 정보를 포함

Page 12: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

12

컴퓨터 그래픽스 강좌

• 방향성 비순환 그래프 (Directed Acyclic Graph, DAG)에 의해서 표현된 관계

• 바퀴의 각 사례에 대한 위치 정보를 각 노드나 간선에 저장할 수 있다

Page 13: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

13

컴퓨터 그래픽스 강좌 로봇 팔

기저 아래 팔 위 팔

Page 14: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

14

컴퓨터 그래픽스 강좌

)(yR

)0,,0( 1hT

)(zR

)(zR

)0,,0( 2hT

기저부의 높이

아래쪽 팔 높이

Page 15: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

15

컴퓨터 그래픽스 강좌

display ( ) {glRotate (, 0, 1, 0);base( );glTranslate (0, h1, 0);glRotate (, 0, 0, 1);lower-arm ( );glTranslate (0, h2, 0);glRotate (, 0, 0, 1);upper-arm ( );

}

Page 16: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

16

컴퓨터 그래픽스 강좌

Page 17: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

17

컴퓨터 그래픽스 강좌

• 자료구조

세계

기저

아래 팔

위 팔

)(yR

)()0,,0( 1 zRhT

)()0,,0( 2 zRhT

•노드가 표현하는 객체를 그릴 함수 포인터

•부모노드에 대한 상대적인 위치 , 크기 방향을 지정하는 동차좌표 행렬

•노드의 자식을 가리키는 포인터

Page 18: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

18

컴퓨터 그래픽스 강좌

• 인물 표현

트리와 순회

Page 19: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

19

컴퓨터 그래픽스 강좌

• 트리 표현

Page 20: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

20

컴퓨터 그래픽스 강좌

• 변환행렬이 기술된 트리

• 렌더링 = 트리 순회 ( 깊이 우선 탐색 )

Page 21: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

21

컴퓨터 그래픽스 강좌

• 구현

– 모델관측행렬에 대한 연산들만으로는 충분치 않다– 트리 순회를 지원하기 위한 방법이 필요하다

•행렬 스택•푸시 / 팝•glPushMatrix, glPopMatrix

– 속성•속성 스택•푸시 / 팝•glPushAttrib, glPopAttrib

Page 22: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

22

컴퓨터 그래픽스 강좌

figure(){

glPushMatrix();torso();glTranslateglRotate3head();glPopMatrix();glPushMatrix();glTranslateglRotate3left_upper_arm();

glTranslateglRotate3left_lower_arm();glPopMatrix();glPushMatrix();glTranslateglRotate3right_upper_arm();glPopMatrix();glPushMatrix(); . ..

Page 23: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

23

컴퓨터 그래픽스 강좌

Page 24: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

24

컴퓨터 그래픽스 강좌

• 8.4 절 트리 순회 방법의 문제점 – 특정 응용에 의존적 , 확장하거나 동적 사용이 어려움 , 모델

구축과 렌더링 사이에 분명한 구분이 없음

• 계층구조를 표현하고 모델에 독립적인 순회 알고리즘을 사용

– 표준적인 트리 자료 구조 사용– Left-child right-sibling 구조 사용

트리 자료 구조의 사용

자식들

루트형제들

Page 25: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

25

컴퓨터 그래픽스 강좌

• 노드 구조

typedef struct treenode{

Glfloat m[16]; /* 4*4 의 동차좌표행렬 , 열우선순위 */Void (*f) (); /* 그래픽스 기본 요소를 포함하는 함수 */

struct treenode *sibling; /* 형제 노드에 대한 포인터 */struct treenode *child; /* 가장 왼쪽의 자식 포인터 */

};

treenode torso_node, head_node, lua_node, rua_node, lll_node, rll_node, lla_node, rla_node, rul_node, lul_node;

Page 26: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

26

컴퓨터 그래픽스 강좌

• 루트인 몸통에 대한 트리 노드 구축

glLoadIdentity();glRotatef(theta[0], 0.0, 1.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX,torso_node.m);torso_node.f = torso;torso_node.sibling = NULL;torso_node.child = &head_node;

Page 27: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

27

컴퓨터 그래픽스 강좌

• 왼쪽 위 팔에 대한 트리 노드 구축

glLoadIdentity();glTranslatef(-(TORSO_RADIUS+UPPER_ARM_RADIUS), 0.9*TORSO_H

EIGHT, 0.0);glRotatef(theta[3], 1.0, 0.0, 0.0);glGetFloatv(GL_MODELVIEW_MATRIX,lua_node.m);lua_node.f = left_upper_arm;lua_node.sibling = &rua_node;lua_node.child = &lla_node;

Page 28: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

28

컴퓨터 그래픽스 강좌

• 트리의 전위 순회 (pre-order traversal)

void traverse(treenode* root){

if(root==NULL) return; glPushMatrix(); /* 상태 저장 */

glMultMatrixf(root->m); root->f(); /* 변경된 행렬이 자식들에게 전달 */

if(root->child!=NULL) traverse(root->child); glPopMatrix(); /* 형제들에게는 변경된 행렬이 전달되지 않도록 함 */

if(root->sibling!=NULL) traverse(root->sibling);}

Page 29: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

29

컴퓨터 그래픽스 강좌

• 디스플레이 콜백 - 순회 방식이 특정 트리에 독립적이므로 다음과 같은 포괄적인

디스플레이 콜백 사용 가능

void display(void){

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();

traverse(&torso_node);

glutSwapBuffers();}

Page 30: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

30

컴퓨터 그래픽스 강좌 • 마우스 콜백

void mouse(int btn, int state, int x, int y){

if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) {

theta[angle] += 5.0; if( theta[angle] > 360.0 ) theta[angle] -= 360.0;

}if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {

theta[angle] -= 5.0; if( theta[angle] < 360.0 ) theta[angle] += 360.0;

}glPushMatrix();switch(angle){

case 0 :glLoadIdentity(); glRotatef(theta[0], 0.0, 1.0, 0.0);

glGetFloatv(GL_MODELVIEW_MATRIX,torso_node.m);break;

…}

glPopMatrix(); glutPostRedisplay();

}

Page 31: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

31

컴퓨터 그래픽스 강좌

• 동적 노드 생성 - 대화식으로 변하는 구조들을 생성하기 위해서는 동적인

접근 사용- 인물들을 편집하거나 부분들을 더하기 위해서

typedef treenode* tree_ptr;

tree_prt torso_ptr;

torso_ptr = malloc(sizeof(treenode));

Page 32: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

32

컴퓨터 그래픽스 강좌

• 예제 - 로봇 팔

– 로봇 팔의 위치와 관절 각들의 관계 :

운동학 (kinematics) 모델

역운동학 (inverse kinematics) 모델

c.f. 장애물 회피

)(p f

)p(f

애니메이션

Page 33: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

33

컴퓨터 그래픽스 강좌

• 주 프레임 애니메이션 (key-frame animation)

• 중간 삽입 (in-betweening)• 포핑 (morphing) = 형상의 중간삽입

t

각도

t1 t2

Page 34: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

34

컴퓨터 그래픽스 강좌

• 장면 = 객체들 + 조명 + 카메라• 장면의 표현 장면 그래프 (scene graph)

• 예

장면 그래프

Page 35: 계층적 ,  객체지향적 그래픽스 최 수 미 smchoi@sejong.ac.kr sejong.ac.kr/~smchoi

35

컴퓨터 그래픽스 강좌

• Open Inventor(OpenGL 의 상위에 구축된 객체지향적 API) 에서 장면그래프가 사용된다 .

• Inventor 프로그램 : 장면 트리의 기술

• 프로그램의 실행 : 트리의 순회

• 장면 그래프는 객체지향 패러다임과 조화를 이룸– 기본요소 , 속성 , 변환들을 객체로 간주할 수 있고

이들을 다루는 클래스를 정의할 수 있다 .– 복잡한 장면을 미리 정의한 객체들을 사용하여

간단히 구축할 수 있다 .