繪制二次曲面通常要以下四步:
1、首先我們創建一個二次方程狀態對象
GLUquadricObj *m_pObj; //保存繪圖模式、法線模式、法線朝向、紋理等信息
//創建二次方程狀態對象 ,並初始化二次方程狀態
m_pObj = gluNewQuadric();
2、調用函數設置二次方程狀態
修改二次方程狀態 ,有四個方面。
第一個,設置繪制的模式:
GLAPI void APIENTRY gluQuadricDrawStyle (GLUquadric* quad,GLenum draw);
第一個參數傳遞二次方程狀態對象。(下面都是這樣,不再贅述。)
第二個方程決定繪制模式,有以下枚舉值:
| 常量 | 描述 |
| GLU_FILL | 二次方程對象畫成實體![]() |
| GLU_LINE | 二次方程對象畫成線框![]() 可以使用 glLineWidth(GLfloatwidth);設置線的寬度。 |
| GLU_POINT | 二次方程對象畫成一組頂點的集合![]() 可以使用 glPointSize(GLfloatsize);設置點的大小。 |
| GLU_SILHOUETTE | 類似於線框,但相鄰的多邊形的邊不被繪制。![]() |
第二個,設置法線模式:
GLAPI void APIENTRY gluQuadricNormals (GLUquadric* quad,GLenum normal);
第二個參數有一下枚舉:
| 常量 | 描述 |
| GLU_NONE | 二次方程對象不生成法線![]() |
| GLU_FLAT | 二次方程對象生成扁平法線![]() |
| GLU_SMOOTH | 二次方程對象生成平滑法線![]() |
看效果,扁平法線和平滑法線效果差不多,其實兩者差距還是很大的。
如果指定的是平滑法線,那么每個頂點都指定了一條法線,垂直於被模擬的表面,這樣可以產生一個平滑的表面。扁平法線是所有的法線都是面法線,垂直於三角形(多邊形)面。
第三個,設置法線方向:
GLAPI void APIENTRY gluQuadricOrientation (GLUquadric* quad,GLenum orientation);
第二個參數有以下枚舉:
| 常量 | 描述 |
| GLU_OUTSIDE | 二次方程對象法線向外![]() |
| GLU_INSIDE | 二次方程對象法線向里![]() |
向里向外是以正面為標准,OpenGL默認是以GL_CCW逆時針(繪點順序)為正方向的。
第四個,是否自動計算紋理坐標。
GLAPI void APIENTRY gluQuadricTexture (GLUquadric* quad,GLboolean texture);
第二個參數有以下變量:
| 常量 | 描述 |
| GL_TRUE | 二次方程對象自動計算紋理坐標![]() |
| GL_FALSE | 二次方程對象不自動計算紋理坐標![]() 不自動計算,而且沒有手動設置,紋理貼圖不正常 |
GL_TRUE的情況下,當為球體和圓柱體生成紋理坐標時,紋理是對稱地環繞在球體和圓柱體的表面的。如果應用到圓盤上,那么紋理的中心就是圓盤的中心,然后以線性插值的方式擴展到圓盤的邊界。
3、以二次方程狀態對象作為參數,傳到繪制二次方程的函數
glu提供以下模型:
一、球面
GLAPI void APIENTRY gluSphere (GLUquadric* quad,GLdouble radius,GLint slices,GLint stacks);
第一個參數為前面設置好的二次方程對象;(下同,不贅述)
第二個參數為球體半徑;
第三個參數與第四個參數決定球體的精度(光滑程度),具體意義可以看下圖。
繪制例子:
gluSphere(m_pObj,1.0,32,32);
二、圓柱(圓錐)
GLAPI void APIENTRY gluCylinder (GLUquadric* quad,GLdouble base,GLdouble top,GLdouble height,GLint slices,GLint stacks);
第二個參數為底部半徑;
第三個參數為頂部半徑;
第四個參數為高度;
最后兩個參數意義與球體一樣。
繪圖例子:
gluCylinder(m_pObj,1.0,1.0,2,32,32);
當底部半徑與頂部半徑有一個為0的時候就是圓錐:
gluCylinder(m_pObj,1.0,0.0,2,32,32);
三、環面(圓面)
GLAPI void APIENTRY gluDisk (GLUquadric* quad,GLdouble inner,GLdouble outer,GLint slices,GLint loops);
第二個參數為內徑;
第三個參數為外徑;
后面兩個參數與球體的最后兩個參數一樣。
繪圖例子:
gluDisk(m_pObj,1.0,1.5,32,32);
當內徑為0時就是為圓面:
gluDisk(m_pObj,0.0,1.5,32,32);
四、扇環面(扇面)
GLAPI void APIENTRY gluPartialDisk (GLUquadric* quad,GLdouble inner,GLdouble outer,GLint slices,GLint loops,GLdouble start,GLdouble sweep);
前面5個參數和gluDisk()一樣。
第6個參數為開始角度,第7個參數為結束角度。
繪圖例子:
gluPartialDisk(m_pObj,1.0,1.5,32,32,0,90);
當內徑為0時為扇面:
gluPartialDisk(m_pObj,0.0,1.5,32,32,0,90);
4、使用完之后銷毀二次對象。
//銷毀
gluDeleteQuadric(m_pObj);











