绘制二次曲面通常要以下四步:
 
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. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

  2. 1-3:CSS3课程入门之伪类和伪元素

    E:target 表示当前的URL片段的元素类型,这个元素必须是E E:disabled 表示不可点击的表单控件 E:enabled 表示可点击的表单控件 E:checked 表示已选中的checkb ...

  3. StringBuilder的append、StringBuffer的append和String str = "a"+"b"的区别?

    大家都知道String+String会开销额外的系统资源,粗略的原因是String是不可变类,每一步操作都会返回新的String变量,占用空间及时间. 其实我的理解不是这样的,我们来看看String+ ...

  4. linux下安装go

    在centOS下,安装go的环境,如下: 下载压缩包,wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz 解压该文件 ...

  5. IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(一)

    IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯 前言 .net core 2.1已经正式发布了,signalr core1.0随之发布,是时候写个 ...

  6. linux 改动rootpassword以及忘记rootpassword

    改动rootpassword: $ passwd root 或者sudo passwd root $password:  (要求输入旧的密码) $new  password:(输入两遍新密码) 忘记r ...

  7. linux 配置 skywalking

    linux安装elasticsearch 一.检测是否已经安装的elasticsearch ps -aux|grep elasticsearch 二.下载elasticsearch (1)下载网站为: ...

  8. H2 应用实例1

    说明:本例子开发工具为NetBeans,jdk 1.7 进行测试说明 H2安装说明如下 1. H2数据库必要文件下载地址为: http://www.h2database.com     (1) 下载截 ...

  9. eclipse中 svn出现 E220000 解决办法

    这种情况,先试试修改svnserve.conf 中的 anon-access = none 然后重启eclipse   如果还是不行,还有可能是因为你修改了svn的配置链接后 跟他人的svn连接方式有 ...

  10. 在RedHat Linux系统中安装和配置snmp服务

    检查系统是否安装snmp服务 # rpm -qa|grep snmp net-snmp-5.3.2.2-17.el5 net-snmp-perl-5.3.2.2-17.el5 net-snmp-dev ...