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

 我来答
匿名用户
推荐于2016-06-12
展开全部
基本几何图元是OpenGL进行建模的最基本的方法,但其对较复杂真实物体的建模则比较困难。对于这些复杂物体的建模,需要用到OpenGL基本库和功能库函数(gl库和glu库)以对图元进行扩展并完成法向计算、曲线生成和曲面构造等内容。这种对基本图元的扩展实际也就是对点、线及多边形的扩展。OpenGL中定义的点可具有不同大小的尺寸,其扩展的函数形式为:

void glPointSize(GLfloat size);

  其参数size以象素为单位设置了点的宽度,其值必须为正,缺省值1.0。对于线的扩展,可通过下面的函数来分别指定其宽度和绘制类型:

void glLineWidth(GLfloat width);
void glLineStipple(GLint factor,GLushort pattern);

  glLineWidth()的参数width以象素为单位指定线宽,其值必须为正,缺省值为1.0。glLineStipple()的参数factor为对模式进行拉伸的比例因子,参数pattern指定了线的模式(例如11001100将绘制一条虚线,为1时绘制,为0时不绘制)。该函数只有在启用了函数glEnable(GL_LINE_STIPPLE)后才可以使用,当不再使用时调用glDisable(GL_LINE_STIPPLE)将其关闭。扩展多边形的绘制模式包括全填充式、轮廓点式、轮廓线式及图案填充式等几种。使用时,首先调用glPolygonMode()设置多边形的模式设置:

void glPolygonMode(GLenum face,GLenum mode);
 
  参数face为GL_FRONT、GL_BACK或GL_FRONT_AND BACK;mode取值可以是GL_POINT、GL_LINE或GL_FILL,分别表示多边型的轮廓点、轮廓线和填充模式的绘制方式。缺省设置为填充模式。设置完成后可进行图案填充的设置:

void glPolygonStipple(const GLubyte *mask);

  其参数mask必须为一指向32×32大小的位图的指针,值为1时绘制、为0不绘制。该函数的使用同样也需要进行如下启动、关闭设置:

glEnable(GL_POLYGON-STIPPLE);
glDisable(GL_POLYGON_STIPPLE);

  复杂模型的建模不同与简单模型的建模,在简单模型中一个平面上各点的法向(mormal vector)是一样的,均等于此平面的法向。对于复杂模型中由众多小的平面多边形逼近而成的曲面,其每个顶点的法向量都不一样,因此曲面上每个点的法向计算结果根据采取的不同算法而有不同的结果。OpenGL只提供赋予当前顶点法向量的函数,而不提供对法向量计算的方法,法向量的计算需要由开发者来完成。下面给出一种简单的计算方法:

void getNormal(GLfloat gx[3],GLfloat gy[3],GLfloat gz[3],GLfloat *ddnv)
  {
   GLfloat w0,w1,w2,v0,v1,v2,nr,nx,ny,nz;
   w0=gx[0]-gx[1];
   w1=gy[0]-gy[1];
   w2=gz[0]-gz[1];
   v0=gx[2]-gx[1];
   v1=gy[2]-gy[1];
   v2=gz[2]-gz[1];
   nx=(w1*v2-w2*v1);
   ny=(w2*v0-w0*v2);
   nz=(w0*v1-w1*v0);
   nr=sqrt(nx*nx+ny*ny+nz*nz);
   ddnv[0]=nx/nr;
   ddnv[1]=ny/nr;
   ddnv[2]=nz/nr;
  }
  
  其参数gx[3],gy[3]和gz[3]为逼近曲面的一个三角形的三个顶点P0,P1和P2。通过计算矢量P0-P1与矢量P2-P1的叉乘而得到其平面法向量,并在归一化后保存到由参数ddnv所指向的数组中。至于顶点法向的计算则多是取邻近平面法向量的均值。OpenGL提供的法向定义函数为:

  void glNormal3{bsifd}(TYPE nx,TYPE ny,TYPE nz);
  void glNormal3{bsifd}v(const TYPE *v);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式