绘制二次曲面通常要以下四步:
 
1、首先我们创建一个二次方程状态对象
GLUquadricObj *m_pObj;    //保存绘图模式、法线模式、法线朝向、纹理等信息
//创建二次方程状态对象 ,并初始化二次方程状态
m_pObj = gluNewQuadric(); 
 
2、调用函数设置二次方程状态
修改二次方程状态 ,有四个方面。
第一个,设置绘制的模式:
  1. GLAPI void APIENTRY gluQuadricDrawStyle (GLUquadric* quad,GLenum draw);
第一个参数传递二次方程状态对象。(下面都是这样,不再赘述。)
第二个方程决定绘制模式,有以下枚举值:
常量 描述
GLU_FILL 二次方程对象画成实体
GLU_LINE 二次方程对象画成线框

可以使用

glLineWidth(GLfloatwidth);

设置线的宽度。

GLU_POINT 二次方程对象画成一组顶点的集合

可以使用

glPointSize(GLfloatsize);

设置点的大小。

GLU_SILHOUETTE 类似于线框,但相邻的多边形的边不被绘制。
 
第二个,设置法线模式:
  1. GLAPI void APIENTRY gluQuadricNormals (GLUquadric* quad,GLenum normal);
第二个参数有一下枚举:
常量 描述
GLU_NONE 二次方程对象不生成法线
GLU_FLAT 二次方程对象生成扁平法线
GLU_SMOOTH 二次方程对象生成平滑法线
看效果,扁平法线和平滑法线效果差不多,其实两者差距还是很大的。
如果指定的是平滑法线,那么每个顶点都指定了一条法线,垂直于被模拟的表面,这样可以产生一个平滑的表面。扁平法线是所有的法线都是面法线,垂直于三角形(多边形)面。
 
第三个,设置法线方向:
  1. GLAPI void APIENTRY gluQuadricOrientation (GLUquadric* quad,GLenum orientation);
第二个参数有以下枚举:
常量 描述
GLU_OUTSIDE 二次方程对象法线向外
GLU_INSIDE 二次方程对象法线向里
向里向外是以正面为标准,OpenGL默认是以GL_CCW逆时针(绘点顺序)为正方向的。
 
第四个,是否自动计算纹理坐标。
  1. GLAPI void APIENTRY gluQuadricTexture (GLUquadric* quad,GLboolean texture);
第二个参数有以下变量:
常量 描述
GL_TRUE 二次方程对象自动计算纹理坐标
GL_FALSE 二次方程对象不自动计算纹理坐标

不自动计算,而且没有手动设置,纹理贴图不正常
GL_TRUE的情况下,当为球体和圆柱体生成纹理坐标时,纹理是对称地环绕在球体和圆柱体的表面的。如果应用到圆盘上,那么纹理的中心就是圆盘的中心,然后以线性插值的方式扩展到圆盘的边界。
 
3、以二次方程状态对象作为参数,传到绘制二次方程的函数
glu提供以下模型:
一、球面
  1. GLAPI void APIENTRY gluSphere (GLUquadric* quad,GLdouble radius,GLint slices,GLint stacks);
第一个参数为前面设置好的二次方程对象;(下同,不赘述)
第二个参数为球体半径;
第三个参数与第四个参数决定球体的精度(光滑程度),具体意义可以看下图。

 
绘制例子:
  1. gluSphere(m_pObj,1.0,32,32);
 
二、圆柱(圆锥)
  1. GLAPI void APIENTRY gluCylinder (GLUquadric* quad,GLdouble base,GLdouble top,GLdouble height,GLint slices,GLint stacks);
第二个参数为底部半径;
第三个参数为顶部半径;
第四个参数为高度;
最后两个参数意义与球体一样。
绘图例子:
  1. gluCylinder(m_pObj,1.0,1.0,2,32,32);

 
当底部半径与顶部半径有一个为0的时候就是圆锥:
  1. gluCylinder(m_pObj,1.0,0.0,2,32,32);

 
三、环面(圆面)
  1. GLAPI void APIENTRY gluDisk (GLUquadric* quad,GLdouble inner,GLdouble outer,GLint slices,GLint loops);
第二个参数为内径;
第三个参数为外径;
后面两个参数与球体的最后两个参数一样。
 绘图例子:
  1. gluDisk(m_pObj,1.0,1.5,32,32);

 当内径为0时就是为圆面:
  1. gluDisk(m_pObj,0.0,1.5,32,32);

 
四、扇环面(扇面)
  1. GLAPI void APIENTRY gluPartialDisk (GLUquadric* quad,GLdouble inner,GLdouble outer,GLint slices,GLint loops,GLdouble start,GLdouble sweep);
