绘制二次曲面通常要以下四步:
 
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. vscode Python Pylint(代码检测插件)

    暑假刚开始想了解一下Python,使用vscode进行编写,根据vscode 的提示安装了一些不知道干啥的插件,编写过程中提示说  "Linter pylint is not install ...

  2. 转:static关键字的总结

    static关键字的总结 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. ...

  3. ExtJs4学习(二):Dom操作

    如今主流的JS框架要数ExtJs和JQuery应用的比較广泛.JQuery属于轻量级的,一般做站点应用比較常见.可见块头小的优势. ExtJs比較庞大,它除了对主要的JS语法和HTML DOM操作方式 ...

  4. GenericServlet 、Servlet和httpServler他们之间的关系

    1.GenericServlet类是所有Servlet类的祖先类. 2.HttpServlet类继承了GenericServlet类. 3.Servlet有两个非常重要的的对象,可以说是java we ...

  5. 【翻译自mos文章】关于分区索引:Global, Local, Prefixed and Non-Prefixed

    来源于: Partitioned Indexes: Global, Local, Prefixed and Non-Prefixed (文档 ID 69374.1) APPLIES TO: Oracl ...

  6. pooler 连接池中报错" error_no_members"

    连接池驱动,pooler 在使用中会报错" error_no_members" 分析:可能有以下3个地方对其有影响:    1)member 可能没回收: 2)wait_for_p ...

  7. BZOJ 1002 FJOI2007 轮状病毒 递推+高精度

    题目大意:轮状病毒基定义如图.求有多少n轮状病毒 这个递推实在是不会--所以我选择了打表找规律 首先执行下面程序 #include<cstdio> #include<cstring& ...

  8. Leslie Lamport

    http://lamport.azurewebsites.net/pubs/pubs.html paper

  9. Tomcat学习笔记【5】--- 项目部署详解

    本文主要讲在Tomcat中部署项目的几种方式:静态部署.动态部署. 一 静态部署 静态部署项目有好几种方式,比较典型的有如下4种: 1.1 方式一:将Web项目放到webApps目录下 直接将web项 ...

  10. Grunt学习笔记【8】---- grunt-angular-templates插件详解

    本文主要讲如何用Grunt打包AngularJS的模板HTML. 一 说明 AngularJS中使用单独HTML模板文件的地方非常多,例如:自定义指令.ng-include.templateUrl等. ...