7 1 torus c include GLglut h stdio

  • Slides: 50
Download presentation

예제 7 -1 디스플레이 리스트 생성하기: torus. c #include <GL/glut. h> <stdio. h> <math.

예제 7 -1 디스플레이 리스트 생성하기: torus. c #include <GL/glut. h> <stdio. h> <math. h> <stdlib. h> #define PI_ 3. 14159265358979323846 GLuint the. Torus; /* 원통을 그린다. */ static void torus(int numc, int numt){ int i, j, k; double s, t, x, y, z, twopi; 2009 -2학기 가상현실 4

twopi = 2 * PI_; for (i = 0; i < numc; i++) {

twopi = 2 * PI_; for (i = 0; i < numc; i++) { gl. Begin(GL_QUAD_STRIP); for (j = 0; j <= numt; j++) { for (k = 1; k >= 0; k--) { s = (i + k) % numc + 0. 5; t = j % numt; x = (1+. 1*cos(s*twopi/numc))*cos(t*twopi/numt); y = (1+. 1*cos(s*twopi/numc))*sin(t*twopi/numt); z =. 1 * sin(s * twopi / numc); gl. Vertex 3 f(x, y, z); } } gl. End(); } } 2009 -2학기 가상현실 5

/* 디스플레이 리스트를 원통형으로 생성하고 상태를 초기화 한다 */ static void init(void) { the.

/* 디스플레이 리스트를 원통형으로 생성하고 상태를 초기화 한다 */ static void init(void) { the. Torus = gl. Gen. Lists (1); gl. New. List(the. Torus, GL_COMPILE); torus(8, 25); gl. End. List(); gl. Shade. Model(GL_FLAT); gl. Clear. Color(0. 0, 0. 0); } 2009 -2학기 가상현실 6

void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT); gl. Color 3 f (1. 0, 1. 0); gl.

void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT); gl. Color 3 f (1. 0, 1. 0); gl. Call. List(the. Torus); gl. Flush(); } void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); 2009 -2학기 가상현실 7

glu. Perspective(30, (GLfloat) w/(GLfloat) h, 1. 0, 100. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load.

glu. Perspective(30, (GLfloat) w/(GLfloat) h, 1. 0, 100. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); glu. Look. At(0, 0, 10, 0, 0, 1, 0); } /* x 누르면 x축 회전, y누르면 y축 회전, I 는 원통형을 처음으로 돌림 */ void keyboard(unsigned char key, int x, int y){ switch (key) { case 'x': case 'X': gl. Rotatef(30. , 1. 0, 0. 0); glut. Post. Redisplay(); break; 2009 -2학기 가상현실 8

case 'y': case 'Y': gl. Rotatef(30. , 0. 0, 1. 0, 0. 0); glut.

case 'y': case 'Y': gl. Rotatef(30. , 0. 0, 1. 0, 0. 0); glut. Post. Redisplay(); break; case 'i': case 'I': gl. Load. Identity(); glu. Look. At(0, 0, 10, 0, 0, 1, 0); glut. Post. Redisplay(); break; case 27: exit(0); break; } } 2009 -2학기 가상현실 9

