青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁 :: 聯系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 402530
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

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

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

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

  
 好了我們現在開始搞InitGL()函數。我們打算增加3行代碼用來初始化我們的二次曲面。這3行代碼將在你使1號光源有效后增加,但是要在返回之前。第一行代碼將初始化二次曲面并且創建一個指向改二次曲面的指針,如果改二次曲面不能被創建的話,那么該指針就是NULL。第二行代碼將在二次曲面的表面創建平滑的法向量,這樣當燈光照上去的時候將會好看些。另外一些可能的取值是:GLU_NONE和GLU_FLAT。最后我們使在二次曲面表面的紋理映射有效。 
  

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

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();                   
}

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

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

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

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

    case 2:                            // 繪制圓盤
        gluDisk(quadratic,0.5f,1.5f,32,32);       
        break;                       
  
 我們的第4個對象我知道你們為描述它耗盡精力。就是球。繪制球將會變的非常簡單。參數1是球的半徑。如果你無法理解半徑/直徑等等的話,可以理解成物體中心到物體外部的距離,在這里我們使用1.3F作為半徑。接下來兩個參數就是細分了,和圓柱體一樣,參數2是緯線,參數3是經線。細分越多球看起來就越平滑,通常球需要多一些的細分以使他們看起來平滑。
 
  

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

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

    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;            // 記錄這個狀態
                }

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

 


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

