zoukankan      html  css  js  c++  java
  • <opengl>使用glu绘制二次曲面

    绘制二次曲面通常要以下四步:
     
    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);
  • 相关阅读:
    30天敏捷结果(26): 如何解决问题
    30天敏捷结果(30):提升敏捷结果
    30天敏捷结果(27):做些有重要意义的事
    STM32笔记A
    嵌入式linux驱动开发入门总结
    2014年个人计划
    迄今为止见过最好的职业规划
    30天敏捷结果(28):撰写你的个人使命
    C语言深度解剖读书笔记
    基于 SQLite 数据库的 C# 实体模型的实现
  • 原文地址:https://www.cnblogs.com/foundkey/p/6024333.html
Copyright © 2011-2022 走看看