绘制二次曲面通常要以下四步:
 
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. SQL系列函数--字符串函数

    1.charindex函数用来寻找一个指定的字符(串)在另一个字符串中的起始位置,返回一个整数,没找到就返回0 select CHARINDEX('SQL','Microsoft SQL SERVER ...

  2. 王立平--eclipse中改动android项目的版本

    改动版本 1.右键-->properties 2.android.改动须要的版本 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTU ...

  3. Lua学习五----------Lua循环

    © 版权声明:本文为博主原创文章,转载请注明出处 1.循环类型 1.1 while循环 - 语法:while(condition) do ...<执行语句> end - 解析:判断cond ...

  4. 用C语言解决迷宫问题

    #include <stdio.h> #include <stdlib.h> #define ROW 10 #define COL 10 /*迷宫中位置信息*/ typedef ...

  5. php开启pathinfo 模式

    pathinfo 模式 需要 php.ini 开启下面这个参数 cgi.fix_pathinfo=1 path_info模式:http://www.xxx.com/index.php/模块/方法   ...

  6. 为CentOS配置网易163的yum源

    Yum (Yellow dog Updater, Modified)是一个基于 RPM 包管理的字符前端软件包管理器.能够从指定的服务器自动下载 RPM 包并且安装,可以处理依赖性关系,并且一次安装所 ...

  7. Top 10 Open Source Bug Tracking System系统

    Bugzilla http://www.bugzilla.org/ Mantis php http://www.mantisbt.org/ Trac Python also provides wiki ...

  8. 语法之知识点的改进(Func/Action)

    上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知识点更是让 ...

  9. linux 安装mongo

    在Linux中安装Mongodb操作说明 MongoDB配置 版本说明:因本机所装Red Hat 为 64位操作系统故本例以64位的MongDB为例.所用版本如下: (1)    Red Hat En ...

  10. IOS GameCenter验证登陆

    #import "GameKitHelper.h" #import "GameConstants.h" @interface GameKitHelper () ...