第11課 OpenGL 飄動的旗幟

2022-09-02 16:45:14 字數 2592 閱讀 4950

飄動的旗幟:

這一課從第六課的**開始,建立乙個飄動的旗幟。我相信在這課結束的時候,你可以掌握紋理對映和混合操作。

#include //

引入數學函式庫中的sin

我們將使用points陣列來存放網格各頂點獨立的x,y,z座標。這裡網格由45×45點形成,換句話說也就是由44格×44格的小方格仔依次組成了。wiggle_count用來指定紋理波浪的運動速度。每3幀一次看起來很不錯,變數hold將存放乙個用來對旗形波浪進行光滑的浮點數。這幾行新增在程式頭部,位於最後一行#include之後、gluint texture[1]之前的位置。

float points[ 45 ][ 45 ][3];                    //

points網格頂點陣列

int wiggle_count = 0; //

指定旗形波浪的運動速度

glfloat hold;

//臨時變數

然後下移至loadgltextures()子過程。本課中使用的紋理檔名是tim.bmp。找到loadbmp("data/nehe.bmp")這一句,並用loadbmp ("data/tim.bmp")替換它。

if (textureimage[0]=loadbmp("

data/tim.bmp

")) //

載入位圖

接著在initgl()函式的尾部return true之前,新增如下的**。

glpolygonmode( gl_back, gl_fill );            //

後表面完全填充

glpolygonmode( gl_front, gl_line );

//前表面使用線條繪製

上面的**指定使用完全填充模式來填充多邊形區域的背面(譯者:或者叫做後表面吧)。相反,多邊形的正面(譯者:前表面)則使用輪廓線填充了。這些方式完全取決於您的個人喜好。並且與多邊形的方位或者頂點的方向有關。詳情請參考紅寶書(red book)。這裡我順便推銷一本推動我學習opengl的好書 — addison-wesley出版的《programmer's guide to opengl》。個人以為這是學習opengl的無價之寶。

接著上面的**並在return true這一句之前,新增如下的幾行。

//

沿x平面迴圈

for(int x=0; x<45; x++)

}

這裡感謝graham gibbons關於使用整數迴圈變數消除波浪間的脈衝鋸齒的建議。   

上面的兩個迴圈初始化網格上的點。使用整數迴圈可以消除由於浮點運算取整造成的脈衝鋸齒的出現。我們將x和y變數都除以5,再減去4.5。這樣使得我們的波浪可以「居中」(譯者:這樣計算所得結果將落在區間[-4.5,4.5]之間)。   

點[x][y][2]最後的值就是乙個sine函式計算的結果。sin()函式需要乙個弧度參變數。將float_x乘以40.0f,得到角度值。然後除以360.0f再乘以pi,乘以2,就轉換為弧度了。

接著我將徹底重寫drawglscene函式。

int drawglscene(glvoid)                        //

繪製我們的gl場景

}glend();

//四邊形繪製結束

如果您按順時針順序繪製的話,您初始時見到的可能是前表面。也就是說您將看到網格型的紋理效果而不是完全填充的。

if( wiggle_count == 2 )                    //

用來降低波浪速度(每隔2幀一次)

points[

44][y][2]=hold; //

剛才的值成為最左側的波浪值

} wiggle_count = 0; //

計數器清零

} wiggle_count++; //

計數器加一

上面所作的事情是先儲存每一行的第乙個值,然後將波浪左移一下,是圖象產生波浪。儲存的數值挪到末端以產生乙個永無盡頭的波浪紋理效果。然後重置計數器wiggle_count以保持動畫的進行。   

上面的**由nehe(2023年2月)修改過,以消除波浪間出現的細小鋸齒。

xrot+=0.3f;                        //

x 軸旋轉

yrot+=0.2f; //

y 軸旋轉

zrot+=0.4f; //

z 軸旋轉

return true; //

返回}

標準的nehe旋轉增量。現在編譯並執行程式,您將看到乙個漂亮的點陣圖波浪。除了噓聲一片之外,我不敢確信大家的反應。但我希望大家能從這一課中學到點什麼。如果您有任何問題或者需要澄清的地方,請隨便聯絡我。感謝大家。

第04課 OpenGL 旋轉

旋 在這一課裡,我將教會你如何旋轉三角形和四邊形。左圖中的三角形沿y軸旋轉,四邊形沿著x軸旋轉。上一課中我教給您三角形和四邊形的著色。這一課我將教您如何將這些彩色物件繞著座標軸旋轉。其實只需在上節課的 上增加幾行就可以了。下面我將整個例程重寫一遍。方便您知道增加了什麼,修改了什麼。我們增加兩個變數來...

第11課作業

第一題 三位數分解 include include 第11課作業 第一題 三位數分解,知識點 符號的使用 int main 第二題 分離浮點數的整數和小數部分 include include 第11課作業 第二題 分離整數和小數部分,知識點 不同資料型別的轉換,這裡只考慮小數點後有三位的情況 int...

第11課 邊框

邊框 border 可以有多種用途,比如作為裝飾元素或者作為劃分兩物的分界線。在設定邊框方面,css為你提供了無盡選擇。邊框寬度由css屬性border width定義,其值可以是 thin 薄 medium 普通 或 thick 厚 等,也可以是畫素值。如下圖所示 css屬性border colo...