工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
在VC++中使用OpenGL绘制典型曲面
[文章信息]
作者:中国电波传播研究所青岛分所郎锐
时间:2004-10-25
出处:天极网
责任编辑:方舟
[文章导读]
本文主要讨论了在VC++中使用OpenGL绘制Bezier、NURBS等典型曲面的一般性方法。
advertisement
热点推荐
· 真没想到VB也可以这样用之指针技术
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
[正文]

1 2  下一页

  摘要: 本文主要讨论了在VC++中使用OpenGL绘制Bezier、NURBS等典型曲面的一般性方法。

  关键词: OpenGL;Bezier;NURBS;曲面绘制

  OpenGL中对复杂物体的建摸

  基本几何图元是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);

  通过这两个函数可以设置当前法向值。对于非向量形式的定义采用前一种方式,通过参数nx、ny和nz分别给出法向三个分量值;对于向量形式的定义采取后一种方式,将v设置为指向法向三分量的指针。在应用时,通常要对法向进行归一化处理。

  构造曲线、曲面

  在进行复杂物体建模时,使用的光滑曲线、曲面都是由一些线段和多边形逼近而成,并通过少数几个控制点对其进行描述。曲线的定义由glMap1*()函数完成:

void glMap1{fd}(GLenum target,TYPE u1,TYPE u2,GLint stride, GLint order,const TYPE *points);

  参数target指出了控制顶点的意义以及在points参数中需要提供多少值;points指针可以指向控制点集、RGBA颜色值或是纹理坐标串等。参数u1和u2限定了变量U的取值范围,通常是从0变化到1;stride表示跨度(在每块存储区内浮点数或双精度数的个数,即两个控制点间的偏移量);最后的参数order为阶数,是次数加1,与控制点数一致。曲线定义后必须再glEnable()函数显式启动后才能起作用,其参数与target保持一致。在使用完毕后通过glDisable()函数将其关闭。曲线坐标可通过glEvalCoord1*()函数进行计算:

void glEvalCoord1{fd}[v](TYPE u);

  该函数将产生曲线坐标值并将其绘制。参数u为定义域内的任意值,每调用一次将只产生一个坐标,此坐标值也是任意的。但目前较多采用的是定义均匀间隔曲线坐标值,依次调用glMapGrid1*()和glEvalMesh1()可以获得等间隔值。这两个函数分别用来定义一个一维网格和计算相应的坐标值。

  曲面的构造可以是网格线和填充曲面形式,与曲线的构造很类似只是将其扩展为二维而已。下面给出曲面的定义函数:

void glMap2{fd}(GLenum target,TYPE u1,TYPE u2,GLint ustride,GLint uorder,TYPE v1,TYPE v2,GLint vstride,GLint vorder,TYPE points);
 
  这里target的意义与在glMap1*()中的意义相同;(u1,u2),(v1,v2)是二维曲面坐标;其他参数如uorder,vorder,ustride和vstride等的定义都类似于在曲线中的定义;points为控制点坐标。对曲面任意一点的计算可通过函数

void glEvalCoord2{fd}[v](TYPE u,TYPE v);

  来完成,通过在定义域内的曲线坐标值u,v来计算曲面内任意一点的世界坐标位置。对于曲面,也可以象曲线一样通过函数来定义均匀间隔的曲面坐标值:

  void glMapGrid2{fd}(GLenum nu,TYPE u1,TYPE u2, GLenum nv,TYPE v1,TYPE v2);
  void glEvalMesh2(GLenum mode,GLint p1,GLint p2,GLint q1,GLint q2);

  第一个函数定义曲面参数空间均匀网格,从u1到u2分为等间隔nu步,从v1到v2分为等间隔nv步,然后由glEvalMesh2()将此网格应用到已经启动的曲面计算上。glEvalMesh2()的mode参数除了可以是GL_POINT和GL_LINE外,也可以是GL_FILL(生成填充空间曲面)。


1 2  下一页

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • VC下动态数据交换技术之执行远程命令
  • VC下动态数据交换技术之永久数据链路
  • 向ATL的DLL中传递C++对象参数
  • VC下动态数据交换技术之DDE数据传送
  • VC++与Matlab混合编程的研究与实现
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索