NeHe OpenGL教程 第十一課 飄動的旗幟

2022-03-23 16:13:34 字數 2331 閱讀 5779

**【翻譯】nehe opengl 教程

前言宣告,此 nehe opengl教程系列文章由51部落格yarin

翻譯(2010-08-19),本部落格為**並稍加整理與修改。對nehe的opengl管線教程的編寫,以及yarn的翻譯整理表示感謝。

nehe opengl第十一課:飄動的旗幟

飄動的旗幟:

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

我們將使用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();      // 四邊形繪製結束

上面幾行使用gltexcoord2f()和glvertex3f()載入資料。提醒一點:四邊形是逆時針繪製的。這就是說,您開始所見到的表面是背面。後表面完全填充了,前表面由線條組成。

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

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;      // 返回

}

第十一章 Nginx使用教程

總結 示例 pandas 是基於numpy 的一種工具,該工具是為了解決資料分析任務而建立的。如下 示例 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns impo...

第十一作業

1.文法 g s 1 s ab 2 a da 3 b cc 4 c aadc 5 d b 驗證文法 g s 是不是 ll 1 文法?first集 first da first aadc first d follow集 follow a follow c follow d select集 select...

VBScript教程 第十一課深入VBScript

vb教程 第十一課深入vbwww.cppcns.comscript 學習高階 vbscript 技術的最快程式設計客棧方法是閱讀大量的樣例。同時更好地理解物件模型有助於深入學習 vbscript。您可以從以下部分開始學習 程式設計客棧 activex程式設計客棧?控程式設計客棧件常見問題解答 頁面樣...