好吧主題有點偷懶,
從上次的平面到現在的三維空間,
讓人能夠以各個方向來觀看一館。
二、成果展示與過程
首先先放上結果圖:
蠻偷懶的,我沒有像其他人一樣連窗戶門戶都以立體的方式慢慢疊起來,我的空間感實在差的很奇妙,每次都會錯亂所以放棄了。
此次作業要求可以從不同角度觀看,我利用了glRotate( 角度 , x, y, z) 來旋轉。
首先以Keyboard的方式,在角度的地方加入變數,再用wasd四個按鍵來控制,a d是以Y軸來旋轉(也就是左右),而w s以X軸來旋轉(上下),這個方法屬於簡單的參數旋轉。
第二個是以MouseMotion來旋轉,首先我宣告了X,Y個別宣告三個參數:rotrecordx、rotrecord、rotx、roty、afrotx、afroty
利用MouseMotion的function,也就是glutMousefunc來取得目前滑鼠在內部的座標,當滑鼠按下時,將x y 記錄到rotx, roty, 而放開的時候則在Motionfunc裡面設置afrotx afroty兩個來記錄放開時的x y 與按下時的座標相差多遠,也就是減去rotx roty,得到的就是你滑鼠移動的向量,當然,向量並不是角度,但是它可以用來知道你滑鼠的位移量,放在rotate裡面可以當作角度的大小,而rotrecord則是必須記錄下你旋轉過後的位置,也就是總位移量,必須記錄從開始到目前總共旋轉了多少的位移量,然後再利用glRotate(rotrecord + afrot , x ,y ,z)就可以輸入旋轉的方向以及旋轉的軸來做滑鼠旋轉囉 ! !
接下來提一下上一次在平面圓柱的問題,在立體的空間中要怎麼畫圓柱呢?
上網找了一下
GLUquadricObj *quadratic;
gluCylinder(quadratic,20,20,20,32,32);
quadratic=gluNewQuadric();
這個是opengl內建的可以用來畫圓柱,我是只換過前三個數字參數 "下圓的半徑、上圓的半徑、圓柱的高度" ,畫完後再利用glTraslatef來位移,此外記得利用glPushMatrix(); glPopMatrix();兩個來包起來,包起來的作用是在你想單獨traslation一個物品的時候可以隔開,不然沒隔起來就會發現整個世界都跟著變了。
glPushMatrix();
glColor3f(0.5,0.5,0.5);
glTranslatef(52,10,30);
glRotatef(90,1.0,0.0,0.0);
GLUquadricObj *quadratic;
quadratic=gluNewQuadric();
gluCylinder(quadratic,15,15,70,20,50);
glPopMatrix();
會變成這樣, 因為畫出來的時候上下兩個口是對著camera的,所以記得轉個90度。
三、心得與感想
從下次開始的作業應該會用到model的製作吧,個人還沒用過3D MAX之類的model製作軟體,挺感興趣的,專題訓練時只有利用glm來讀教授給的obj檔而已,自己做好像很有趣(?)。這次另物體可以旋轉,當然也可以利用LookAt來改變camera的位置以及視角,但是一想到圓的方程之類的我就暫時換掉了,還是簡單易懂的方式好...



對於xz surface:
回覆刪除x=r*sin(wt+phi)+centerx
z=r*cos(wt+phi)+centerz
w,角速度,一次導數為角加速度,用於控制運鏡速度
t,可以看做frame(幀)
centerx,centerz,圓中心座標。
具體的,看微積分,球座標積分那邊的公式。