2012年5月17日 星期四

作業三:遊走元智校園

這次多熟悉了許多openGL的function

首先是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方向,足足想了一個多小時才想到用到單位向量來做移動的計算
總結是上課雖然有很多地方聽不懂,但是真的得經由實作能體會更多東西


沒有留言:

張貼留言