OpenGL编程轻松入门之NURBS曲线和曲面(2)

例12:绘制一个彩色的曲线,曲线闭合成圆。在曲线的边缘绘制8个点,如图十四所示。

#include <windows.h>
#include <GL/glut.h>

GLUnurbsObj *theNurb;

GLfloat ctrlpoints[12][3] = {{4,0,0},{2.828,2.828,0},{0,4,0},{-2.828,2.828,0},
{-4,0,0},{-2.828,-2.828,0},{0,-4,0},{2.828,-2.828,0},
{4,0,0},{2.828,2.828,0},{0,4,0},{2.828,2.828,0}};//控制点

GLfloat color[12][3]={{1.0,0.0,0.0},{1.0,1.0,0.0},{0.0,1.0,0.0},{-1.0,1.0,0.0},
{-1.0,0.0,0.0},{-1.0,-1.0,0.0},{0.0,-1.0,0.0},{1.0,-1.0,0.0},
{1.0,0.0,0.0},{1.0,1.0,0.0},{0.0,1.0,0.0},{1.0,1.0,0.0}};

GLfloat knots[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

void myInit(void)
{
 glClearColor(1.0,1.0,1.0,0.0);//设置背景色
 theNurb = gluNewNurbsRenderer();//创建NURBS对象theNurb
 gluNurbsProperty(theNurb,GLU_SAMPLING_TOLERANCE,10);
}

/*绘制曲线*/
void myDisplay(void)
{
 int i;

 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glColor3f(0.0,0.0,0.0);

 glLineWidth(3.0);

 /*绘制曲线*/
 gluBeginCurve(theNurb);
 gluNurbsCurve(theNurb,15,knots,3,&ctrlpoints[0][0],3,GL_MAP1_VERTEX_3);
 gluNurbsCurve(theNurb,15,knots,3,&ctrlpoints[0][0],3,GL_MAP1_COLOR_4);
 gluEndCurve(theNurb);

 /*绘制点*/
 glColor3f(1.0,0.0,0.0);
 glPointSize(5.0);
 glBegin(GL_POINTS);
 for(i = 0;i < 8;i++)
  glVertex2fv(&ctrlpoints[i][0]);
  glEnd();

 glutSwapBuffers();
}

void myReshape(GLsizei w,GLsizei h)
{
 glViewport(0,0,w,h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 if(w <=h)
  glOrtho(-10.0,10.0,-10.0*(GLfloat)h/(GLfloat)w,10.0*(GLfloat)h/(GLfloat)w,-10.0,10.0);
 else
  glOrtho(-10.0*(GLfloat)w/(GLfloat)h,10.0*(GLfloat)w/(GLfloat)h,-10.0,10.0,-10.0,10.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 curve");

 /*绘制与显示*/
 myInit();

 glutReshapeFunc(myReshape);
 glutDisplayFunc(myDisplay);

 glutMainLoop();
 return(0);
}

  ·gluBeginCurve,gluEndCurve限定NURBS曲面。返回值均为void,参数均为GLUnurbsObj* nobj,为指向NURBS对象的指针。

  ·void gluNurbsCurve(GLUnurbsObj *nobj, GLint nknots, GLfloat *knot, Glint stride, GLfloat *ctlarray, GLint order,GLenum type)定义曲线形状。

  nobj 指向NURBS对象的指针。

  nknots 节点数,节点数等于控制点数加上阶数。

  knot nknots数组非递减节点值。

  stride相邻控制点的偏移量。

  Ctlarry指向NURBS的控制点数组的指针。

  order NURBS曲线的阶数,阶数比维数大1。

  type曲面类型。

 


图十四:NURBS曲线
时间: 2024-10-22 00:50:06

OpenGL编程轻松入门之NURBS曲线和曲面(2)的相关文章

OpenGL编程轻松入门之NURBS曲线和曲面(1)

上一节讲了一般的曲线与曲面的绘制,本节讲NURBS曲线和曲面的绘制. 例11:此例绘制两个相同形状的NURBS曲面,不同之处是一个为线框式,一个是由实多边形组成.运行后可以看到其中的区别,如图十三所示. #include <windows.h> #include <GL/glut.h> GLUnurbsObj *theNurb1; GLUnurbsObj *theNurb2; GLfloat ctrlpoints[5][5][3] = {{{-3,0.5,0},{-1,1.5,0}

OpenGL编程轻松入门

OpenGL编程轻松入门之背景简介 OpenGL编程轻松入门之一个简单的例子(1) OpenGL编程轻松入门之一个简单的例子(2) OpenGL编程轻松入门之使用颜色 OpenGL编程轻松入门之坐标变换 OpenGL编程轻松入门之堆栈操作 OpenGL编程轻松入门之显示例表 OpenGL编程轻松入门之使用光照和材质 OpenGL编程轻松入门之纹理映射 OpenGL编程轻松入门之特殊效果操作(1) OpenGL编程轻松入门之特殊效果操作(2) OpenGL编程轻松入门之特殊效果操作(3) Open

OpenGL编程轻松入门之曲面和曲线

前面我们讲了如何绘制平面的图形,这一节我们学习如何绘制曲线和曲面. 例10:绘制一个曲面,如图十二所示.本程序使用二维求值器绘制一个曲面.本例中也有一些特殊效果的操作. #include <windows.h> #include <GL/GLAUX.h> #include <GL/glut.h> #include <math.h> GLfloat ctrlpoints[5][5][3] = {{{-2,0,0},{-1,1,0},{0,0,0},{1,-1,

OpenGL编程轻松入门之背景简介

OpenGL(Open Graphics Library)是图形硬件的一个软件接口,也是该领域的工业标准.图形程序员利用这些指令可以创建高质量的交互式的三维应用.OpenGL的前身是SGI(Silicon Graphics)公司为其图形工作站开发的IRIS GL.IRIS GL虽然功能强大但是移植性不好,于是SGI公司便在IRIS GL的基础上开发了OpenGL. OpenGL是一个与硬件无关的软件接口.可以在不同的平台如Windows 95.Windows NT.Unix.Linux.MacO

OpenGL编程轻松入门之一个简单的例子(1)

先编译运行一个简单的例子,这样我们可以有一个直观的印象.从这个例子我们可以看到OpenGL可以做什么,当然这个例子只做了很简单的一件事--绘制一个彩色的三角形.除此以外,我们还可以看到典型的OpenGL程序结构及openGL的运行顺序. 例1:本例在黑色的背景下绘制一个彩色的三角形,如图一所示. #include <stdlib.h> #include <GL/glut.h> void background(void) { glClearColor(0.0,0.0,0.0,0.0)

OpenGL编程轻松入门之动画制作

到目前为止我们所做的图形全部都是静止的.而OpenGL的是一个可以制作大型3D图形.动画的工具.下面我们做一个可以旋转的立方体. 例16:一个旋转的立方体 #include <GL/glut.h> GLfloat X = 10.0f; GLfloat Y = 1.0f; GLfloat Z = 5.0f; void myDisplay(void) { GLfloat diffuse[] = {0.7,0.7,0.0,1.0}; glClear(GL_COLOR_BUFFER_BIT|GL_DE

OpenGL编程轻松入门之菜单管理

菜单是我们经常使用的工具,很方便,直观.本节讨论在OpenGL中如何进行菜单管理. 例17:本例在蓝色的背景上绘制一个白色的正方形,在窗口内单击鼠标右键,弹出菜单,当选择不同菜单项时命令窗口会显示出是哪个菜单的哪个菜单相被激活.本例一个主菜单,主菜单有3个菜单条目及两个子菜单.两个子菜单都有3个菜单条目. #include <GL/glut.h> #include <stdio.h> int menu,subMenu1,subMenu2; /*在蓝色的背景上绘制一个白色的正方形*/

OpenGL编程轻松入门之一个简单的例子(2)

现在我们对OpenGL程序的典型的程序结构有了一个了解.首先初始化,包括对GLUT库的初始化和对窗口的设置及显示模式的设置.第二,创建窗口.第三,自己创作的核心部分.第四,glutMainLoop 进入GLUT事件处理循环. 下面,我们转到我们的创作核心. background这个函数很简单,只有一行语句.glClearColor中的四个参数分别是红.绿.蓝和alpha值.这些值定义了窗口的颜色.这些值的范围在[0,1]之间.缺省值均为0.你可以改变这些值,观察背景色彩的变化. myDispla

OpenGL编程轻松入门之坐标变换

本节中的例子仅仅是将第二节的例子作了一点点改动.将myDisplay函数中画三角型的那一部分提出来写成一个函数drawTriangle.然后在myDisplay函数中用drawTriangle():代替原来的语句.这时例3和例1完成的功能完全一样.而此时我们知道坐标的原点在窗口的中心.我们用glTranslate函数改变坐标的原点.同样glTranslate函数后的f和d表明参数的类型.其参数的含义和glVertex中参数的含义一样.坐标原点改变后,我们再调用一次drawTriangle():可