#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;
}
curve fitting曲线曲面拟合,效果很好
3星 · 超过75%的资源 需积分: 46 142 浏览量
2011-08-31
23:25:55
上传
评论
收藏 207KB RAR 举报
moonmid
- 粉丝: 1
- 资源: 8
最新资源
- AIS2024 valid
- 最入门的爬虫代码 python.docx
- 爬虫零基础入门-爬取天气预报.pdf
- 最通俗易懂的 MongoDB 非结构化文档存储数据库教程.zip
- 以mongodb为数据库的订单物流小项目.zip
- 腾讯云-mongodb数据库, 项目部署.zip
- 腾讯 APIJSON 的 MongoDB 数据库插件.zip
- 理解非关系型数据库和关系型数据库的区别.zip
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