19,468
社区成员
发帖
与我相关
我的任务
分享
#include <windows.h>
#include <GL/glut.h>
GLUnurbsObj *theNurb1;
GLfloat ctrlPoints[4][4][3]={
{{-1.5, -1.5, 2.0}, {-0.5, -1.5, 2.0},
{0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}},
{{-1.5, -0.5, 1.0}, {-0.5, 1.5, 2.0},
{0.5, 0.5, 1.0}, {1.5, -0.5, -1.0}},
{{-1.5, 0.5, 2.0}, {-0.5, 0.5, 1.0},
{0.5, 0.5, 3.0}, {1.5, -1.5, 1.5}},
{{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0},
{0.5, 0.5, 1.0}, {1.5, 1.5, -1.0}}
};
GLfloat knots[8]={0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};
void drawNurbs(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glRotatef(45.0f,0.0f,1.0f,0.0f);
glRotatef(60.0f,1.0f,0.0f,0.0f);
//定义NURBS对象
GLUnurbs* thenurb;
thenurb=gluNewNurbsRenderer();
//设置NURBS属性
gluNurbsProperty(thenurb,GLU_SAMPLING_TOLERANCE,25.0f);
gluNurbsProperty(thenurb,GLU_DISPLAY_MODE,GLU_FILL);
//绘制曲面
gluBeginSurface(thenurb);
//gluNurbsSurface(thenurb,12,lknots,10,knots,4*3,3,&ctrlPoints[0][0][0],5,5,GL_MAP2_VERTEX_3);
gluNurbsSurface(thenurb,8,knots,8,knots,4*3,3,&ctrlPoints[0][0][0],4,4,GL_MAP2_VERTEX_3);
//gluNurbsSurface(thenurb,8,knots,8,knots,4*3,3,&ctrlPoints[0][0][0],4,4,GL_MAP2_VERTEX_3);
gluEndSurface(thenurb);
//显示控制点
int ii,jj,kk;
glPointSize(5.0f);
glBegin(GL_POINTS);
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
for(kk=0;kk<3;kk++)
glVertex3fv(&ctrlPoints[ii][jj][kk]);
glEnd();
glPopMatrix();
glFlush();
}
void myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-5.0);
}
GLfloat spin = 0.0;
/*接收键盘指令*/
static void myKey(unsigned char key,int x,int y)
{
switch(key)
{
case'd':
spin = spin + 0.03;
glRotatef(spin,1.0,1.0,0.0);
glutPostRedisplay();
break;
case'a':
spin = spin - 0.03;
glRotatef(spin,1.0,1.0,0.0);
glutPostRedisplay();
break;
case 'x':
exit(0);
default:
break;
} }
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(600,400);
glutInitWindowPosition(200,200);
/*创建窗口*/
glutCreateWindow("NURBS surface");
glutKeyboardFunc(myKey);
glutDisplayFunc(drawNurbs);
glutReshapeFunc(myReshape);
glutMainLoop();
return 0;
}
#include <windows.h>
#include "glut.h"
GLfloat ctrlPoints[4][4][3]={{{-6.0f,-6.0f,0.0f},{-6.0f,-2.0f,0.0f},{-6.0f,2.0f,0.0f},{-6.0f,6.0f,0.0f}},
{{-2.0f,-6.0f,0.0f},{-2.0f,-2.0f,8.0f},{-2.0f,2.0f,8.0f},{-2.0f,6.0f,0.0f}},
{{2.0f,-6.0f,0.0f},{2.0f,-2.0f,8.0f},{2.0f,2.0f,8.0f},{2.0f,6.0f,0.0f}},
{{6.0f,-6.0f,0.0f},{6.0f,-2.0f,0.0f},{6.0f,2.0f,0.0f},{6.0f,6.0f,0.0f}}};
GLfloat knots[8]={0.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f,1.0f};
void drawNurbs(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glRotatef(45.0f,0.0f,1.0f,0.0f);
glRotatef(60.0f,1.0f,0.0f,0.0f);
//定义NURBS对象
GLUnurbs* thenurb;
thenurb=gluNewNurbsRenderer();
//设置NURBS属性
gluNurbsProperty(thenurb,GLU_SAMPLING_TOLERANCE,25.0f);
gluNurbsProperty(thenurb,GLU_DISPLAY_MODE,GLU_FILL);
//绘制曲面
gluBeginSurface(thenurb);
gluNurbsSurface(thenurb,8,knots,8,knots,4*3,3,&ctrlPoints[0][0][0],4,4,GL_MAP2_VERTEX_3);
gluEndSurface(thenurb);
//显示控制点
int ii,jj,kk;
glPointSize(5.0f);
glBegin(GL_POINTS);
for(ii=0;ii<4;ii++)
for(jj=0;jj<4;jj++)
for(kk=0;kk<3;kk++)
glVertex3fv(&ctrlPoints[ii][jj][kk]);
glEnd();
glPopMatrix();
glFlush();
}
void myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,-5.0);
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(600,400);
glutInitWindowPosition(200,200);
/*创建窗口*/
glutCreateWindow("NURBS surface");
glutDisplayFunc(drawNurbs);
glutReshapeFunc(myReshape);
glutMainLoop();
return 0;
}