int main(int argc, char **argv) { glut. Init. Window. Size(200, 200); glut. Init(&argc, argv);

int main(int argc, char **argv) { glut. Init. Window. Size(200, 200); glut. Init(&argc, argv); glut. Init. Display. Mode(GLUT_SINGLE | GLUT_RGB); glut. Create. Window(argv[0]); init(); glut. Reshape. Func(reshape); glut. Keyboard. Func(keyboard); glut. Display. Func(display); glut. Main. Loop(); return 0; } 2009 -2학기 가상현실 10

어떠한 변형을 오브젝트에 적용하고 결과를 그릴 때 gl. New. List(1, GL_COMPILE); draw_some_geometric_objects(); gl. End.

어떠한 변형을 오브젝트에 적용하고 결과를 그릴 때 gl. New. List(1, GL_COMPILE); draw_some_geometric_objects(); gl. End. List(); gl. Load. Matrix(M); gl. Call. List(1); 오브젝트들이 매번 같은 방식으로 변형되는 경우에는 디스플레이 리스트 안에 행렬을 저장하는 것이 성능 개선 gl. New. List(1, GL_COMPILE); gl. Load. Matrix(M); draw_some_geometric_objects(); gl. End. List(); gl. Call. List(1); 2009 -2학기 가상현실 14

static void init (void) { list. Name = gl. Gen. Lists (1); gl. New.

static void init (void) { list. Name = gl. Gen. Lists (1); gl. New. List (list. Name, GL_COMPILE); gl. Color 3 f (1. 0, 0. 0); /* 핸재 컬러는 빨간색 */ gl. Begin (GL_TRIANGLES); gl. Vertex 2 f (0. 0, 0. 0); gl. Vertex 2 f (1. 0, 0. 0); gl. Vertex 2 f (0. 0, 1. 0); gl. End (); gl. Translatef (1. 5, 0. 0); /* 위치를 옮김 */ gl. End. List (); gl. Shade. Model (GL_FLAT); } 2009 -2학기 가상현실 16

static void draw. Line (void) { gl. Begin (GL_LINES); gl. Vertex 2 f (0.

static void draw. Line (void) { gl. Begin (GL_LINES); gl. Vertex 2 f (0. 0, 0. 5); gl. Vertex 2 f (15. 0, 0. 5); gl. End (); } void display(void) { GLuint i; 2009 -2학기 가상현실 17

gl. Clear (GL_COLOR_BUFFER_BIT); gl. Color 3 f (0. 0, 1. 0, 0. 0); /*

gl. Clear (GL_COLOR_BUFFER_BIT); gl. Color 3 f (0. 0, 1. 0, 0. 0); /* 현재 컬러는 초록색 */ for (i = 0; i < 10; i++) /* 10개의 삼각형을 그림 */ gl. Call. List (list. Name); draw. Line (); /* 선의 색이 초록색인가? 아니다. */ /* 선이 어디에 그려졌는가? */ gl. Flush (); } void reshape(int w, int h) { gl. Viewport(0, 0, w, h); gl. Matrix. Mode(GL_PROJECTION); 2009 -2학기 가상현실 18

gl. Load. Identity(); if (w <= h) glu. Ortho 2 D (0. 0, 2.

gl. Load. Identity(); if (w <= h) glu. Ortho 2 D (0. 0, 2. 0, -0. 5 * (GLfloat) h/(GLfloat) w, 1. 5 * (GLfloat) h/(GLfloat) w); else glu. Ortho 2 D (0. 0, 2. 0 * (GLfloat) w/(GLfloat) h, -0. 5, 1. 5); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; } } 2009 -2학기 가상현실 19

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB); glut. Init. Window. Size(650, 50); glut. Create. Window(argv[0]); init (); glut. Reshape. Func (reshape); glut. Display. Func (display); glut. Keyboard. Func (keyboard); glut. Main. Loop(); return 0; } 2009 -2학기 가상현실 20

디스플레이 리스트에 저장할 수 없는 커맨드들 l 클라이언트의 상태를 설정하는 커맨드들이나 상태값을 회수하는 커맨드들은

디스플레이 리스트에 저장할 수 없는 커맨드들 l 클라이언트의 상태를 설정하는 커맨드들이나 상태값을 회수하는 커맨드들은 디스플레이 리스트에 저장할 수 없다. gl. Color. Pointer() gl. Flush() gl. Normal. Pointer() gl. Delete. Lists() gl. Gen. Lists() gl. Pixel. Store() gl. Disable. Client. State() gl. Get*() gl. Read. Pixels() gl. Edge. Flag. Pointer() gl. Index. Pointer() gl. Render. Mode() gl. Enable. Client. State() gl. Interleaved. Arrays() gl. Select. Buffer() gl. Feedback. Buffer() gl. Is. Enabled() gl. Tex. Coord. Pointer() gl. Finish() gl. Is. List() gl. Vertex. Pointer() 2009 -2학기 가상현실 25

예제 7 -3 계층적 디스플레이 리스트에 하나의 도형을 넣고 이 도형의 정점을 쉽게 편집하는

예제 7 -3 계층적 디스플레이 리스트에 하나의 도형을 넣고 이 도형의 정점을 쉽게 편집하는 방법 gl. New. List(1, GL_COMPILE); gl. Vertex 3 fv(v 1); gl. End. List(); gl. New. List(2, GL_COMPILE); gl. Vertex 3 fv(v 2); gl. End. List(); gl. New. List(3, GL_COMPILE); gl. Vertex 3 fv(v 3); gl. End. List(); gl. New. List(4, GL_COMPILE); gl. Begin(GL_POLYGON); gl. Call. List(1); gl. Call. List(2); gl. Call. List(3); gl. End(); gl. End. List(); 2009 -2학기 가상현실 29

예제 7 -5 강조된 폰트를 정의하는 다중 디스 플레이 리스트들: stroke. c #include <GL/glut.

예제 7 -5 강조된 폰트를 정의하는 다중 디스 플레이 리스트들: stroke. c #include <GL/glut. h> #include <stdlib. h> #include <string. h> #define PT 1 #define STROKE 2 #define END 3 typedef struct charpoint { GLfloat x, y; int type; } CP; 2009 -2학기 가상현실 33

CP Adata[] = { { 0, 0, PT}, {0, 9, PT}, {1, 10, PT},

CP Adata[] = { { 0, 0, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 0, STROKE}, {0, 5, PT}, {5, 5, END} }; CP Edata[] = { {5, 0, PT}, {0, 10, PT}, {5, 10, STROKE}, {0, 5, PT}, {4, 5, END} }; CP Pdata[] = { {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT}, {4, 5, PT}, {0, 5, END} }; 2009 -2학기 가상현실 34

CP Rdata[] = { {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5,

CP Rdata[] = { {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT}, {4, 5, PT}, {0, 5, STROKE}, {3, 5, PT}, {5, 0, END} }; CP Sdata[] = { {0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT}, {5, 4, PT}, {4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT}, {5, 9, END} }; 2009 -2학기 가상현실 35

/* draw. Letter() 는 문자와 선 세그먼트들로 표현된 문자들의 배열로부 * 터 명령들을 번역한다.

/* draw. Letter() 는 문자와 선 세그먼트들로 표현된 문자들의 배열로부 * 터 명령들을 번역한다. */ static void draw. Letter(CP *l) { gl. Begin(GL_LINE_STRIP); while (1) { switch (l->type) { case PT: gl. Vertex 2 fv(&l->x); break; 2009 -2학기 가상현실 36

case STROKE: gl. Vertex 2 fv(&l->x); gl. End(); gl. Begin(GL_LINE_STRIP); break; case END: gl.

case STROKE: gl. Vertex 2 fv(&l->x); gl. End(); gl. Begin(GL_LINE_STRIP); break; case END: gl. Vertex 2 fv(&l->x); gl. End(); gl. Translatef(8. 0, 0. 0); return; } l++; } } 2009 -2학기 가상현실 37

static void init (void) { GLuint base; gl. Shade. Model (GL_FLAT); base = gl.

static void init (void) { GLuint base; gl. Shade. Model (GL_FLAT); base = gl. Gen. Lists (128); gl. List. Base(base); gl. New. List(base+'A', GL_COMPILE); draw. Letter(Adata); gl. End. List(); gl. New. List(base+'E', GL_COMPILE); draw. Letter(Edata); gl. End. List(); gl. New. List(base+'P', GL_COMPILE); draw. Letter(Pdata); gl. End. List(); gl. New. List(base+'R', GL_COMPILE); draw. Letter(Rdata); gl. End. List(); gl. New. List(base+'S', GL_COMPILE); draw. Letter(Sdata); gl. End. List(); gl. New. List(base+' ', GL_COMPILE); gl. Translatef(8. 0, 0. 0); gl. End. List(); } 2009 -2학기 가상현실 38

char *test 1 = "A SPARE SERAPE APPEARS AS"; char *test 2 = "APES

char *test 1 = "A SPARE SERAPE APPEARS AS"; char *test 2 = "APES PREPARE RARE PEPPERS"; static void print. Stroked. String(char *s) { GLsizei len = strlen(s); gl. Call. Lists(len, GL_BYTE, (GLbyte *)s); } 2009 -2학기 가상현실 39

3 void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT); gl. Color 3 f(1. 0, 1. 0); gl.

3 void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT); gl. Color 3 f(1. 0, 1. 0); gl. Push. Matrix(); gl. Scalef(2. 0, 2. 0); gl. Translatef(10. 0, 30. 0, 0. 0); print. Stroked. String(test 1); gl. Pop. Matrix(); gl. Push. Matrix(); gl. Scalef(2. 0, 2. 0); gl. Translatef(10. 0, 13. 0, 0. 0); print. Stroked. String(test 2); gl. Pop. Matrix(); gl. Flush(); } 2009 -2학기 가상현실 40

void reshape(int w, int h){ gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix.

void reshape(int w, int h){ gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode (GL_PROJECTION); gl. Load. Identity (); glu. Ortho 2 D (0. 0, (GLdouble) w, 0. 0, (GLdouble) h); } void keyboard(unsigned char key, int x, int y){ switch (key) { case ' ': glut. Post. Redisplay(); break; case 27: exit(0); } } 2009 -2학기 가상현실 41

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE

int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB); glut. Init. Window. Size (440, 120); glut. Create. Window ("stroke"); init (); glut. Reshape. Func(reshape); glut. Keyboard. Func(keyboard); glut. Display. Func(display); glut. Main. Loop(); return 0; } 2009 -2학기 가상현실 42

예제 7 -6 디스플레이 리스트의 실행 후 상태 변화의 지속 gl. New. List(list. Index,

예제 7 -6 디스플레이 리스트의 실행 후 상태 변화의 지속 gl. New. List(list. Index, GL_COMPILE); gl. Color 3 f(1. 0, 0. 0); gl. Begin(GL_POLYGON); gl. Vertex 2 f(0. 0, 0. 0); gl. Vertex 2 f(1. 0, 0. 0); gl. Vertex 2 f(0. 0, 1. 0); gl. End(); gl. Translatef(1. 0, 0. 0); gl. End. List(); gl. Call. List(list. Index); gl. Begin(GL_LINES); gl. Vertex 2 f(1. 0, -1. 0); gl. Vertex 2 f(1. 0, 0. 0); gl. End(); /* 컬러값과 행렬이 변화됨 */ 2009 -2학기 가상현실 45

예제 7 -7 디스플레이 리스트 안에서 상태값 들 복구하기 gl. New. List(list. Index, GL_COMPILE);

예제 7 -7 디스플레이 리스트 안에서 상태값 들 복구하기 gl. New. List(list. Index, GL_COMPILE); gl. Push. Matrix(); gl. Push. Attrib(GL_CURRENT_BIT); gl. Color 3 f(1. 0, 0. 0); gl. Begin(GL_POLYGON); gl. Vertex 2 f(0. 0, 0. 0); gl. Vertex 2 f(1. 0, 0. 0); gl. Vertex 2 f(0. 0, 1. 0); gl. End(); gl. Translatef(1. 5, 0. 0); gl. Pop. Attrib(); gl. Pop. Matrix(); gl. End. List(); 2009 -2학기 가상현실 46

예제 7 -9 모드를 바꾸는 디스플레이 리스트 Gluint offset; offset = gl. Gen. List(3)

예제 7 -9 모드를 바꾸는 디스플레이 리스트 Gluint offset; offset = gl. Gen. List(3) gl. New. List(offset, GL_COMPILE); gl. Disable(GL_LINE_STIPPLE); gl. End. List(); gl. New. List(offset+1, GL_COMPILE); gl. Enable(GL_LINE_STIPPLE); gl. Line. Stipple(1, 0 x 0 F 0 F); gl. End. List(); gl. New. List(offset+2, GL_COMPILE); gl. Enable(GL_LINE_STIPPLE); gl. Line. Stipple(1, 0 x 1111); gl. End. List(); 2009 -2학기 가상현실 48

#define draw. One. Line(x, y 1, x 2, y 2) gl. Begin(GL_LINES);  gl.

#define draw. One. Line(x, y 1, x 2, y 2) gl. Begin(GL_LINES); gl. Vertex 2 f((x 1), (y 1); gl. Vertex 2 f((x 2), (y 2)); gl. End(); gl. Call. List(offset); draw. One. Line(50. 0, 125. 0, 350. 0, 125. 0); gl. Call. List(offset+1); draw. One. Line(50. 0, 100. 0, 350. 0, 100. 0); gl. Call. List(offset+2); draw. One. Line(50. 0, 75. 0, 350. 0, 75. 0); 2009 -2학기 가상현실 49