
OpenGL编程轻松入门之曲面和曲线
发布时间:2006-05-19 11:59:42 来源:天极开发 网友评论 0 条
前面我们讲了如何绘制平面的图形,这一节我们学习如何绘制曲线和曲面。
例10:绘制一个曲面,如图十二所示。本程序使用二维求值器绘制一个曲面。本例中也有一些特殊效果的操作。
myInit()中的几个有关特殊效果的操作。
·glBlendFunc(GLenum sfactor,GLenum dfactor) 指定像素算法。sfactor指定红,绿,蓝及alpha源混合因素是如何计算的。dfactor指定红,绿,蓝及alpha目标混合因素是如何计算的。
·glHint(GLenum target,GLenum mode)指定操作线索。
Target为需要控制的符号常量。mode为所希望的行为符号常数。本例中GL_LINE_SMOOTH_HINT指定反走样线段的采样质量。GL_DONT_CARE指对选项不做考虑。
myDisplay()中的曲面操作:
·void glMap2f(GLenum target,GLfloat u1,GLfloat u2,Glint ustride, Glint uorder, GLfloat v1, GLfloat v2, Glint vstride, Glint vorder, const GLfloat *points);定义2维求值器。
target指定求值器生成的数值类型。本例中的GL_MAP2_VERTEX_3 指明每一个控制点为x、y、z表示的三个浮点值。
u1,u2指定线性映射。
ustride 指定控制点Rij的起始点和控制点 R(i+1)j的的起始点之间单精度或双精度浮点值的个数。这里i和j分别是u和v控制点索引,它允许控制点装入任意的数据结构中。唯一的限制是对于特定控制点的数值必须存在连续的内存单元。
uorder控制点数组在u轴方向上的维数。
v1,v2指定线性映射v
vstride指定控制点Rij的起始点和控制点 Ri(j+ 1)的起始点之间单精度或双精度浮点值的个数。这里i和j分别是u和v控制点索引,它允许控制点装入任意的数据结构中。唯一的限制是对于特定控制点的数值必须存在连续的内存单元。
vorder控制点数组在v轴方向上的维数。
points 一个指向控制点数组的指针。
·glMapGrid定义一维或二维网格。void glMapGrid2f(Glint un, GLfloat u1, GLfloat u2,Glint vn, GLfloat v1,GLfloat v2);
un 在网格[u1,u2]中的分段数目。
u1,u2 指定整数网格范围 i= 0;i= un的映射。
vn在网格[v1,v2]中的分段数目。
v1,v2 指定整数网格范围 j = 0;j= vn的映射。
·glEvalMesh 计算一维或二维点或线网格。本例中为2维。void glEvalMesh2(GLenum mode,Glint i1,Glint i2,Glint j1,Glint j2);
mode 指定是否计算二维点、线或多边形的网格。
i1,i2 分别为网格定义域变量i的第一个和最后一个整数值。
j1,j2分别为网格定义域变量j的第一个和最后一个整数值。
glMapGrid和glEvalMesh用来生成并求取一系列等间隔的网格点,glEvalMesh逐步计算一维或二维网格,他的定义范围由glMap指定。mode决定最终计算的顶点是绘制为点、线还是充实的多边形。具体的映射关系及有关图形方面的知识,你可以很方便的在MSDN、互联网及有关书籍中查到,本文就不详述这方面的内容。
例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,0},{2,0,0}}, {{-2,0,-1},{-1,1,-1},{0,0,-1},{1,-1,-1},{2,0,-1}}, {{-2,0,-2},{-1,1,-2},{0,0,-2},{1,-1,-2},{2,0,-2}}, {{-2,0,-3},{-1,1,-3},{0,0,-3},{1,-1,-3},{2,0,-3}}, {{-2,0,-4},{-1,1,-4},{0,0,-4},{1,-1,-4},{2,0,-4}}}; GLfloat mat_ambient[] = {0.1,0.1,0.1,1.0}; GLfloat mat_diffuse[] = {1.0,0.6,0.0,1.0}; GLfloat mat_specular[] = {1.0,1.0,1.0,1.0}; GLfloat light_ambient[] = {0.1,0.1,0.1,1.0}; GLfloat light_diffuse[] = {1.0,1.0,1.0,0.0}; GLfloat light_specular[] = {1.0,1.0,1.0,0.0}; GLfloat light_position[] = {2.0,23.0,-4.0,1.0}; void myInit(void) { glClearColor(0.0,0.0,0.0,0.0);//设置背景色 /*为光照模型指定材质参数*/ glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient); glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular); glMaterialf(GL_FRONT,GL_SHININESS,60.0); /*设置光源参数*/ glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); glLightfv(GL_LIGHT0,GL_POSITION,light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); /*enable depth comparisons and update the depth buffer*/ glEnable(GL_DEPTH_TEST); /*设置特殊效果*/ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glHint(GL_LINE_SMOOTH_HINT,GL_DONT_CARE); glEnable(GL_BLEND); glEnable(GL_AUTO_NORMAL); glEnable(GL_NORMALIZE); glFrontFace(GL_CW); glShadeModel(GL_SMOOTH); glEnable(GL_LINE_SMOOTH); } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(0.0,0.0,0.0); glTranslatef(0.0,-1.0,0.0); glRotatef(50.0,1.0,0.0,0.0); glPushMatrix(); /*绘制曲面*/ glEnable(GL_MAP2_VERTEX_3); glMap2f(GL_MAP2_VERTEX_3,0,1,3,5,0,1,15,5,&ctrlpoints[0][0][0]); glMapGrid2f(10.0,0.0,1.0,10.0,0.0,1.0); glEvalMesh2(GL_FILL,0,10.0,0,10.0); glPopMatrix(); glutSwapBuffers(); } void myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0,(GLfloat)w/(GLfloat)h,1.0,100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0,0.0,-5.0); } int main(int argc,char ** argv) { /*初始化*/ glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(400,400); glutInitWindowPosition(200,200); /*创建窗口*/ glutCreateWindow("lighted Bezier surface"); /*绘制与显示*/ myInit(); glutReshapeFunc(myReshape); glutDisplayFunc(myDisplay); /*进入GLUT事件处理循环*/ glutMainLoop(); return(0); } |
![]() 图十二:曲面 |
myInit()中的几个有关特殊效果的操作。
·glBlendFunc(GLenum sfactor,GLenum dfactor) 指定像素算法。sfactor指定红,绿,蓝及alpha源混合因素是如何计算的。dfactor指定红,绿,蓝及alpha目标混合因素是如何计算的。
·glHint(GLenum target,GLenum mode)指定操作线索。
Target为需要控制的符号常量。mode为所希望的行为符号常数。本例中GL_LINE_SMOOTH_HINT指定反走样线段的采样质量。GL_DONT_CARE指对选项不做考虑。
myDisplay()中的曲面操作:
·void glMap2f(GLenum target,GLfloat u1,GLfloat u2,Glint ustride, Glint uorder, GLfloat v1, GLfloat v2, Glint vstride, Glint vorder, const GLfloat *points);定义2维求值器。
target指定求值器生成的数值类型。本例中的GL_MAP2_VERTEX_3 指明每一个控制点为x、y、z表示的三个浮点值。
u1,u2指定线性映射。
ustride 指定控制点Rij的起始点和控制点 R(i+1)j的的起始点之间单精度或双精度浮点值的个数。这里i和j分别是u和v控制点索引,它允许控制点装入任意的数据结构中。唯一的限制是对于特定控制点的数值必须存在连续的内存单元。
uorder控制点数组在u轴方向上的维数。
v1,v2指定线性映射v
vstride指定控制点Rij的起始点和控制点 Ri(j+ 1)的起始点之间单精度或双精度浮点值的个数。这里i和j分别是u和v控制点索引,它允许控制点装入任意的数据结构中。唯一的限制是对于特定控制点的数值必须存在连续的内存单元。
vorder控制点数组在v轴方向上的维数。
points 一个指向控制点数组的指针。
·glMapGrid定义一维或二维网格。void glMapGrid2f(Glint un, GLfloat u1, GLfloat u2,Glint vn, GLfloat v1,GLfloat v2);
un 在网格[u1,u2]中的分段数目。
u1,u2 指定整数网格范围 i= 0;i= un的映射。
vn在网格[v1,v2]中的分段数目。
v1,v2 指定整数网格范围 j = 0;j= vn的映射。
·glEvalMesh 计算一维或二维点或线网格。本例中为2维。void glEvalMesh2(GLenum mode,Glint i1,Glint i2,Glint j1,Glint j2);
mode 指定是否计算二维点、线或多边形的网格。
i1,i2 分别为网格定义域变量i的第一个和最后一个整数值。
j1,j2分别为网格定义域变量j的第一个和最后一个整数值。
glMapGrid和glEvalMesh用来生成并求取一系列等间隔的网格点,glEvalMesh逐步计算一维或二维网格,他的定义范围由glMap指定。mode决定最终计算的顶点是绘制为点、线还是充实的多边形。具体的映射关系及有关图形方面的知识,你可以很方便的在MSDN、互联网及有关书籍中查到,本文就不详述这方面的内容。
推荐阅讯
- RPG游戏设计快速入门之场景
- 深入浅出组件编程之组件与控件的区别
- Web 2.0中AJAX技术应用详解
- 巴尔默称Web2.0将引发应用软件价格下滑
- WEB2.0对B2B网站经营思路上的启发
- EMC与微软共推在微软应用环境中的ILM解决方
- 用AJAX来控制书签和回退按钮
- Sun向更多PC厂商授权Java销售
- AJAX及使用E4X编写Web服务脚本
- AJAX.NET框架构建Lookup服务器控件
阅读排行
- 1..net页面间的参数传递简单实例
- 2.VC++与Matlab混合编程之引擎操作详解
- 3.Oracle数据库数据对象分析
- 4.Eclipse3.2+Tomcat5.5.17+Oracle9配置
- 5.Oracle数据库中索引的维护
- 6.在Oracle的网络结构中解决连接问题
- 7.Oracle数据安全面面观
- 8.Oracle数据库的ORA-00257故障解决过程
- 9.Oracle数据库备份与恢复的三种方法
- 10.Oracle与SQL Server在企业应用中的比较
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏

