NeHe OpenGL第二十五課 變形

2021-09-22 04:10:17 字數 3640 閱讀 9544

nehe opengl第二十五課:變形

變形和從檔案中載入3d物體:

在這一課中,你將學會如何從檔案載入3d模型,並且平滑的從乙個模型變換為另乙個模型。

歡迎來到這激動人心的一課,在這一課裡,我們將介紹模型的變形。需要注意的是各個模型必須要有相同的頂點,才能一一對應,並應用變形。

在這一課裡,我們同樣要教會你如何從乙個檔案中讀取模型資料。

檔案開始的部分和前面一樣,沒有任何變化。  

我們結下來新增幾個旋轉變數,用來記錄旋轉的資訊。並使用cx,cy,cz設定物體在螢幕上的位置。

變數key用來記錄當前的模型,step用來設定相鄰變形之間的中間步驟。如step為200,則需要200次,才能把乙個物體變為另乙個物體。

最後我們用乙個變數來設定是否使用變形。  

glfloat  xrot,yrot,zrot,        // x, y & z 軸的旋轉角度

xspeed,yspeed,zspeed,       // x, y & z 軸的旋轉速度

cx,cy,cz=-15;        // 物體的位置

int  key=1;         // 物體的識別符號

int  step=0,steps=200;        // 變換的步數

bool  morph=false;        // 是否使用變形

下面的結構定義乙個三維頂點  

typedef struct     

vertex;       

下面的結構使用頂點來描述乙個三維物體  

typedef struct          // 物體結構

object;          

maxver用來記錄各個物體中最大的頂點數,如乙個物體使用5個頂點,另乙個物體使用20個頂點,那麼物體的頂點個數為20。

結下來定義了四個我們使用的模型物體,並把相鄰模型變形的中間狀態儲存在helper中,sour儲存原模型物體,dest儲存將要變形的模型物體。  

int  maxver;         // 最大的頂點數

object  morph1,morph2,morph3,morph4,      // 我們的四個物體

helper,*sour,*dest;        // 幫助物體,原物體,目標物體

wndproc()函式沒有變化  

下面的函式用來為模型分配儲存頂點資料的記憶體空間  

void objallocate(object *k,int n)

下面的函式用來釋放為模型分配的記憶體空間  

void objfree(object *k)   

下面的**用來讀取檔案中的一行。

我們用乙個迴圈來讀取字元,最多讀取255個字元,當遇到'\n'回車時,停止讀取並立即返回。  

void readstr(file *f,char *string)       // 讀取一行字元

while ((string[0] == '/') || (string[0] == '\n'));    // 遇到回車則停止讀取

return;         // 返回}

下面的**用來載入乙個模型檔案,並為模型分配記憶體,把資料儲存進去。  

void objload(char *name,object *k)       // 從檔案載入乙個模型

fclose(filein);         // 關閉檔案

if(ver>maxver) maxver=ver;        // 記錄最大的頂點數

}          

下面的函式根據設定的間隔,計算第i個頂點每次變換的位移  

vertex calculate(int i)         // 計算第i個頂點每次變換的位移

resizeglscene()函式沒有變化  

glvoid resizeglscene(glsizei width, glsizei height)

下面的函式完成初始化功能,它設定混合模式為半透明  

int initgl(glvoid)   

初始化中間模型為球體,並把原和目標模型都設定為球 

objload("data/sphere.txt",&helper);

sour=dest=&morph1;        

return true;         // 初始化完成,成功返回}

下面是具體的繪製**,向往常一樣我們先設定模型變化,以便我們更好的觀察。  

void drawglscene(glvoid)

return true; // 一切ok}

killglwindow() 函式基本沒有變化,只是新增釋放5個模型記憶體的**  

objfree(&morph1);        // 釋放模型1記憶體

objfree(&morph2);        // 釋放模型2記憶體

objfree(&morph3);        // 釋放模型3記憶體

objfree(&morph4);        // 釋放模型4記憶體

objfree(&helper);        // 釋放模型5記憶體

createglwindow() 函式沒有變化  

bool createglwindow()  

lresult callback wndproc()

在winmain()函式中,我們新增了一些鍵盤控制的函式  

if(keys[vk_prior])      // pageup鍵是否被按下

zspeed+=0.01f;     // 按下增加繞z軸旋轉的速度

if(keys[vk_next])      // pagedown鍵是否被按下

zspeed-=0.01f;     // 按下減少繞z軸旋轉的速度

if(keys[vk_down])      // 下方向鍵是否被按下

xspeed+=0.01f;     // 按下增加繞x軸旋轉的速度

if(keys[vk_up])      // 上方向鍵是否被按下

xspeed-=0.01f;     // 按下減少繞x軸旋轉的速度

if(keys[vk_right])      // 右方向鍵是否被按下

yspeed+=0.01f;     // 按下增加沿y軸旋轉的速度

if(keys[vk_left])      // 左方向鍵是否被按下

yspeed-=0.01f;     // 按下減少沿y軸旋轉的速度

if (keys['q'])      // q鍵是否被按下

cz-=0.01f;      // 是則向螢幕裡移動

if (keys['z'])      // z鍵是否被按下 

cz+=0.01f;      // 是則向螢幕外移動

if (keys['w'])      // w鍵是否被按下

cy+=0.01f;      // 是則向上移動

if (keys['s'])      // s鍵是否被按下

cy-=0.01f;      // 是則向下移動

if (keys['d'])      // d鍵是否被按下 

cx+=0.01f;      // 是則向右移動

if (keys['a'])      // a鍵是否被按下 

cx-=0.01f;      // 是則向左移動

1,2,3,4鍵用來設定變形的目標模型 

NeHe OpenGL第二十五課 變形

nehe opengl第二十五課 變形 變形和從檔案中載入3d物體 在這一課中,你將學會如何從檔案載入3d模型,並且平滑的從乙個模型變換為另乙個模型。歡迎來到這激動人心的一課,在這一課裡,我們將介紹模型的變形。需要注意的是各個模型必須要有相同的頂點,才能一一對應,並應用變形。在這一課裡,我們同樣要教...

第二十五課 超越抽象極限

1.乙個階躍輸入,後面接戴維南電阻,測量點vout,之後接其他設計電路,末端開路 理論上在同一時刻vout也發生階躍 例如 0到5v 實際上,在t 0是,輸出上公升到一半,持續一段時間才會繼續上公升到5v 這是因為當導線非常長時,需要考慮訊號傳輸時間 脈衝到達末端返回到vo,vo得到乙個回波,兩個2...

第二十五天

程序 資源分配的最小單元 程序的組成 程式 資料和程序控制塊 pcb 所有的排程都是提前準備的 程序的經典三態 執行 就緒 等待 父程序的id ppid 啟動程序的使用者id uid 排程演算法 1.先來先服務 2.短程序優先 3.高優先順序優先 4.時間片輪轉法 一般都是用這個 先來先服務演算法的...