设为首页 加入收藏

TOP

OpenGL超级宝典学习笔记——曲线和曲面(一)
2015-02-25 22:43:01 来源: 作者: 【 】 浏览:34
Tags:OpenGL 超级 宝典 学习 笔记 曲线 曲面

内部支持的表面?


GLU库中提供了一些二次曲面的支持。这些二次方程可以渲染球体,圆柱体,圆盘。这些函数有很大的灵活性,我们可以指定圆柱体的一端的半径,然后让另一端的半径为0,这样的话就能构建一个圆锥。我们还可以绘制一个有洞的圆盘。如下图:


这些二次方程对象可以构建出更复杂的模型,例如我们可以用球体,圆柱体,圆锥,圆盘来构建一个3D坐标系的模型。在glTools中有提供了这个函数:


void gltdDrawUnitAxes();


image


在绘制二次方程对象之前,我们可以为其制定法线向量,纹理坐标等。如果我们每次在绘制这些二次方程对象时,把这些可选项都通过参数的方式传递,那工作量就变得很大。所以OpenGL用二次方程状态对象的方式来实现,这样我们可以通过一些函数来设置这个二次方程状态对象,以后每次绘制二次方程对象的时候只要传递这个二次方程状态,OpenGL就知道是以什么样的方式绘制二次方程对象了。(利用面向对象的方式来达到复用的目的)。


步骤是:


GLU库的gluNewQuadric()方法不仅仅为GLUQuadricObj对象申请了内存空间,而且还初始化了一些默认值。GLU库有四个函数可以修改这个二次方程对象的状态:


void gluQuadricDrawStyle(GLUquadricObj *obj, GLenum drawStyle);


第一个参数是二次方程对象状态的指针,第二个参数的枚举值如下表:


void gluQuadricNormals(GLUquadricObj *pbj, GLenum normals);


上面的这个函数指定二次方程对象如何生成法线。第二个参数可以是:GLU_NONE不生成法线,GLU_FLAT扁平法线,GLU_SMOOTH平滑法线。


如果指定的是平滑法线,那么每个顶点都指定了一条法线,垂直于被模拟的表面,这样可以产生一个平滑的表面。扁平法线是所有的法线都是面法线,垂直于三角形(多边形)面。


goid gluQuadricOrientation(GLUQuadricObj *obj, GLenum orientation);


上面的这个函数可以指定法线的朝向,指向外面还是只想里面。orientation可以是GLU_OUTSIDE或者是GLU_INSIDE这两个值。OpenGL默认是以GL_CCW逆时针为正方向的。


最后,我们还可以为二次方程表面指定纹理坐标,通过下面的函数调用来实现:


void gluQuadsricTexture(GLUquadricObj *obj, GLenum textureCoords);


textureCoords这个参数可以是GL_TRUE或者GL_FALSE.当为球体和圆柱体生成纹理坐标时,纹理是对称地环绕在球体和圆柱体的表面的。如果应用到圆盘上,那么纹理的中心就是圆盘的中心,然后以线性插值的方式扩展到圆盘的边界。


void gluSphere(GLUQuadricObj *obj, GLdouble radius, GLint slices, GLint stacks);


上面的函数式绘制球体的函数。第一个参数是指向二次方程状态的指针,第二个参数是球体的半径。第三个参数可以理解为地球的经线的条数。最后一个参数可以理解为纬线的条数。


image


image


我们可以通过指定底部的半和顶部的半径(方向是沿z轴正方向向外),还有高度(即圆柱体的长度)来绘制一个圆柱体。绘制圆柱体的函数如下:


void gluCylinder(GLUquadricObj *obj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks);


?


image


把顶部半径设置为0.


gluCylinder(quadricObj, 0.7, 0.0, 2, 26, 13);


image


绘制圆盘的函数


void gluDisk(GLUquadricObj *obj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops);


指定内半径为0才是实心的圆盘。


gluDisk(quadricObj, 0.0, 0.7, 26, 13);


image


gluDisk(quadricObj, 0.2, 0.7, 26, 13); 中间有洞的圆盘。


image


下面是一个雪人的例子。这个雪人由3个雪球堆成,由两个小眼睛和一个鼻子。还带了一顶帽子。步骤如下:


代码示例如下:


image


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL超级宝典学习笔记——纹理.. 下一篇OpenGL超级宝典学习笔记——贝塞..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: