• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

              C++博客 :: 首頁 :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團(tuán)隊

            搜索

            •  

            積分與排名

            • 積分 - 401324
            • 排名 - 59

            最新評論

            閱讀排行榜

            評論排行榜

            二次曲面是一種畫復(fù)合對象的方法,這種方法通常并不需要很多的三角形。我們將要使用第七課的代碼。我們將要增加7個變量以及修改紋理以增加一些變化 : 
              

            bool    sp;                        // 空格鍵是否按下

            int    part1;                        // 圓盤的起始角度
            int    part2;                        // 圓盤的結(jié)束角度
            int    p1=0;                        // 增量1
            int    p2=1;                        // 增量1
            GLUquadricObj *quadratic;                    // 二次幾何體
            GLuint  object=0;                        // 二次幾何體標(biāo)示符

              
             好了我們現(xiàn)在開始搞InitGL()函數(shù)。我們打算增加3行代碼用來初始化我們的二次曲面。這3行代碼將在你使1號光源有效后增加,但是要在返回之前。第一行代碼將初始化二次曲面并且創(chuàng)建一個指向改二次曲面的指針,如果改二次曲面不能被創(chuàng)建的話,那么該指針就是NULL。第二行代碼將在二次曲面的表面創(chuàng)建平滑的法向量,這樣當(dāng)燈光照上去的時候?qū)每葱A硗庖恍┛赡艿娜≈凳牵篏LU_NONE和GLU_FLAT。最后我們使在二次曲面表面的紋理映射有效。 
              

                quadratic=gluNewQuadric();                // 創(chuàng)建二次幾何體
                gluQuadricNormals(quadratic, GLU_SMOOTH);        // 使用平滑法線
                gluQuadricTexture(quadratic, GL_TRUE);        // 使用紋理
              
             現(xiàn)在我決定在本課里保留立方體,這樣你可以看到紋理是如何映射到二次曲面對象上的。而且我打算將繪制立方體的代碼定義為一個單獨(dú)的函數(shù),這樣我們在定義函數(shù)Draw()的時候它將會變的不那么凌亂。每個人都應(yīng)該記住這些代碼: 
              

            GLvoid glDrawCube()                    // 繪制立方體
            {
                    glBegin(GL_QUADS);           
                    // 前面
                    glNormal3f( 0.0f, 0.0f, 1.0f);       
                    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);   
                    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);   
                    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);   
                    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);   
                    // 后面
                    glNormal3f( 0.0f, 0.0f,-1.0f);       
                    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);   
                    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);   
                    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);   
                    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);   
                    // 上面
                    glNormal3f( 0.0f, 1.0f, 0.0f);       
                    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);   
                    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);   
                    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);   
                    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);   
                    // 下面
                    glNormal3f( 0.0f,-1.0f, 0.0f);       
                    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);   
                    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);   
                    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);   
                    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);   
                    // 右面
                    glNormal3f( 1.0f, 0.0f, 0.0f);       
                    glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);   
                    glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);   
                    glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);   
                    glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);   
                    // 左面
                    glNormal3f(-1.0f, 0.0f, 0.0f);       
                    glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);   
                    glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);   
                    glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);   
                    glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);   
                glEnd();                   
            }

              
             接下來就是場景繪制函數(shù)了,在這里我只寫一個簡單的例子。并且當(dāng)我繪制一個部分的盤子的時候,我將使用一個靜態(tài)變量(一個局部的變量,該變量可以保留他的值不論你任何時候調(diào)用他)來表達(dá)一個非常酷的效果。為了清晰起見我將要重寫DrawGLScene函數(shù)。
               你們將會注意到當(dāng)我討論這些正在使用的參數(shù)時我忽略了當(dāng)前函數(shù)的第一個參數(shù)(quadratic)。這個參數(shù)將被除立方體外的所有對象使用。所以當(dāng)我討論這些參數(shù)的時候我忽略了它。 
              

            int DrawGLScene(GLvoid)                       
            {
                    //...
            // 這部分是新增加的
                switch(object)                        // 繪制哪一種二次幾何體
                {
                case 0:                            // 繪制立方體
                    glDrawCube();                   
                    break;                       

              
             我們創(chuàng)建的第2個對象是一個圓柱體。參數(shù)1(1.0F)是圓柱體的底面半徑,參數(shù)2(1.0F)是圓柱體的餓頂面半徑,參數(shù)3(3.0F)是圓柱體的高度。參數(shù)4(32)是緯線(環(huán)繞Z軸有多少細(xì)分),參數(shù)5(32)是經(jīng)線(沿著Z軸有多少細(xì)分)。細(xì)分越多該對象就越細(xì)致。我們可以用增加細(xì)分的方法來增加對象的多邊形數(shù)。因此你可以犧牲速度換回質(zhì)量(以時間換質(zhì)量),大多數(shù)的時候我們都可以很容易的找到一個合適的“度”。
             
              

                case 1:                            // 繪制圓柱體
                    glTranslatef(0.0f,0.0f,-1.5f);           
                    gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32);   
                    break;                       
              
             對象3將會創(chuàng)建一個CD樣子的盤子。參數(shù)1(0.5F)是盤子的內(nèi)圓半徑,該參數(shù)可以為0,則表示在盤子中間沒孔,內(nèi)圓半徑越大孔越大。參數(shù)2(1.5F)表示外圓半徑,這個參數(shù)必須比內(nèi)圓半徑大。參數(shù)3(32)是組成該盤子的切片的數(shù)量,這個數(shù)量可以想象成披薩餅中的切片的數(shù)量。切片越多,外圓邊緣就越平滑。最后一個參數(shù)(32)是組成盤子的環(huán)的數(shù)量。環(huán)很像唱片上的軌跡,一環(huán)套一環(huán)。這些環(huán)從內(nèi)圓半徑細(xì)分到外圓半徑。再說一次,細(xì)分越多,速度越慢。 
              

                case 2:                            // 繪制圓盤
                    gluDisk(quadratic,0.5f,1.5f,32,32);       
                    break;                       
              
             我們的第4個對象我知道你們?yōu)槊枋鏊谋M精力。就是球。繪制球?qū)兊姆浅:唵巍?shù)1是球的半徑。如果你無法理解半徑/直徑等等的話,可以理解成物體中心到物體外部的距離,在這里我們使用1.3F作為半徑。接下來兩個參數(shù)就是細(xì)分了,和圓柱體一樣,參數(shù)2是緯線,參數(shù)3是經(jīng)線。細(xì)分越多球看起來就越平滑,通常球需要多一些的細(xì)分以使他們看起來平滑。
             
              

                case 3:                            // 繪制球
                    gluSphere(quadratic,1.3f,32,32);       
                    break;                       
              
             我們創(chuàng)建的第4個對象使用與我們曾經(jīng)創(chuàng)建的圓柱體一樣的命令來創(chuàng)建,如果你還記得的話,我們可以通過控制參數(shù)2和參數(shù)3來控制頂面半徑和地面半徑。因此我們可以使頂面半徑為0來繪制一個圓錐體,頂面半徑為0將會在頂面上創(chuàng)建一個點。因此在下面的代碼中,我們使頂面半徑等于0,這將會創(chuàng)建一個點,同時也就創(chuàng)建了我們的圓錐。 
              

                case 4:                            // 繪制圓錐
                    glTranslatef(0.0f,0.0f,-1.5f);           
                    gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32);   
                    break;                       
              
             我們的第6個對象將被gluPartialDisk函數(shù)創(chuàng)建。我們打算創(chuàng)建的這個對象使用了一些命令,這些命令在我們創(chuàng)建對象之前,你將會清楚的看到。但是命令gluPartialDisk擁有兩個新的參數(shù)。第5個參數(shù)是我們想要繪制的部分盤子的開始角度,參數(shù)6是旋轉(zhuǎn)角,也就是轉(zhuǎn)過的角度。我們將要增加旋轉(zhuǎn)角,這將引起盤子沿順時針方向緩慢的被繪制在屏幕上。一旦旋轉(zhuǎn)角達(dá)到360度我們將開始增加開始角度,這樣盤子看起來就想是被逐漸的抹去一樣。我們將重復(fù)這些過程。 
              

                case 5:                            // 繪制部分圓盤
                    part1+=p1;                   
                    part2+=p2;                   

                    if(part1>359)                   
                    {
                        p1=0;                   
                        part1=0;               
                        p2=1;                   
                        part2=0;               
                    }
                    if(part2>359)                   
                    {
                        p1=1;                   
                        p2=0;                   
                    }
                    gluPartialDisk(quadratic,0.5f,1.5f,32,32,part1,part2-part1);   
                    break;                       
                };

                    //...
            }

              
             In the KillGLWindow() section of code, we need to delete the quadratic to free up system resources. We do this with the command gluDeleteQuadratic.  
              

            GLvoid KillGLWindow(GLvoid)                   
            {
                gluDeleteQuadric(quadratic);                // 刪除二次幾何體

              
             在最后,我給出鍵盤輸入代碼。僅僅增加一些對剩余鍵的檢查。
             
              

                            if (keys[' '] && !sp)        // 空格是否按下
                            {
                                sp=TRUE;            // 是,則繪制下一種二次幾何體
                                object++;       
                                if(object>5)       
                                    object=0;   
                            }
                            if (!keys[' '])            // 空格是否釋放
                            {
                                sp=FALSE;            // 記錄這個狀態(tài)
                            }

              
             這就是全部了。現(xiàn)在你可以在OpenGL中繪制二次曲面了。

             


            posted on 2007-12-16 14:25 sdfasdf 閱讀(1018) 評論(1)  編輯 收藏 引用 所屬分類: OPENGL

            Feedback

            # re: NEHE的OPENGL教程 第十八課 二次幾何體 2007-12-17 09:07 書瑗
            頂  回復(fù)  更多評論
              

            亚洲а∨天堂久久精品| 久久久SS麻豆欧美国产日韩| 精品午夜久久福利大片| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 亚洲午夜无码久久久久| 久久精品亚洲中文字幕无码麻豆| av午夜福利一片免费看久久| 久久中文精品无码中文字幕| 久久精品www人人爽人人| 久久精品这里只有精99品| 色欲av伊人久久大香线蕉影院| 伊人久久精品线影院| 久久精品国产亚洲精品2020| 久久亚洲高清综合| 久久超乳爆乳中文字幕| 国产999精品久久久久久| 国产综合久久久久| 亚洲国产精品高清久久久| 久久久精品免费国产四虎| 久久久久亚洲AV无码专区体验| 日本精品久久久久影院日本| 囯产精品久久久久久久久蜜桃| 久久人妻少妇嫩草AV无码专区| 久久国产热这里只有精品| 人妻精品久久无码区| 一本久久a久久精品综合香蕉| 久久久久久免费一区二区三区| 日韩AV毛片精品久久久| 精品久久久无码中文字幕| 免费国产99久久久香蕉| 久久99中文字幕久久| 久久精品免费观看| 久久精品国产亚洲AV麻豆网站| 中文字幕久久精品无码| 久久久久亚洲精品日久生情| 精品国产乱码久久久久软件| 亚洲国产成人久久综合野外| 久久婷婷是五月综合色狠狠| 久久受www免费人成_看片中文| 久久这里只有精品视频99| 国产欧美久久久精品影院|