/* NURB curve (1-dimension) Written by Caroline Geiersbach and Scott D. Anderson scott.anderson@acm.org Summer 2003 */ #include #include #include #include "tw.h" #include //specify all control points here twTriple points[15] = { {-3.5,0,0},{-3,0,-1}, {-2,0,0}, {-1,0,-3}, {0,0,-4}, {1,0,-4}, {2,0,3}, {3,0,-2}, {4,0,0}, {3.5,0,1}, {3,0,2}, {2,0,3}, {1,0,-1}, {0,0,-3}, {-1.5,0,2}, }; void drawCurve(twTriple* p, int numPoints, int color) { int i; glMap1f(GL_MAP1_VERTEX_3,0,1,3,numPoints,(const GLfloat*) p); twColorName(color); glBegin(GL_LINE_STRIP); for(i=0; i<=30; i++) glEvalCoord1f((GLfloat)i/30.0); glEnd(); // glMap1f(GL_MAP1_VERTEX_3,0,1,3,15,(const GLfloat*)&points2[0]); } void display(void) { int i, j; glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); twCamera(); //placemat glPushMatrix(); glTranslatef(0,-4.03,0); twTriple matColor = {0,0.6,0.3}; twColor(matColor,0,5); glBegin(GL_POLYGON); glVertex3f(-10,0,7); glVertex3f(-10,0,-7); glVertex3f(10,0,-7); glVertex3f(10,0,7); glEnd(); glPopMatrix(); glPushMatrix(); glRotatef(90,1,0,0); twTriple bowlColor = {0.4,0.4,0.8}; twColor(bowlColor,0.5,128.0); twCylinder(6,4,4,30,30); glTranslatef(0,0,4); twDisk(0,4,30,30); glPopMatrix(); glLineWidth(2); glPushMatrix(); glTranslatef(0,-3.8,0); for(i=0; i<6; i++) { glRotatef(0.5,0,1,0); glTranslatef(0,0.2,0); for (j=0; j < 5; j++) { drawCurve(&points[0],15,TW_OLIVE); glRotatef(3,0,1,0); } } glPopMatrix(); glFlush(); glutSwapBuffers(); } void myInit() { glEnable(GL_MAP1_VERTEX_3); //lighting twAmbient(0.6); GLfloat lightPosition[] = {4,4,4,0}; glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(650, 650); twBoundingBox(-5,5,-5,10,-5,5); glutCreateWindow("NURBS!"); glutDisplayFunc(display); twMainInit(); myInit(); glutMainLoop(); return 0; }