OpenGL實現三維迷宮遊戲(一)

2021-07-31 14:42:48 字數 2872 閱讀 1042

《計算機圖形學》這門課的第二個實驗,覺得還挺有意思的…

實驗要求

設計乙個opengl程式,建立乙個三維迷宮,支援替身通過一定互動手段在迷宮中漫遊,基本功能包括:

- 迷宮應當至少包含10 * 10 個cell,不能過於簡單,下圖給出一種示例。

- 讀取給定的替身模型,載入到場景中。

- 鍵盤方向鍵控制替身轉向與漫遊。

- 有碰撞檢測,替身不應當穿牆。

- 支援切換第一視角和第三視角進行觀察。

- 迷宮場景中的牆、地面等應貼上紋理。

附加要求(可選擇乙個):

-同時加入二維輔助地圖,替身在三維迷宮探索的同時,在小地圖中顯示已經探索的區域;(我選的是這乙個,其他的由於最近事情比較多就沒有做,以後有機會再補吧…如果有機會的話…=。=)

- 在俯視狀態下,可以通過滑鼠點選替身需要到達的目的地,通過尋徑演算法,控制替身自動到達目的地;

- 迷宮地圖互動編輯功能,例如,可以設計乙個二維地圖編輯器,根據使用者的繪製,拉伸得到三維迷宮場景;

- 其他相當難度,可以增加迷宮遊戲趣味性的功能(需要通過指導老師認可)

實現過程

投影模式採用透視投影,第

一、三視角之間的切換只需改變glulookat(gldouble eyex,gldouble eyey,gldouble eyez,gldouble centerx,gldouble centery,gldouble centerz,gldouble upx,gldouble upy,gldouble upz);的引數值即可。

main()方法:

int main(int argc,char **argv)
init()方法:

void init();

glfloat light0_ambient = ;

glfloat light0_diffuse = ;

gllightfv(gl_light0, gl_position, light0_position);

gllightfv(gl_light0, gl_ambient, light0_ambient);

gllightfv(gl_light0, gl_diffuse, light0_diffuse);

//一檢視光源

glfloat light1_position = ;

glfloat light1_ambient = ;

glfloat light1_diffuse = ;

glfloat light1_specular = ;

gllightfv(gl_light1, gl_position, light1_position);

glenable(gl_lighting);//開啟光照明

glenable(gl_depth_test);

}

引數的初始值:

double lookx=0, looky=0, lookz=15;//相機在世界座標的位置

double centerx = 0, centery = 0, centerz = 0;//相機鏡頭對準的物體在世界座標的位置

double upx = 0, upy = 1, upz = 0;//相機向上的方向在世界座標中的方向

關於gluperspective()的理解推薦看opengl函式思考-gluperspective。glulookat()挺好理解的就不推薦了。

display()方法:

void display()
迷宮我是用對應位置及數量的小立方體拼起來的,所以先宣告了乙個方法drawcube(double x, double y, double z)專門用於繪製立方體。

void drawcube(double x, double y, double z)
畫迷宮我是用陣列存的,因為還要實現同時加入二維輔助地圖,替身在三維迷宮探索的同時,在小地圖中顯示已經探索的區域這個功能。(感覺很弱雞啊…但是也沒想出其他好辦法…好在跑起來不卡…哈…哈…)

宣告陣列int maze[900]用於儲存乙個30x30的迷宮。用0和1初始化陣列。

(初始化陣列的過程趕時間寫的超爛…不放了就…)

void drawmaze()

}glpopmatrix();

//畫地板

glpushmatrix();

glcolor3f(1.0f, 1.0f, 1.0f);

glbegin(gl_quads);

glnormal3f(0.0f, 0.0f, 1.0f);

glvertex3f(14, 15, -20.5);

glvertex3f(-15, 15, -20.5);

glvertex3f(-15, -14.9, -20.5);

glvertex3f(14, -14.9, -20.5);

glend();

glpopmatrix();

}

效果應該就是這樣orz有點醜…貼上紋理會好很多的…

opengl三維程式設計

void gluperspective gldouble fovy,gldouble aspect,gldouble znear,gldouble zfar 引數fovy定義視野在x z平面的角度取值是 0.0,180.0 引數aspect是投影平面寬度與高度的比率 引數znear和zfar分別是近...

opengl三維觀察

1.相機 產生目標場景檢視的變換過程類似於用照相機進行拍照。用照相機進行拍照的步驟大致如下 把照相機固定在三腳架上,並讓它對準場景 檢視變換 對場景進行安排,使各個物體在 中的位置是我們所希望的 模型變換 選擇照相機鏡頭,並調整放大倍數 投影變換 確定最終 的大小 視口變換 完成這些步驟之後,就可以...

三維迷宮問題

通過該圖可以清楚的知道,迷宮的路徑可能有多個,多條,廣度優先總是從距離近到遠進行遍歷,所以可以達到搜尋出最短路徑。3維空間 迷宮問題 int go 3 int maze 30 50 50 bool mark 30 50 50 struct n path 333 void print3 int i 當...