12 1 4 bezcurve c include GLglut h
예제 12 -1 4개의 제어점을 가지는 베 지어 커브: bezcurve. c #include <GL/glut. h> #include <stdlib. h> GLfloat ctrlpoints[4][3] = { { -4. 0, 0. 0}, { -2. 0, 4. 0, 0. 0}, {2. 0, -4. 0, 0. 0}, {4. 0, 0. 0}}; void init(void){ gl. Clear. Color(0. 0, 0. 0); gl. Shade. Model(GL_FLAT); gl. Map 1 f(GL_MAP 1_VERTEX_3, 0. 0, 1. 0, 3, 4, &ctrlpoints[0][0]); gl. Enable(GL_MAP 1_VERTEX_3); } 2013 -2학기 컨텐츠제작프로젝트 6
void display(void) { int i; gl. Clear(GL_COLOR_BUFFER_BIT); gl. Color 3 f(1. 0, 1. 0); gl. Begin(GL_LINE_STRIP); for (i = 0; i <= 30; i++) gl. Eval. Coord 1 f((GLfloat) i/30. 0); gl. End(); gl. Point. Size(5. 0); gl. Color 3 f(1. 0, 0. 0); gl. Begin(GL_POINTS); 2013 -2학기 컨텐츠제작프로젝트 7
for (i = 0; i < 4; i++) gl. Vertex 3 fv(&ctrlpoints[i][0]); gl. End(); gl. Flush(); } void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); if (w <= h) gl. Ortho(-5. 0, -5. 0*(GLfloat)h/(GLfloat)w, -5. 0, 5. 0); 2013 -2학기 컨텐츠제작프로젝트 8
else gl. Ortho(-5. 0*(GLfloat)w/(GLfloat)h, -5. 0, 5. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } 2013 -2학기 컨텐츠제작프로젝트 9
int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window (argv[0]); init (); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Keyboard. Func (keyboard); glut. Main. Loop(); return 0; } 2013 -2학기 컨텐츠제작프로젝트 10
◦ gl. Map 1*()의 제어점의 종류 표 12 – 1 매개변수 의미 GL_MAP 1_VERTEX_3 x, y, z 정점 좌표 GL_MAP 1_VERTEX_4 x, y, z, w 정점 좌표 GL_MAP 1_INDEX 컬러 인덱스 GL_MAP 1_COLOR_4 R, G, B, A GL_MAP 1_NORMAL 법선 좌표 GL_MAP 1_TEXTURE_COORD_1 s 텍스처 좌표 GL_MAP 1_TEXTRUE_COORD_2 s, t 텍스처 좌표 GL_MAP 1_TEXTRUE_COORD_3 s, t, r 텍스처 좌표 GL_MAP 1_TEXTRUE_COORD_4 s, t, r, q 텍스처 좌표 2013 -2학기 컨텐츠제작프로젝트 14
void display(void) { int i, j; gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Color 3 f(1. 0, 1. 0); gl. Push. Matrix (); gl. Rotatef(85. 0, 1. 0); for (j = 0; j <= 8; j++) { gl. Begin(GL_LINE_STRIP); for (i = 0; i <= 30; i++) gl. Eval. Coord 2 f((GLfloat)i/30. 0, (GLfloat)j/8. 0); gl. End(); gl. Begin(GL_LINE_STRIP); 2013 -2학기 컨텐츠제작프로젝트 22
for (i = 0; i <= 30; i++) gl. Eval. Coord 2 f((GLfloat)j/8. 0, (GLfloat)i/30. 0); gl. End(); } gl. Pop. Matrix (); gl. Flush(); } void init(void) { gl. Clear. Color (0. 0, 0. 0); gl. Map 2 f(GL_MAP 2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]); 2013 -2학기 컨텐츠제작프로젝트 23
gl. Enable(GL_MAP 2_VERTEX_3); gl. Map. Grid 2 f(20, 0. 0, 1. 0, 20, 0. 0, 1. 0); gl. Enable(GL_DEPTH_TEST); gl. Shade. Model(GL_FLAT); } void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); 2013 -2학기 컨텐츠제작프로젝트 24
if (w <= h) gl. Ortho(-4. 0, -4. 0*(GLfloat)h/(GLfloat)w, -4. 0, 4. 0); else gl. Ortho(-4. 0*(GLfloat)w/(GLfloat)h, -4. 0, 4. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; }} 2013 -2학기 컨텐츠제작프로젝트 25
int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window (argv[0]); init (); glut. Display. Func(display); glut. Reshape. Func(reshape); glut. Keyboard. Func(keyboard); glut. Main. Loop(); return 0; } 2013 -2학기 컨텐츠제작프로젝트 26
{ {-1. 5, 0. 5, 4. 0}, {-0. 5, 0. 0}, {0. 5, 3. 0}, {1. 5, 0. 5, 4. 0}}, { {-1. 5, -2. 0}, {-0. 5, 1. 5, -2. 0}, {0. 5, 1. 5, 0. 0}, {1. 5, -1. 0}} }; void initlights(void) { GLfloat ambient[] = {0. 2, 1. 0}; GLfloat position[] = {0. 0, 2. 0, 1. 0}; GLfloat mat_diffuse[] = {0. 6, 1. 0}; 2013 -2학기 컨텐츠제작프로젝트 30
GLfloat mat_specular[] = {1. 0, 1. 0}; GLfloat mat_shininess[] = {50. 0}; gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Lightfv(GL_LIGHT 0, GL_AMBIENT, ambient); gl. Lightfv(GL_LIGHT 0, GL_POSITION, position); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, mat_shininess); } 2013 -2학기 컨텐츠제작프로젝트 31
void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Push. Matrix(); gl. Rotatef(85. 0, 1. 0); gl. Eval. Mesh 2(GL_FILL, 0, 20); gl. Pop. Matrix(); gl. Flush(); } void init(void) { gl. Clear. Color(0. 0, 0. 0); gl. Enable(GL_DEPTH_TEST); 2013 -2학기 컨텐츠제작프로젝트 32
gl. Map 2 f(GL_MAP 2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]); gl. Enable(GL_MAP 2_VERTEX_3); gl. Enable(GL_AUTO_NORMAL); gl. Map. Grid 2 f(20, 0. 0, 1. 0, 20, 0. 0, 1. 0); initlights(); /* for lighted version only */ } void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); 2013 -2학기 컨텐츠제작프로젝트 33
if (w <= h) gl. Ortho(-4. 0, -4. 0*(GLfloat)h/(GLfloat)w, -4. 0, 4. 0); else gl. Ortho(-4. 0*(GLfloat)w/(GLfloat)h, -4. 0, 4. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; } } 2013 -2학기 컨텐츠제작프로젝트 34
int main(int argc, char **argv) { glut. Init(&argc, argv); glut. Init. Display. Mode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window(argv[0]); init(); glut. Reshape. Func(reshape); glut. Display. Func(display); glut. Keyboard. Func(keyboard); glut. Main. Loop(); return 0; } 2013 -2학기 컨텐츠제작프로젝트 35
예제 12 – 4: texturesurf. c #include <GL/glut. h> #include <stdlib. h> #include <math. h> GLfloat ctrlpoints[4][4][3] = { {{ -1. 5, 4. 0}, { -0. 5, -1. 5, 2. 0}, {0. 5, -1. 0}, {1. 5, -1. 5, 2. 0}}, {{ -1. 5, -0. 5, 1. 0}, { -0. 5, 3. 0}, {0. 5, -0. 5, 0. 0}, {1. 5, -0. 5, -1. 0}}, {{ -1. 5, 0. 5, 4. 0}, { -0. 5, 0. 0}, {0. 5, 3. 0}, {1. 5, 0. 5, 4. 0}}, {{ -1. 5, -2. 0}, { -0. 5, 1. 5, -2. 0}, {0. 5, 1. 5, 0. 0}, {1. 5, -1. 0}} }; 2013 -2학기 컨텐츠제작프로젝트 38
GLfloat texpts[2][2][2] = {{{0. 0, 0. 0}, {0. 0, 1. 0}}, {{1. 0, 0. 0}, {1. 0, 1. 0}}}; void display(void) { gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Color 3 f(1. 0, 1. 0); gl. Eval. Mesh 2(GL_FILL, 0, 20); gl. Flush(); } #define image. Width 64 image. Height 64 2013 -2학기 컨텐츠제작프로젝트 39
GLubyte image[3*image. Width*image. Height]; void make. Image(void) { int i, j; float ti, tj; for (i = 0; i < image. Width; i++) { ti = 2. 0*3. 14159265*i/image. Width; for (j = 0; j < image. Height; j++) { tj = 2. 0*3. 14159265*j/image. Height; 2013 -2학기 컨텐츠제작프로젝트 40
image[3*(image. Height*i+j)] = (GLubyte) 127*(1. 0+sin(ti)); image[3*(image. Height*i+j)+1] = (GLubyte) 127*(1. 0+cos(2*tj)); image[3*(image. Height*i+j)+2] = (GLubyte) 127*(1. 0+cos(ti+tj)); } } } void init(void) { gl. Map 2 f(GL_MAP 2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]); gl. Map 2 f(GL_MAP 2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &texpts[0][0][0]); 2013 -2학기 컨텐츠제작프로젝트 41
gl. Enable(GL_MAP 2_TEXTURE_COORD_2); gl. Enable(GL_MAP 2_VERTEX_3); gl. Map. Grid 2 f(20, 0. 0, 1. 0, 20, 0. 0, 1. 0); make. Image(); gl. Tex. Envf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_WRAP_S, GL_REPEAT); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_WRAP_T, GL_REPEAT); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); gl. Tex. Parameteri(GL_TEXTURE_2 D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 2013 -2학기 컨텐츠제작프로젝트 42
gl. Tex. Image 2 D(GL_TEXTURE_2 D, 0, GL_RGB, image. Width, image. Height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); gl. Enable(GL_TEXTURE_2 D); gl. Enable(GL_DEPTH_TEST); gl. Shade. Model (GL_FLAT); } void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); 2013 -2학기 컨텐츠제작프로젝트 43
if (w <= h) gl. Ortho(-4. 0, -4. 0*(GLfloat)h/(GLfloat)w, -4. 0, 4. 0); else gl. Ortho(-4. 0*(GLfloat)w/(GLfloat)h, -4. 0, 4. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); gl. Rotatef(85. 0, 1. 0); } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; } } 2013 -2학기 컨텐츠제작프로젝트 44
int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window (argv[0]); init (); glut. Display. Func(display); 2013 -2학기 컨텐츠제작프로젝트 45
예제 12 – 5 NURBS 표면: surface. c #include <GL/glut. h> #include <stdlib. h> #include <stdio. h> #ifndef CALLBACK #define CALLBACK #endif GLfloat ctlpoints[4][4][3]; int show. Points = 0; GLUnurbs. Obj *the. Nurb; 2013 -2학기 컨텐츠제작프로젝트 49
void init_surface(void) { int u, v; for (u = 0; u < 4; u++) { for (v = 0; v < 4; v++) { ctlpoints[u][v][0] = 2. 0*((GLfloat)u - 1. 5); ctlpoints[u][v][1] = 2. 0*((GLfloat)v - 1. 5); if ( (u == 1 || u == 2) && (v == 1 || v == 2)) ctlpoints[u][v][2] = 3. 0; else ctlpoints[u][v][2] = -3. 0; } } } 2013 -2학기 컨텐츠제작프로젝트 50
void CALLBACK nurbs. Error(GLenum error. Code) { const GLubyte *estring; estring = glu. Error. String(error. Code); fprintf (stderr, "Nurbs Error: %sn", estring); exit (0); } void init(void) { GLfloat mat_diffuse[] = { 0. 7, 1. 0 }; GLfloat mat_specular[] = { 1. 0, 1. 0 }; GLfloat mat_shininess[] = { 100. 0 }; 2013 -2학기 컨텐츠제작프로젝트 51
gl. Clear. Color (0. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, mat_shininess); gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Enable(GL_DEPTH_TEST); gl. Enable(GL_AUTO_NORMAL); gl. Enable(GL_NORMALIZE); init_surface(); 2013 -2학기 컨텐츠제작프로젝트 52
the. Nurb = glu. New. Nurbs. Renderer(); glu. Nurbs. Property(the. Nurb, GLU_SAMPLING_TOLERANCE, 25. 0); glu. Nurbs. Property(the. Nurb, GLU_DISPLAY_MODE, GLU_FILL); glu. Nurbs. Callback(the. Nurb, GLU_ERROR, nurbs. Error); } void display(void) { GLfloat knots[8] = {0. 0, 1. 0}; int i, j; gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 2013 -2학기 컨텐츠제작프로젝트 53
gl. Push. Matrix(); gl. Rotatef(330. 0, 1. , 0. ); gl. Scalef (0. 5, 0. 5); glu. Begin. Surface(the. Nurb); glu. Nurbs. Surface(the. Nurb, 8, knots, 4 * 3, 3, &ctlpoints[0][0][0], 4, 4, GL_MAP 2_VERTEX_3); glu. End. Surface(the. Nurb); if (show. Points) { gl. Point. Size(5. 0); gl. Disable(GL_LIGHTING); 2013 -2학기 컨텐츠제작프로젝트 54
gl. Color 3 f(1. 0, 0. 0); gl. Begin(GL_POINTS); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { gl. Vertex 3 f(ctlpoints[i][j][0], ctlpoints[i][j][1], ctlpoints[i][j][2]); } } gl. End(); gl. Enable(GL_LIGHTING); } } gl. Pop. Matrix(); gl. Flush(); 2013 -2학기 컨텐츠제작프로젝트 55
void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); gl. Load. Identity(); glu. Perspective (45. 0, (GLdouble)w/(GLdouble)h, 3. 0, 8. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); gl. Translatef (0. 0, -5. 0); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'c': 2013 -2학기 컨텐츠제작프로젝트 56
case 'C': show. Points = !show. Points; glut. Post. Redisplay(); break; case 27: exit(0); break; default: break; } } 2013 -2학기 컨텐츠제작프로젝트 57
int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window(argv[0]); init(); glut. Reshape. Func(reshape); glut. Display. Func(display); glut. Keyboard. Func (keyboard); glut. Main. Loop(); return 0; } 2013 -2학기 컨텐츠제작프로젝트 58
NURBS 렌더링 속성 제어하기 • void glu. Nurbs. Property(GLUnurbs. Obj* nobj, Glenum property, Glfloat value); – 이 함수는 NURS 오브젝트 nobj의 속성을 조절 – property: 속성을 설정하는 인자 • GLU_DISPLAY_MODE, GLU_NURB_MODE, GLU_CULLING, GLU_SAMPLING_METHOD, GLU_SAMPLING_TOLERANCE, GLU_PARAMETRIC_TOLERANCE, GLU_U_STEP, GLU_V_STEP, GLU_AUTO_LOAD_MATRIX 등 – value: property 값 • property가 GLU_DISPLAY_MODE의 경우 – value는 기본값으로 GLU_FILL, 그 외 GLU_OUTLINE_POLYGON, GLU_OUTLINE_PATCH 2013 -2학기 컨텐츠제작프로젝트 61
• void glu. Load. Sampling. Matrices(GLUnurbs. Obj* nobj, const GLfloat model. Matrix[16], const GLfloat proj. Matrix[16], const GLint viewport[4]); – GLU_AUTO_LOAD_MATRIX가 꺼져 있다면 NURBS 표면 및 커브에서 컬링 행렬이나 샘플링을 계산하기 위해 glu. Load. Sampling. Matricex()를 사용하여 모델뷰 행렬, 투영 행렬, 뷰포트 등을 지정해야 함 • void glu. Get. Nurbs. Property(GLUnurbs. Obj* nobj, GLenum property, GLfloat *value); – 이 함수에서는 NURBS 오브젝트, 즉 nobj에 질의하기 위한 property가 주어져야 하고, 이에 대한 현재값은 value로 반환 2013 -2학기 컨텐츠제작프로젝트 67
� void glu. Nurbs. Surface(GLUnurbs. Obj* nobj, GLint uknot_count, GLfloat *uknot, GLint vknot_count, GLfloat* vknot, GLint u_stride, GLint v_stride, GLfloat *ctlarray, GLint uorder, GLint vorder, GLenum type); ◦ ◦ ◦ NURBS 표면 nobj의 정점(또는 평면의 법선이나 텍스처 좌표)을 정의 uknot, vnot, uknot_count, vknot_count: NURB 표면을 위한 값들 제어점의 개수는 각 매개변수의 knot 의 개수에서 차수를 뺀 값이 됨 ctrarray: 제어점을 가리키는 포인터 type: 2차원 평가자 타입 중 하나 �유리수가 아닌 제어점: GL_MAX_VERTEX_3 �유리수 제어점: GL_MAP 2_VERTEX_4 �텍스처 좌표: GL_MAP 2_TEXTURE_COORD_* �표면 법선: GL_MAP 2_NORMAL �u_stride, v_stride: 각각의 제어점과 매개변수의 방향 부동소수점 값 2013 -2학기 컨텐츠제작프로젝트 70
�void glu. Begin. Curve(GLUnurbs. Obj* nobj); �void glu. End. Curve(GLUnurbs. Obj* nobj); ◦ glu. Begin. Curve()를 호출한 다음, glu. Nurbs. Curve() 함수 호출로 표면의 속성 을 정의. ◦ 정점을 생성하려면 GL_MAP 1_VERTEX_3 또는 GL_MAP 1_VERTEX_4 타입의 표면 2013 -2학기 컨텐츠제작프로젝트 71 으로 호출
• void glu. Nurbs. Curve(GLUnurbs. Obj* nobj, GLint uknot_count, GLfloat *uknot, GLint u_stride, GLfloat *ctlarray, GLint uorder , GLenum type); – 오브젝트 obj를 위한 NURBS 커브를 정의 – 인자는 glu. Nurbs. Surface()의 인자들과 같은 의미 – 이 루틴은 하나의 놋 시퀀스와 NURBS오브젝 트의 차수에 대한 하나의 정의만 가짐 2013 -2학기 컨텐츠제작프로젝트 72
◦ 12개의 콜백 함수 GLU_NURBS_BEGIN void begin(Glenum type); GLU_NURBS_BEGIN_DATA void begin(Glenum type, void *user. Data); GLU_NURBS_TEXTURE_COORD void tex. Coord(Glfloat *t. Crd); GLU_NURBS_TEXTURE_COORD_DATA void tex. Coord(Glfloat *t. Crd, void *user. Data); GLU_NURBS_COLOR void color(Glfloat *color); GLU_NURBS_COLOR_DATA void color(Glfloat *color, void *user. Data); 2013 -2학기 컨텐츠제작프로젝트 75
GLU_NURBS_NORMAL void normal(Glfloat *nml); GLU_NURBS_NORMAL_DATA void normal(Glfloat *nml, void *user. Data); GLU_NURBS_VERTEX void vertex(Glfloat *vertex); GLU_NURBS_VERTEX_DATA void vertex(Glfloat *vertex, void *user. Data); GLU_NURBS_END void end(void); GLU_NURBS_END_DATA void end(void *user. Data); 2013 -2학기 컨텐츠제작프로젝트 76
예제 12 -8: NURBS 표면의 절단 (trim. c) #include <stdlib. h> #include <GL/glut. h> #include <stdio. h> #ifndef CALLBACK #define CALLBACK #endif GLfloat ctlpoints[4][4][3]; GLUnurbs. Obj *the. Nurb; 2013 -2학기 컨텐츠제작프로젝트 81
void init_surface(void) { int u, v; for (u = 0; u < 4; u++) { for (v = 0; v < 4; v++) { ctlpoints[u][v][0] = 2. 0*((GLfloat)u - 1. 5); ctlpoints[u][v][1] = 2. 0*((GLfloat)v - 1. 5); if ( (u == 1 || u == 2) && (v == 1 || v == 2)) ctlpoints[u][v][2] = 3. 0; else ctlpoints[u][v][2] = -3. 0; } } } 2013 -2학기 컨텐츠제작프로젝트 82
void CALLBACK nurbs. Error(GLenum error. Code) { const GLubyte *estring; estring = glu. Error. String(error. Code); fprintf (stderr, "Nurbs Error: %sn", estring); exit (0); } void init(void) { GLfloat mat_diffuse[] = { 0. 7, 1. 0 }; GLfloat mat_specular[] = { 1. 0, 1. 0 }; GLfloat mat_shininess[] = { 100. 0 }; 2013 -2학기 컨텐츠제작프로젝트 83
gl. Clear. Color (0. 0, 0. 0); gl. Materialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); gl. Materialfv(GL_FRONT, GL_SPECULAR, mat_specular); gl. Materialfv(GL_FRONT, GL_SHININESS, mat_shininess); gl. Enable(GL_LIGHTING); gl. Enable(GL_LIGHT 0); gl. Enable(GL_DEPTH_TEST); gl. Enable(GL_AUTO_NORMAL); gl. Enable(GL_NORMALIZE); init_surface(); 2013 -2학기 컨텐츠제작프로젝트 84
the. Nurb = glu. New. Nurbs. Renderer(); glu. Nurbs. Property(the. Nurb, GLU_SAMPLING_TOLERANCE, 25. 0); glu. Nurbs. Property(the. Nurb, GLU_DISPLAY_MODE, GLU_FILL); glu. Nurbs. Callback(the. Nurb, GLU_ERROR, nurbs. Error); } void display(void) { GLfloat knots[8] = {0. 0, 1. 0}; GLfloat edge. Pt[5][2] = {{0. 0, 0. 0}, {1. 0, 1. 0}, {0. 0, 0. 0}}; 2013 -2학기 컨텐츠제작프로젝트 85
GLfloat curve. Pt[4][2] = /* clockwise */ {{0. 25, 0. 5}, {0. 25, 0. 75}, {0. 75, 0. 5}}; GLfloat curve. Knots[8] = {0. 0, 1. 0}; GLfloat pwl. Pt[4][2] = /* clockwise */ {{0. 75, 0. 5}, {0. 5, 0. 25}, {0. 25, 0. 5}}; gl. Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gl. Push. Matrix(); gl. Rotatef(330. 0, 1. , 0. ); gl. Scalef (0. 5, 0. 5); 2013 -2학기 컨텐츠제작프로젝트 86
glu. Begin. Surface(the. Nurb); glu. Nurbs. Surface(the. Nurb, 8, knots, 4 * 3, 3, &ctlpoints[0][0][0], 4, 4, GL_MAP 2_VERTEX_3); glu. Begin. Trim (the. Nurb); glu. Pwl. Curve (the. Nurb, 5, &edge. Pt[0][0], 2, GLU_MAP 1_TRIM_2); glu. End. Trim (the. Nurb); glu. Begin. Trim (the. Nurb); glu. Nurbs. Curve (the. Nurb, 8, curve. Knots, 2, &curve. Pt[0][0], 4, GLU_MAP 1_TRIM_2); 2013 -2학기 컨텐츠제작프로젝트 87
glu. Pwl. Curve (the. Nurb, 3, &pwl. Pt[0][0], 2, GLU_MAP 1_TRIM_2); glu. End. Trim (the. Nurb); glu. End. Surface(the. Nurb); gl. Pop. Matrix(); gl. Flush(); } void reshape(int w, int h) { gl. Viewport(0, 0, (GLsizei) w, (GLsizei) h); gl. Matrix. Mode(GL_PROJECTION); 2013 -2학기 컨텐츠제작프로젝트 88
gl. Load. Identity(); glu. Perspective (45. 0, (GLdouble)w/(GLdouble)h, 3. 0, 8. 0); gl. Matrix. Mode(GL_MODELVIEW); gl. Load. Identity(); gl. Translatef (0. 0, -5. 0); } void keyboard(unsigned char key, int x, int y){ switch (key) { case 27: exit(0); break; } } 2013 -2학기 컨텐츠제작프로젝트 89
int main(int argc, char** argv) { glut. Init(&argc, argv); glut. Init. Display. Mode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glut. Init. Window. Size (500, 500); glut. Init. Window. Position (100, 100); glut. Create. Window(argv[0]); init(); glut. Reshape. Func(reshape); glut. Display. Func(display); glut. Keyboard. Func (keyboard); glut. Main. Loop(); return 0; } 2013 -2학기 컨텐츠제작프로젝트 90
- Slides: 91