/* NURB curve (2-dimension) Written by Caroline Geiersbach and Scott D. Anderson scott.anderson@acm.org Summer 2003 */ #include #include #include #include "tw.h" #include twTriple points[4][4]; GLUnurbsObj *myNurb; void initSurface() { int u, v; for (u = 0; u < 4; u++) { for (v = 0; v < 4; v++) { points[u][v][0] = 2.0*((GLfloat)u-1.5); points[u][v][1] = 2.0*((GLfloat)v-1.5); if((u==1 || u==2) && (v==1 || v==2)) points[u][v][2] = 3.0; else points[u][v][2] = -3.0; } } } void myInit() { twTriple myColor = {0.1,0.6,0.1}; twColor(myColor,0.2,128); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); initSurface(); myNurb = gluNewNurbsRenderer(); gluNurbsProperty(myNurb, GLU_SAMPLING_TOLERANCE, 25.0); gluNurbsProperty(myNurb, GLU_DISPLAY_MODE, GLU_FILL); } void display(void) { glClearColor(1,1,1,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); twCamera(); GLfloat knots[8] = {0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0}; glPushMatrix(); glRotatef(40,1,0,0); gluBeginSurface(myNurb); gluNurbsSurface(myNurb, 8, knots, 8, knots, 4*3, 3, &points[0][0][0], 4, 4, GL_MAP2_VERTEX_3); gluEndSurface(myNurb); glPopMatrix(); glFlush(); glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); twInitWindowSize(650, 650); twBoundingBox(-5,5,-5,5,-5,5); glutCreateWindow("NURBS!"); glutDisplayFunc(display); twMainInit(); myInit(); glutMainLoop(); return 0; }