《計算機圖形學》這門課的第二個實驗,覺得還挺有意思的…
實驗要求
設計乙個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 當...