前面5个参数和gluDisk()一样。
第6个参数为开始角度,第7个参数为结束角度。
绘图例子:
  1. gluPartialDisk(m_pObj,1.0,1.5,32,32,0,90);

 
当内径为0时为扇面:
  1. gluPartialDisk(m_pObj,0.0,1.5,32,32,0,90);

 
 
4、使用完之后销毁二次对象。
//销毁 
gluDeleteQuadric(m_pObj);

<opengl>使用glu绘制二次曲面的更多相关文章

  1. Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案

          最近在Window7使用Qt5.2学习OpenGL时,出现了以OpenGL中glu开头的函数库无法使用的错误,例如: 'gluPerspective'  was not declared ...

  2. Linux OpenGL 实践篇-3 绘制三角形

    本次实践是绘制两个三角形,重点理解顶点数组对象和OpenGL缓存的使用. 顶点数组对象 顶点数组对象负责管理一组顶点属性,顶点属性包括位置.法线.纹理坐标等. OpenGL缓存 OpenGL缓存实质上 ...

  3. OpenGL——点的绘制(使用OpenGL来绘制可旋转坐标系的螺旋线)

    package com.example.opengl1; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio. ...

  4. Android OpenGL 入门示例----绘制三角形和正方形

    Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例 ...

  5. OpenGL实现多层绘制(Layered Rendering) [转]

    http://blog.csdn.net/u010462297/article/details/50589991 引言 在某些情况下会需要用到多层绘制.FBO下有多个颜色挂接点(Color Attac ...

  6. 利用OpenGL固定流水线绘制球体

    在OS X上的一个OpenGL简单demo.所附赠的代码是绘制半个球体.开启了深度缓存和多重采样,采样数是4. 详细下载地址请见:http://www.cocoachina.com/bbs/read. ...

  7. iOS OpenGL ES简单绘制纹理

    OpenGL 中任何复杂的图形都是由点,线 和三角形组成的. 那么一个矩形 就需要有两个三角形组成. 纹理, 可以理解为一张图片, 我么可以将整张or部分图片绘制到圆形, 矩形等目标图形中. 下图表示 ...

  8. iOS OpenGL ES简单绘制三角形

    OpenGL 是用于2D/3D图形编程的一套基于C语言的统一接口. windows,Linux,Unix上均可兼容. OpenGL ES 是在OpenGL嵌入式设备上的版本, android/iOS ...

  9. 【OpenGL】如何绘制Shadow

    背景 Shadow即阴影,它是光线被不透明物体遮挡而产生的黑暗区域,与光源的方向相反. 在Blender中编辑过程中没有Shadow,只有在经过渲染后才能显示.目前有一个基于Blender的项目,要求 ...

随机推荐

  1. CocoaAsyncSocket 文档1:Socket简单介绍

    前言 CocoaAsyncSocket是 IOS下广泛应用的Socket三方库,网上相关样例数不胜数.这里我就不直接上代码,本文由B9班的真高兴发表于CSDN博客.另辟一条思路:翻译SocketAsy ...

  2. Nginx https免费SSL证书配置指南

    生成证书 $ cd /usr/local/nginx/conf $ openssl genrsa -des3 -out server.key 1024 $ openssl req -new -key  ...

  3. Spring学习八----------Bean的配置之Resources

    © 版权声明:本文为博主原创文章,转载请注明出处 Resources 针对于资源文件的统一接口 -UrlResource:URL对应的资源,根据一个URL地址即可创建 -ClassPathResour ...

  4. Spring学习七----------Bean的配置之自动装配

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的自动装配(Autowiring) no:不启用自动装配,此时需要手动注入.参考:Spring学习三----------注入方式 defaul ...

  5. ssh port forwarding

    SSH端口转发,总是忘记,今天记录下.端口转发有两种,一个是local一个是remote(可能还有一种dynamic,还没有研究) 贴个链接 https://www.ssh.com/ssh/tunne ...

  6. maven新建项目报错

    创建了一个maven项目,报错 Errors occurred during the build. Errors running builder 'Maven Project Builder' on ...

  7. Linux 批量替换的一种实现方式

    替换某目录下所有文件中的某个字符: sed -i 's/origin_str/new_str/g' `grep origin_str -rl ./` origin_str:被替换的字符串: new_s ...

  8. 【转】windows下 ADT NDK开发环境配置

    前提: 下载好Ecplise ADT并配置好开发环境,不会配置环境可以参考这里: http://blog.csdn.net/danfengw/article/details/47111107 步骤: ...

  9. JAVA数据类型(转)

     java中数据的基本类型分为: 基本数据类型和引用数据类型,对此不多介绍:   接下来讨论一下java中数据类型存储在哪     基本数据类型存储在哪,取决于基本类型在哪声明:          1 ...

  10. 马尔科夫链在第n步转移的状态的概率分布