dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>文章内容
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,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、互联网及有关书籍中查到,本文就不详述这方面的内容。

上一篇:OpenGL编程轻松入门之特殊效果操作   下一篇:OpenGL编程轻松入门之NURBS曲线和曲面
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言学习
·C语言指针
·C语言数组排序小结
·c语言 最简单的推箱子游戏
·c语言 全国计算机编程大赛复赛试
·c语言 全国计算机编程大赛复赛试
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
  相关文章
·OpenGL编程轻松入门之特殊效果操
·OpenGL编程轻松入门之NURBS曲线
·OpenGL编程轻松入门之纹理映射
·OpenGL编程轻松入门之二次几何体
·OpenGL编程轻松入门之使用光照和
·OpenGL编程轻松入门之像素操作
·OpenGL编程轻松入门之显示例表
·OpenGL编程轻松入门之堆栈操作
·OpenGL编程轻松入门之坐标变换
·OpenGL编程轻松入门之使用颜色
·OpenGL编程轻松入门之一个简单的
·OpenGL编程轻松入门之背景简介
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763