OpengGL B樣條曲面繪制

#include <GL/glut.h>

//定義控制點(diǎn)points
GLfloat ctrlpoints[4][4][3] = {
    { {1.0,2.4,0.8},{1.1,0.6,0.4}, {1.2,0.2,0.0},{2.0,-1.0,0.4}},//points0 

    { {2.6,1.0,0.8},{2.8,-0.4,0.4},{3.0,-0.8,0.0},{3.8,-1.6,0.4}},//points1

    { {5.2,1.0,0.0},{5.4,-0.4,0.0},{5.6,-0.8,0.0},{6.4,-1.6,0.0}},//points2
    
    { {7.4,2.4,0.0},{7.4,0.6,0.0},{7.8,0.2,0.0},{8.8,-0.6,0.2}} //points3
};

/* Nurbs曲面的對象指針 */
GLUnurbsObj  *theNurb;

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //清楚顏色緩沖
    glColor3f(0.0, 0.0, 0.0);
    //glPushMatrix()和glPopMatrix()的配對使用可以消除上一次的變換對本次變換的影響
    glPushMatrix();

    //繪制控制線
    glLineWidth(1.5f); //設(shè)置線寬1.5
    glColor3f(0.0, 0.0, 1.0); //設(shè)置線顏色為藍(lán)色
    for (int i = 0; i < 4; i++)
    {
        //設(shè)置類型為連續(xù)直線
        glBegin(GL_LINE_STRIP);
        //繪制列向的控制線
        for (int j = 0; j < 4; j++)
            glVertex3fv(ctrlpoints[i][j]);
        glEnd();
        //繪制橫向的控制線
        glBegin(GL_LINE_STRIP);
        for (int j = 0; j < 4; j++)
            glVertex3fv(ctrlpoints[j][i]);
        glEnd();
    }

    //繪制控制點(diǎn)
    glPointSize(5.0f); //設(shè)置點(diǎn)的大小為5.0
    glColor3f(1.0, 0.0, 0.0); //設(shè)置點(diǎn)顏色為紅色
    glBegin(GL_POINTS); //模式為POINTS
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            glVertex3fv(ctrlpoints[i][j]);
        }
    }
    glEnd();

    //繪制B樣條控制曲面
    GLfloat knots[8] = { 0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0 }; //B樣條控制向量
    glLineWidth(1.0f); //設(shè)置線寬為1.0
    glColor3f(0.0, 0.0, 0.0); //線的顏色為黑色

    /* 創(chuàng)建一個Nurbs曲面的對象  并返回一個指向這個新對象的指針 */
    theNurb = gluNewNurbsRenderer();
    /* 設(shè)置該對象的屬性 */
    gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0); 
    gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_OUTLINE_POLYGON);
    gluBeginSurface(theNurb);//開始繪制
    gluNurbsSurface(theNurb, //NURBS曲面對象
        8, knots,  //u向節(jié)點(diǎn)數(shù)目和節(jié)點(diǎn)數(shù)組指針
        8, knots,  //v向節(jié)點(diǎn)數(shù)目和節(jié)點(diǎn)數(shù)組指針
        4 * 3,  //u向的跨度 列優(yōu)先保存 t_stride = 4 * s_count
        3,   //v向的跨度
        &ctrlpoints[0][0][0], //曲面控制點(diǎn)指針
        4, 4, //u方向弟头、v方向階數(shù)
        GL_MAP2_VERTEX_3 //曲面的類型
    );

    gluEndSurface(theNurb); //結(jié)束繪制

    for (int j = 0; j <= 8; j++)
    {
        glBegin(GL_LINE_STRIP);
        for (int i = 0; i <= 30; i++)
            glEvalCoord2f((GLfloat)i / 30.0, (GLfloat)j / 8.0);
        glEnd();
        glBegin(GL_LINE_STRIP);
        for (int i = 0; i <= 30; i++)
            glEvalCoord2f((GLfloat)j / 8.0, (GLfloat)i / 30.0);
        glEnd();
    }
    
    glPopMatrix();
    glFlush();
}

void reshape(int w, int h) 
{ 
    glViewport(0, 0, (GLsizei)w, (GLsizei)h); /* 設(shè)置觀察窗口的大小 */ 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    /* 設(shè)置正投影, 6個參數(shù)分別表示, 左修剪平面坐標(biāo), 右修剪平面坐標(biāo), 
    下修剪平面坐標(biāo), 上修剪平面坐標(biāo), 近修剪平面坐標(biāo), 遠(yuǎn)修剪平面坐標(biāo) */
    glOrtho(0.0, 10.0, -5.0 * (GLfloat)h / (GLfloat)w, 
        5.0 * (GLfloat)h / (GLfloat)w, -5.0, 5.0); 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    //激活該曲面函數(shù)
    glEnable(GL_MAP2_VERTEX_3); 
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB |
        GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    init();
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赴恨,一起剝皮案震驚了整個濱河市伴栓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钳垮,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧焦,死亡現(xiàn)場離奇詭異肚医,居然都是意外死亡向瓷,警方通過查閱死者的電腦和手機(jī)舰涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朱躺,“玉大人搁痛,你說我怎么就攤上這事÷渥罚” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵巢钓,是天一觀的道長疗垛。 經(jīng)常有香客問我,道長贷腕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任瞒斩,我火速辦了婚禮,結(jié)果婚禮上胸囱,老公的妹妹穿的比我還像新娘瀑梗。我一直安慰自己,他們只是感情好抛丽,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允蜈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陷寝。 梳的紋絲不亂的頭發(fā)上凤跑,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天叛复,我揣著相機(jī)與錄音,去河邊找鬼褐奥。 笑死,一個胖子當(dāng)著我的面吹牛撬码,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夫否,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼叫胁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驼鹅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤输钩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后买乃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼绑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年抖韩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂浮。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顽馋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寸谜,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布熊痴,位于F島的核電站聂宾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏系谐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一惜论、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馆类,春花似錦、人聲如沸乾巧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽植康。三九已至,卻和暖如春销睁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冻记。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留演顾,地道東北人供搀。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓葛虐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屿脐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容