Feedback

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线观看国产日韩| 欧美日韩精品一区二区| 欧美一区二区三区免费视| 久久久久久91香蕉国产| 国产精品人人做人人爽 | 尤物精品在线| 亚洲午夜激情在线| 亚洲国产一二三| 欧美一区二区三区四区视频| 欧美视频一区在线| 一区二区三区波多野结衣在线观看| 久久婷婷国产综合尤物精品| 亚洲香蕉成视频在线观看| 欧美噜噜久久久xxx| 日韩视频三区| 亚洲国产精品热久久| 男女av一区三区二区色多| 在线观看欧美日韩| 欧美成人国产一区二区| 久久女同互慰一区二区三区| 韩曰欧美视频免费观看| 美国十次成人| 免费在线一区二区| 日韩视频在线免费| 亚洲精品一区二区三区四区高清 | 裸体丰满少妇做受久久99精品| 性欧美大战久久久久久久免费观看| 国产精品亚洲成人| 久久久噜噜噜久噜久久| 久久久久久久一区| 亚洲精品久久久久久久久| 亚洲韩国青草视频| 欧美三级不卡| 欧美在线视频网站| 久久视频国产精品免费视频在线| 亚洲国产二区| 日韩亚洲精品电影| 国产亚洲毛片| 亚洲欧洲在线视频| 国产午夜精品久久久久久免费视 | 久久精品国产精品亚洲综合| 欧美亚洲一区二区在线| 午夜国产欧美理论在线播放| 亚洲午夜久久久| 国产亚洲精品自拍| 亚洲国产精品久久久久久女王 | 亚洲一区二区三区欧美| 亚洲欧美电影在线观看| 激情综合亚洲| 亚洲美女淫视频| 国产一区二区三区日韩| 亚洲人成网站影音先锋播放| 国产精品九九久久久久久久| 久久综合给合久久狠狠色| 久久最新视频| 午夜宅男久久久| 欧美高清在线一区二区| 亚洲一卡久久| 免费日韩成人| 久久五月激情| 国产精品爽黄69| 亚洲另类黄色| 亚洲高清视频在线| 亚洲小少妇裸体bbw| 亚洲伦理在线观看| 久久久青草婷婷精品综合日韩| 一本色道婷婷久久欧美| 久久精品国产69国产精品亚洲| 亚洲神马久久| 鲁大师影院一区二区三区| 亚洲欧美一区二区精品久久久| 麻豆av一区二区三区| 亚洲欧美日本视频在线观看| 欧美电影免费观看高清| 久久久精品五月天| 欧美丝袜第一区| 亚洲另类春色国产| 日韩午夜在线视频| 免费观看国产成人| 久久婷婷一区| 黄色一区二区三区| 午夜精品久久久久久久99热浪潮 | 亚洲国产精品久久精品怡红院| 国产亚洲女人久久久久毛片| 亚洲一区免费网站| 亚洲午夜在线| 欧美色中文字幕| 亚洲免费观看高清在线观看 | 99视频超级精品| 麻豆国产精品777777在线| 老司机精品福利视频| 国产综合视频在线观看| 亚洲欧美日韩国产精品| 亚洲一区二区三区精品在线| 欧美精品aa| 亚洲精品视频在线看| 一区二区三区视频在线看| 欧美日韩一本到| 亚洲午夜女主播在线直播| 欧美一区二区精美| 国产在线拍揄自揄视频不卡99| 欧美在线视频观看免费网站| 久久精品国产精品亚洲综合 | 欧美午夜免费| 一区二区三区精品视频| 亚洲一区二区三区中文字幕在线| 欧美日韩午夜精品| 亚洲伊人观看| 久久久久久久久久久成人| 国产一区二区三区在线观看网站| 亚洲一区二区精品| 久久国产精品一区二区三区| 国产在线播放一区二区三区| 久久九九99视频| 欧美激情中文不卡| 亚洲性人人天天夜夜摸| 国产日韩欧美视频| 开元免费观看欧美电视剧网站| 欧美成人网在线| 在线视频欧美日韩精品| 国产精品嫩草影院一区二区| 校园春色综合网| 亚洲高清资源| 午夜精品短视频| 在线精品国产欧美| 欧美日韩国产黄| 欧美一区二区观看视频| 亚洲大胆在线| 性18欧美另类| 亚洲精选国产| 国产亚洲人成a一在线v站| 欧美77777| 性久久久久久久久久久久| 亚洲大胆视频| 久久久五月婷婷| 亚洲精品久久久蜜桃| 国产欧美一级| 欧美日韩国产美| 久久久亚洲高清| 国产精品99久久久久久久女警 | 一区视频在线看| 欧美日韩精品欧美日韩精品一 | 农村妇女精品| 亚洲在线视频| 亚洲国产精品一区| 久久成人免费网| 一区二区三区 在线观看视| 国产视频久久| 欧美日韩妖精视频| 蜜桃av一区二区在线观看| 亚洲一级电影| 亚洲美女精品一区| 蜜臀久久99精品久久久久久9| 亚洲一区二区三区影院| 在线观看日韩av电影| 国产精品电影观看| 欧美国产日韩一二三区| 久久久久久久国产| 亚洲欧美日韩国产成人| 日韩一级大片| 亚洲黄色在线看| 欧美激情国产精品| 久久久久国产免费免费| 亚洲女人天堂成人av在线| 99国产精品久久久久久久久久 | 亚洲经典三级| 一本色道婷婷久久欧美| 亚洲精品一二区| 国产一区二区三区黄视频| 欧美日韩亚洲国产精品| 美女图片一区二区| 久久精品日产第一区二区| 亚洲午夜在线| 亚洲一区二区三区四区视频| 亚洲欧洲日本在线| 亚洲国产欧美一区二区三区久久 | 小处雏高清一区二区三区| 一区二区三区蜜桃网| 亚洲看片网站| 亚洲欧洲日产国产网站| 亚洲国产精品久久人人爱蜜臀 | 久久综合久久综合九色| 久久国产主播| 久久免费国产精品| 麻豆av福利av久久av| 麻豆91精品| 亚洲国产成人av| 亚洲二区在线视频| 亚洲精品日韩在线| 一本到高清视频免费精品| 日韩一区二区精品| 亚洲一区在线直播| 久久不射网站| 另类尿喷潮videofree| 欧美国产精品人人做人人爱| 欧美精品在线观看播放| 欧美日韩一卡二卡| 国产精品乱人伦一区二区| 国产日本精品| 亚洲国产成人av在线|