首先是gluPerspective
再來是由正方形替代許多建築物
因此使用了DisplayList的功能
先將一個正方形畫好放在List中
再利用glTranslatef與glScale來調整正方形的位置大小放在適當的地方
六館的圓柱則是用gluCylinder來繪製
再來是利用glLookat在空間中走動
由於有可能先轉動一個視角,再往前或往後走
因此不會只有x軸移動或是只有y軸移動
所以利用了用了相機位置與原點位置算出了向量,而每次移動0.1個單位向量
float vx=centx-lookatx;
float vz=centz-lookatz;
float vLen=pow(vx*vx+vz*vz,(float)0.5);
float unitVX=vx/vLen;
float unitVZ=vz/vLen;
這麼一來就可以行走斜線
最後則是避免判斷穿牆,由於是不規則形,所以寫了兩次的判斷
只有在這兩個區域內才能移動
lookatx+=unitVX*0.1; //移動+0.1個單位向量
lookatz+=unitVZ*0.1;
if(lookatz>=0.2 && lookatx<=1.8 && lookatx>=-0.5 ) //判斷是否穿牆 若無則更新畫面
{
glutPostRedisplay();
}
else if(lookatz>=0.2 && lookatz<=2.2 && lookatx<=1.8)
{
glutPostRedisplay();
}
else //如果穿牆 退回原本的位置
{
lookatx-=unitVX*0.1;
lookatz-=unitVZ*0.1;
}
心得:這次的作業多了很多空間的概念,但是由於空間概念不太好,因此在一開始使用gluPerspective的投影方式試了很多次才弄好
第二個困難的地方則是移動相機位置,一開始都只能移動x方向或是z方向,足足想了一個多小時才想到用到單位向量來做移動的計算
總結是上課雖然有很多地方聽不懂,但是真的得經由實作能體會更多東西