`
hereson3
  • 浏览: 163054 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

OPENGL的NURBS曲面制作

阅读更多
环境VC下控制台编程
 
Link:
glut32.lib glu32.lib opengl32.lib
 
事先要搞好glut32环境{网上查}
 
#include <Windows.h>
#include <GL/glut.h>
GLUnurbsObj *theNurb1;
GLUnurbsObj *theNurb2;
GLfloat ctrlpoints[5][5][3] = {{{-3,0.5,0},{-1,1.5,0},{-2,2,0},{1,-1,0},{-5,0,0}},
{{-3,0.5,-1},{-1,1.5,-1},{-2,2,-1},{1,-1,-1},{-5,0,-1}},
{{-3,0.5,-2},{-1,1.5,-2},{-2,2,-2},{1,-1,-2},{-5,0,-2}},
{{-3,0.5,-3},{-1,1.5,-3},{-2,2,-3},{1,-1,-3},{-5,0,-3}},
{{-3,0.5,-4},{-1,1.5,-4},{-2,2,-4},{1,-1,-4},{-5,0,-4}}};//控制点
GLfloat mat_diffuse[] = {1.0,0.5,0.1,1.0};
GLfloat mat_specular[] = {1.0,1.0,1.0,1.0};
GLfloat mat_shininess[] = {100.0};
GLfloat light_position[] = {0.0,-10.0,0.0,1.0};
void myInit(void)
{
 glClearColor(1.0,1.0,1.0,0.0);//设置背景色
 /*为光照模型指定材质参数*/
 glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
 glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
 glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
 glLightfv(GL_FRONT,GL_POSITION,light_position);//设置光源参数
 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);//设置光照模型参数
 /*激活光照*/
 glEnable(GL_LIGHTING);
 glEnable(GL_LIGHT0);
 glDepthFunc(GL_LEQUAL);
 glEnable(GL_DEPTH_TEST);
 glEnable(GL_LEQUAL);
 glEnable(GL_AUTO_NORMAL);
 glEnable(GL_NORMALIZE);
 /*设置特殊效果*/
 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE);
 glEnable(GL_BLEND);
 glFrontFace(GL_CW);
 glShadeModel(GL_SMOOTH);
 glEnable(GL_LINE_SMOOTH);
 theNurb1 = gluNewNurbsRenderer();//创建NURBS对象theNurb1
 gluNurbsProperty(theNurb1,GLU_SAMPLING_TOLERANCE,25.0);
 gluNurbsProperty(theNurb1,GLU_DISPLAY_MODE,GLU_OUTLINE_POLYGON);
 theNurb2 = gluNewNurbsRenderer();//创建NURBS对象theNurb2
 gluNurbsProperty(theNurb2,GLU_SAMPLING_TOLERANCE,25.0);
 gluNurbsProperty(theNurb2,GLU_DISPLAY_MODE,GLU_FILL);
}
int spin = 0;
/*接收键盘指令*/
static void myKey(unsigned char key,int x,int y)
{
 switch(key)
 {
  case'd':
   spin = spin + 1;
   glRotatef(spin,1.0,1.0,0.0);
   glutPostRedisplay();
   break;
  case 27:
   exit(0);
  default:
   break;
 }
}
/*绘制曲面*/
void myDisplay(void)
{
 GLfloat knots[10] = {0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0};
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glRotatef(50.0,1.0,1.0,0.0);
 /*第一个曲面*/
 glPushMatrix();
 glTranslatef(1.0,0.0,0.0);
 gluBeginSurface(theNurb1);
 /*定义曲面形状*/
 gluNurbsSurface(theNurb1,10,knots,10,knots,5*3,3,&ctrlpoints[0][0][0],5,5,GL_MAP2_VERTEX_3);
 gluEndSurface(theNurb1);
 glPopMatrix();
 /*第二个曲面*/
 glPushMatrix();
 glTranslatef(7.0,0.0,0.0);
 gluBeginSurface(theNurb2);
 /*定义曲面形状*/
 gluNurbsSurface(theNurb2,10,knots,10,knots,5*3,3,&ctrlpoints[0][0][0],5,5,GL_MAP2_VERTEX_3);
 gluEndSurface(theNurb2);
 glPopMatrix();
 glutSwapBuffers();
}
void myReshape(GLsizei w,GLsizei h)
{
 glViewport(0,0,w,h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(50.0,(GLfloat)w/(GLfloat)h,1.0,15.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glTranslatef(0.0,0.0,-9.0);
}
int main(int argc,char ** argv)
{
 /*初始化*/
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
 glutInitWindowSize(600,400);
 glutInitWindowPosition(200,200);
 
 /*创建窗口*/
 glutCreateWindow("NURBS surface");
 /*绘制与显示*/
 myInit();
 glutKeyboardFunc(myKey);
 glutReshapeFunc(myReshape);
 glutDisplayFunc(myDisplay);
 /*进入GLUT事件处理循环*/
 glutMainLoop();
 return(0);
}
分享到:
评论

相关推荐

    Nurbs_opengl_nurbs曲面纹理和光照模型_

    在OpenGL中实现NURBS曲面,需要使用OpenGL的扩展库如GLU(OpenGL Utility Library),它提供了对NURBS的支持。GLU提供了一个NURBS对象,允许程序员定义控制点、权重、曲线和曲面类型,然后进行渲染。 纹理映射是将...

    nurbs曲面绘制_opengl曲面_OPENGL_opengl_nurbs曲面_光照模型_

    单个文件利用OpenGL语言实现nurbs曲面模型的绘制,内含光照模型。

    NURBS.zip_nurbs_nurbs opengl_nurbs曲面_opengl nurbs_opengl 曲线

    标签中的"nurbs曲面"和"opengl_nurbs"强调了在OpenGL中处理NURBS曲面的关键点。"nurbs_opengl"表明这是关于在OpenGL环境下实现NURBS的方法。"opengl_曲线"则指出了NURBS曲线在OpenGL中的应用。 文档“OpenGL编程...

    qumian.rar_OPENGL_nurbs曲面_nurbs_opengl 曲面_vc opengl_曲面

    在OpenGL中,通常使用GLU(OpenGL Utility Library)库来处理高级图形函数,如NURBS曲面的生成和渲染。 在提供的源代码文件"qumian.cpp"中,我们可以预期看到以下关键知识点: 1. **OpenGL环境设置**:首先,程序...

    NURBS.rar_OPENGL_nurbs曲面_opengl vc6_opengl 曲面_vc6.0

    通过学习和实践这些代码,你可以了解到OpenGL和GLU如何协同工作,以及如何使用控制点来操纵NURBS曲面的形状。 总之,OpenGL和NURBS结合为开发者提供了一种强大的工具,用于创建和显示复杂的3D几何形状。在vc6.0中,...

    经典的NURBS曲面

    本压缩包中的资源提供了使用OpenGL实现NURBS曲面绘制的实例代码,对于初学者来说是一份极好的学习资料。 NURBS曲面的基本概念: 1. **控制点(Control Points)**:NURBS曲面的形状由一组控制点决定,改变这些点的...

    nurbs 曲面大全 vc++ opengl

    在VC++(Visual C++)编程环境中,开发者可以利用OpenGL库来实现NURBS曲面的渲染和交互。OpenGL是一个跨语言、跨平台的编程接口,专门用于生成2D和3D图形。它提供了一系列的函数调用来控制图形硬件,包括绘制NURBS...

    用C++绘制NURBS曲面

    NURBS曲面是由一系列控制点来定义的,通过权重值和插值函数的组合,可以创建出平滑、可变曲率的表面。 C++编程语言提供了丰富的库和工具,用于实现NURBS曲面的绘制。在给定的标题“用C++绘制NURBS曲面”中,我们...

    NURBS曲面的生成算法

    6. 显示结果:将生成的NURBS曲面在OpenGL或其他图形库中进行绘制。 在编程实现时,需要注意数据结构的选择和内存管理,以及数值稳定性问题。例如,为了避免除以零的情况,可以使用有理B样条的变种——Q-NURBS...

    绘制NURBS曲面.rar_NURBS c++_NURBS 曲面_nurbs_nurbs曲面_图形学曲面

    NURBS曲面在图形学中的应用非常广泛,包括但不限于3D建模软件、CAD系统、动画制作和游戏开发。它的优点在于能够精确地表示各种复杂的几何形状,同时保持良好的性能和视觉质量。在实际的编程实现中,需要理解NURBS的...

    nurbs曲面绘制源代码

    OpenGL是一个强大的图形库,用于在各种操作系统上生成2D和3D图像。...在分析和学习提供的源代码时,重点关注如何使用OpenGL和GLU库来构建和显示NURBS曲面,以及如何管理控制点和权重,将有助于深入理解这一技术。

    如何在VC_中用OpenGL绘制NURBS曲线曲面

    以下代码展示了如何在VC++中使用OpenGL的NURBS功能来绘制一个简单的NURBS曲面: ```cpp #include void drawNURBS() { GLUquadricObj *nobj; GLfloat knots[4] = {0.0f, 1.0f, 2.0f, 3.0f}; GLfloat ctrlpts[4]...

    opengl实现nurbs曲面

    for(i=0;i;i++) { for(j=0;j;j++); { glVertex3f(ctlpoints[i][j][0],ctlpoints[i][j][1],ctlpoints[i][j][2]); } } glEnd();

    nurbs曲面绘制

    NURBS(Non-Uniform Rational B-Splines,非均匀有理B样条)是...NURBS曲面绘制技术在工程设计、动画制作以及虚拟现实等应用中发挥着至关重要的作用,通过理解和掌握这些知识点,可以创建出高度精确和复杂的三维模型。

    nurbs.rar_nurbs_opengl 曲面_visual c

    本项目是关于使用OpenGL库来实现NURBS曲面的Visual C++程序,适合初学者学习和理解。 OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D图形。在本项目中,OpenGL被用来绘制和展示NURBS曲面。通过OpenGL,...

    OPenGL绘制三维曲面的例子

    OpenGL中绘制NURBS曲面,通常需要使用GLU(OpenGL Utility Library)库。GLU提供了gluNurbsSurface函数,用于创建和渲染NURBS曲面。使用这个函数,你需要提供控制点的坐标、Knot向量(定义曲线或曲面的参数空间范围...

    nurbs.rar_NURBS 曲面_nurbs_绘制nurbs

    7. **绘制过程**: 使用OpenGL或其他图形库,通过定义顶点数组和调用绘制函数,将NURBS曲面渲染到屏幕上。这通常涉及到计算每个像素点在曲面上的映射,以及处理光照、纹理等效果。 在实际应用中,NURBS曲面的优势...

    bezier&nurbs曲面源代码

    总的来说,这份源代码资源为学习和实践OpenGL中的Bezier曲线和NURBS曲面渲染提供了基础,同时也展示了如何解决常见问题,如屏幕闪烁,以提升用户体验。对于想要深入理解3D图形编程的开发者来说,这是一个宝贵的参考...

    openGL绘制NURBS曲线.rar MFC实现 OpenGL

    NURBS是一种强大的数学模型,常用于3D建模和CAD软件,能够精确地表示复杂的曲线和曲面。在MFC(Microsoft Foundation Classes)环境中,它为开发人员提供了一个用户友好的界面来实现这些功能。 首先,让我们了解...

    qumian.rar_nurbs_opengl 曲面

    vc++opengl 绘制NURBS曲面源代码

Global site tag (gtag.js) - Google Analytics