使用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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM