#include<GL/glut.h>
#include<stdlib.h>
#include<stdio.h>
GLfloat ctlpoints[4][4][3];
int showPoints=0;
int disPolygon=0;
GLUnurbsObj *theNurb;
//初始化曲面控制点,控制点在x、y、z方向上范围是-3—3
void init_surface(void)
{
int u,v;
for(u=0;u<4;u++)
{
for(v=0;v<4;v++)
{
ctlpoints[u][v][0]=3.0*((float)u-1.5);
ctlpoints[u][v][1]=2.0*((float)v-1.5);
if((u==1||u==2)&&(v==1||v==2))
ctlpoints[u][v][2]=3.0;
else
ctlpoints[u][v][2]=-1.0;
}
}
}
void init(void)
{
//初始化材质属性
GLfloat mat_diffuse[]={0.7,0.7,0.5,1.0};
GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
GLfloat mat_shininess[]={100.0};
glClearColor(0.0,0.0,0.0,0.0);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
//初始化NURBS对象
theNurb=gluNewNurbsRenderer();
gluNurbsProperty(theNurb,GLU_SAMPLING_TOLERANCE,50.0);
init_surface();
}
void display(void)
{
int i,j;
GLfloat knots[8]={0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0};
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glScalef(1.5,1.5,1.5);
glTranslatef(0.0,0.0,-10.0);
glRotatef(290.0,1.0,0.0,0.0);
glRotatef(10.0,0.0,0.0,1.0);
//定义曲面显示模式
if(disPolygon)
{
gluNurbsProperty(theNurb,GLU_DISPLAY_MODE,GLU_OUTLINE_POLYGON);
}
else
{
gluNurbsProperty(theNurb,GLU_DISPLAY_MODE,GLU_FILL);
}
//开始定义NURBS曲面
gluBeginSurface(theNurb);
glColor3f(1.0,1.0,1.0);
//计算曲面
gluNurbsSurface(theNurb,8,knots,8,knots,4*3,3,&ctlpoints[0][0][0],4,4,GL_MAP2_VERTEX_3);
gluEndSurface(theNurb);
//显示控制点
if(showPoints)
{
glPointSize(5.0);
glDisable(GL_LIGHTING);
glColor3f(1.0,0.0,0.0);
glBegin(GL_POINTS);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++);
{
glVertex3f(ctlpoints[i][j][0],ctlpoints[i][j][1],ctlpoints[i][j][2]);
}
}
glEnd();
glEnable(GL_LIGHTING);
}
glPopMatrix();
glFlush();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(54.0,(GLdouble)w/(GLdouble)h,1.0,1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-5.0);
}
void keyboard(unsigned char key,int x,int y)
{
switch(key)
{
case'c':
case'C':
showPoints=!showPoints;
glutPostRedisplay();
break;
case'p':
case'P':
disPolygon=!disPolygon;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("绘制NURBS曲面");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
评论3
最新资源