• <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)隊

            搜索

            •  

            積分與排名

            • 積分 - 401321
            • 排名 - 59

            最新評論

            閱讀排行榜

            評論排行榜

            在上節(jié)課的內(nèi)容上作些擴展,我們現(xiàn)在開始生成真正的3D對象,而不是象前兩節(jié)課中那樣3D世界中的2D對象。我們給三角形增加一個左側(cè)面,一個右側(cè)面,一個后側(cè)面來生成一個金字塔(四棱錐)。給正方形增加左、右、上、下及背面生成一個立方體。
               我們混合金字塔上的顏色,創(chuàng)建一個平滑著色的對象。給立方體的每一面則來個不同的顏色。

              int DrawGLScene(GLvoid)                  // 此過程中包括所有的繪制代碼
              {
                   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            // 清除屏幕及深度緩存
                  glLoadIdentity();                 // 重置模型觀察矩陣
                  glTranslatef(-1.5f,0.0f,-6.0f);          // 左移 1.5 單位,并移入屏幕 6.0

                  glRotatef(rtri,0.0f,1.0f,0.0f);          // 繞Y軸旋轉(zhuǎn)金字塔

                  glBegin(GL_TRIANGLES);               // 開始繪制金字塔的各個面

               有些人可能早已在上節(jié)課中的代碼上嘗試自行創(chuàng)建3D對象了。但經(jīng)常有人來信問我:“我的對象怎么不會繞著其自身的軸旋轉(zhuǎn)?看起來總是在滿屏亂轉(zhuǎn)。”要讓您的對象繞自身的軸旋轉(zhuǎn),您必須讓對象的中心坐標(biāo)總是(0.0f,0,0f,0,0f)。
               下面的代碼創(chuàng)建一個繞者其中心軸旋轉(zhuǎn)的金字塔。金字塔的上頂點離中心一個單位,底面離中心也是一個單位。上頂點在底面的投影位于底面的中心。
               注意所有的面 — 三角形都是逆時針次序繪制的。這點十分重要,在以后的課程中我會作出解釋。現(xiàn)在,您只需明白要么都逆時針,要么都順時針,但永遠(yuǎn)不要將兩種次序混在一起,除非您有足夠的理由必須這么做。
            我們開始畫金字塔的前側(cè)面。因為所有的面都共享上頂點,我們將這點在所有的三角形中都設(shè)置為紅色。底邊上的兩個頂點的顏色則是互斥的。前側(cè)面的左下頂點是 綠色的,右下頂點是藍(lán)色的。這樣相鄰右側(cè)面的左下頂點是藍(lán)色的,右下頂點是綠色的。這樣四邊形的底面上的點的顏色都是間隔排列的。

                      glColor3f(1.0f,0.0f,0.0f);         // 紅色
                      glVertex3f( 0.0f, 1.0f, 0.0f);       // 三角形的上頂點 (前側(cè)面)
                      glColor3f(0.0f,1.0f,0.0f);         // 綠色
                      glVertex3f(-1.0f,-1.0f, 1.0f);       // 三角形的左下頂點 (前側(cè)面)
                      glColor3f(0.0f,0.0f,1.0f);         // 藍(lán)色
                      glVertex3f( 1.0f,-1.0f, 1.0f);       // 三角形的右下頂點 (前側(cè)面)

               現(xiàn)在繪制右側(cè)面。注意其底邊上的兩個頂點的X坐標(biāo)位于中心右側(cè)的一個單位處。頂點則位于Y軸上的一單位處,且Z坐標(biāo)正好處于底邊的兩頂點的Z坐標(biāo)中心。右側(cè)面從上頂點開始向外側(cè)傾斜至底邊上。
               這次的左下頂點用藍(lán)色繪制,以保持與前側(cè)面的右下頂點的一致。藍(lán)色將從這個角向金字塔的前側(cè)面和右側(cè)面擴展并與其他顏色混合。
               還應(yīng)注意到后面的三個側(cè)面和前側(cè)面處于同一個glBegin(GL_TRIANGLES)和glEnd()語句中間。因為我們是通過三角形來構(gòu)造這個金字塔的。OpenGL知道每三個點構(gòu)成一個三角形。當(dāng)它畫完一個三角形之后,如果還有余下的點出現(xiàn),它就以為新的三角形要開始繪制了。OpenGL在這里并不會將四點畫成一個四邊形,而是假定新的三角形開始了。所以千萬不要無意中增加任何多余的點。
               現(xiàn)在是后側(cè)面。再次切換顏色。左下頂點又回到綠色,因為后側(cè)面與右側(cè)面共享這個角。

                      glColor3f(1.0f,0.0f,0.0f);         // 紅色
                      glVertex3f( 0.0f, 1.0f, 0.0f);       // 三角形的上頂點 (后側(cè)面)
                      glColor3f(0.0f,1.0f,0.0f);         // 綠色
                      glVertex3f( 1.0f,-1.0f, -1.0f);      // 三角形的左下頂點 (后側(cè)面)
                      glColor3f(0.0f,0.0f,1.0f);         // 藍(lán)色
                      glVertex3f(-1.0f,-1.0f, -1.0f);      // 三角形的右下頂點 (后側(cè)面)

               最后畫左側(cè)面。又要切換顏色。左下頂點是藍(lán)色,與后側(cè)面的右下頂點相同。右下頂點是藍(lán)色,與前側(cè)面的左下頂點相同。
               到這里金字塔就畫完了。因為金字塔只繞著Y軸旋轉(zhuǎn),我們永遠(yuǎn)都看不見底面,因而沒有必要添加底面。如果您覺得有經(jīng)驗了,嘗試增加底面(正方形),并將金字塔繞X軸旋轉(zhuǎn)來看看您是否作對了。確保底面四個頂點的顏色與側(cè)面的顏色相匹配。

                      glColor3f(1.0f,0.0f,0.0f);         // 紅色
                      glVertex3f( 0.0f, 1.0f, 0.0f);       // 三角形的上頂點 (左側(cè)面)
                      glColor3f(0.0f,0.0f,1.0f);         // 藍(lán)色
                      glVertex3f(-1.0f,-1.0f,-1.0f);       // 三角形的左下頂點 (左側(cè)面)
                      glColor3f(0.0f,1.0f,0.0f);         // 綠色
                      glVertex3f(-1.0f,-1.0f, 1.0f);       // 三角形的右下頂點 (左側(cè)面)
                  glEnd();                      //金字塔繪制結(jié)束

               接下來開始畫立方體。他由六個四邊形組成。所有的四邊形都以逆時針次序繪制。就是說先畫右上角,然后左上角、左下角、最后右下角。您也許認(rèn)為畫立方體的背面的時候這個次序看起來好像順時針,但別忘了我們從立方體的背后看背面的時候,與您現(xiàn)在所想的正好相反。(譯者:您是從立方體的外面來觀察立方體的)。
               注意到這次我們將立方體移地更遠(yuǎn)離屏幕了。因為立方體的大小要比金字塔大,同樣移入6個單位時,立方體看起來要大的多。這是透視的緣故。越遠(yuǎn)的對象看起來越小。

                  glLoadIdentity();
                   glTranslatef(1.5f,0.0f,-7.0f);
                       // 先右移再移入屏幕
                  glRotatef(rquad,1.0f,1.0f,1.0f);          // 在XYZ軸上旋轉(zhuǎn)立方體
                  glBegin(GL_QUADS);                 // 開始繪制立方體

               先畫立方體的頂面。從中心上移一單位,注意Y坐標(biāo)始終為一單位,表示這個四邊形與Z軸平行。先畫右上頂點,向右一單位,再屏幕向里一單位。然后左上頂點,向左一單位,再屏幕向里一單位。然后是靠近觀察者的左下和右下頂點。就是屏幕往外一單位。

                      glColor3f(0.0f,1.0f,0.0f);         // 顏色改為藍(lán)色
            ?         ?glVertex3f( 1.0f, 1.0f,-1.0f);       // 四邊形的右上頂點 (頂面)
                      glVertex3f(-1.0f, 1.0f,-1.0f);       // 四邊形的左上頂點 (頂面)
                      glVertex3f(-1.0f, 1.0f, 1.0f);       // 四邊形的左下頂點 (頂面)
                      glVertex3f( 1.0f, 1.0f, 1.0f);       // 四邊形的右下頂點 (頂面)

               底面的畫法和頂面十分類似。只是Y坐標(biāo)變成了-1。如果我們從立方體的下面來看立方體的話,您會注意到右上角離觀察者最近,因此我們先畫離觀察者最近的頂點。然后是左上頂點最后才是屏幕里面的左下和右下頂點。
               如果您真的不在乎繪制多邊形的次序(順時針或者逆時針)的話,您可以直接拷貝頂面的代碼,將Y坐標(biāo)從1改成-1,也能夠工作。但一旦您進(jìn)入象紋理映射這樣的領(lǐng)域時,忽略繪制次序會導(dǎo)致十分怪異的結(jié)果。

                      glColor3f(1.0f,0.5f,0.0f);         // 顏色改成橙色
                      glVertex3f( 1.0f,-1.0f, 1.0f);       // 四邊形的右上頂點(底面)
                      glVertex3f(-1.0f,-1.0f, 1.0f);       // 四邊形的左上頂點(底面)
                      glVertex3f(-1.0f,-1.0f,-1.0f);       // 四邊形的左下頂點(底面)
                      glVertex3f( 1.0f,-1.0f,-1.0f);       // 四邊形的右下頂點(底面)

               接著畫立方體的前面。保持Z坐標(biāo)為一單位,前面正對著我們。

                      glColor3f(1.0f,0.0f,0.0f);         // 顏色改成紅色
                      glVertex3f( 1.0f, 1.0f, 1.0f);       // 四邊形的右上頂點(前面)
                      glVertex3f(-1.0f, 1.0f, 1.0f);       // 四邊形的左上頂點(前面)
                      glVertex3f(-1.0f,-1.0f, 1.0f);       // 四邊形的左下頂點(前面)
                      glVertex3f( 1.0f,-1.0f, 1.0f);       // 四邊形的右下頂點(前面)

               立方體后面的繪制方法與前面類似。只是位于屏幕的里面。注意Z坐標(biāo)現(xiàn)在保持-1不變。

                      glColor3f(1.0f,1.0f,0.0f);         // 顏色改成黃色
                      glVertex3f( 1.0f,-1.0f,-1.0f);       // 四邊形的右上頂點(后面)
                      glVertex3f(-1.0f,-1.0f,-1.0f);       // 四邊形的左上頂點(后面)
                      glVertex3f(-1.0f, 1.0f,-1.0f);       // 四邊形的左下頂點(后面)
                      glVertex3f( 1.0f, 1.0f,-1.0f);       // 四邊形的右下頂點(后面)

               還剩兩個面就完成了。您會注意到總有一個坐標(biāo)保持不變。這一次換成了X坐標(biāo)。因為我們在畫左側(cè)面。

                      glColor3f(0.0f,0.0f,1.0f);         // 顏色改成藍(lán)色
                      glVertex3f(-1.0f, 1.0f, 1.0f);       // 四邊形的右上頂點(左面)
                      glVertex3f(-1.0f, 1.0f,-1.0f);       // 四邊形的左上頂點(左面)
                      glVertex3f(-1.0f,-1.0f,-1.0f);       // 四邊形的左下頂點(左面)
                      glVertex3f(-1.0f,-1.0f, 1.0f);       // 四邊形的右下頂點(左面)

               立方體的最后一個面了。X坐標(biāo)保持為一單位。逆時針繪制。您愿意的話,留著這個面不畫也可以,這樣就是一個盒子。
               或者您要是有興趣可以改變立方體所有頂點的色彩值,象金字塔那樣混合顏色。您會看見一個非常漂亮的彩色立方體,各種顏色在它的各個表面流淌。

                      glColor3f(1.0f,0.0f,1.0f);        // 顏色改成紫羅蘭色
                      glVertex3f( 1.0f, 1.0f,-1.0f);      // 四邊形的右上頂點(右面)
                      glVertex3f( 1.0f, 1.0f, 1.0f);      // 四邊形的左上頂點(右面)
                      glVertex3f( 1.0f,-1.0f, 1.0f);      // 四邊形的左下頂點(右面)
                      glVertex3f( 1.0f,-1.0f,-1.0f);      // 四邊形的右下頂點(右面)
                  glEnd();                     // 立方體繪制結(jié)束

                  rtri+=0.2f;                    // 增加三角形的旋轉(zhuǎn)變量(新增)
                  rquad-=0.15f;                   // 減少四邊形的旋轉(zhuǎn)變量(新增)
                  return TRUE;                   // 繼續(xù)運行
              }

            posted on 2007-12-10 11:38 sdfasdf 閱讀(688) 評論(0)  編輯 收藏 引用 所屬分類: OPENGL
            久久精品国产第一区二区三区| 嫩草影院久久国产精品| 亚洲国产婷婷香蕉久久久久久| 精品多毛少妇人妻AV免费久久| 久久影视国产亚洲| 久久久久久久久无码精品亚洲日韩| 精品熟女少妇a∨免费久久| 品成人欧美大片久久国产欧美| 思思久久99热只有频精品66| 老色鬼久久亚洲AV综合| 九九热久久免费视频| 国产午夜精品理论片久久影视| 亚洲国产天堂久久久久久| 99久久亚洲综合精品网站| 精品久久久久久成人AV| 伊人久久精品影院| 久久精品国产99久久丝袜| 久久天堂电影网| 久久精品中文騷妇女内射| 久久精品卫校国产小美女| 久久国产精品偷99| 国产精品免费看久久久香蕉| 国产三级久久久精品麻豆三级 | 国产精品久久久久蜜芽| 久久精品一区二区三区不卡| 久久综合久久自在自线精品自| 香蕉99久久国产综合精品宅男自 | 久久久SS麻豆欧美国产日韩| 欧洲性大片xxxxx久久久| 国产精品热久久无码av| 亚洲国产精品久久久久久| 人人狠狠综合久久亚洲婷婷| 97久久精品人妻人人搡人人玩 | 亚洲αv久久久噜噜噜噜噜| 国产精品99久久久精品无码| 欧美与黑人午夜性猛交久久久| 久久久久久国产a免费观看不卡| 精品久久久久久国产免费了| 久久精品国产色蜜蜜麻豆| 久久人妻少妇嫩草AV无码蜜桃| 久久人搡人人玩人妻精品首页 |