主題介紹
轉動吧,九大行星
過程與成果展示
因為要畫成立體的,所以上網找了很多資料
其中,這個網頁 OpenGL入门学习
真的是個好幫手
透過這個網站的講解
我學會了設定光源和材質
裡面有很詳細的解說,透過幾次的測試之後
就發現使用的很得心應手了
另外也去查詢了類似MFC中Timer功能的函式
Glut函式說明2
這裡面有很多glut的函式
只要找要適合的,再去另外google用法就好了,超方便的 :P
用此函式取得的毫秒值,再去除除除,除到差不多適合的速度
我是先除1000再乘20,這個速度我覺得看起來比較順眼 = =
設定好光源和材質後
就開始畫九大行星與衛星(月亮)
一開始以原尺寸畫了一顆太陽,結果整個視窗都是黃的,完全被擋住
故我將太陽縮小了很多倍(以不擋住其他星球為原則)
九大行星互相之間是維持原始比例
而月亮則為了方便觀看起見,也不是照原比例
去維基百科搜尋了九大行星的各軸旋轉角度、半徑大小、公轉自轉周期等
如下表所示:
每顆星球的Matrix大致如下
以地球為標準算出各變數
glRotated(X,0,1,0); //以太陽為中心公轉,公轉週期 angle/行星的公轉週期(年)
glTranslated(XX,XX,XX);
glRotated(90,1,0,0); //X軸角度
glRotated(XXX,0,1,0); //赤道傾斜角度
glRotated(XXX,0,0,1); //自轉週期,以10天為基準
glutSolidSphere(XXX,20,20); //半徑大小,與地球比較
glTranslated(XX,XX,XX);
glRotated(90,1,0,0); //X軸角度
glRotated(XXX,0,1,0); //赤道傾斜角度
glRotated(XXX,0,0,1); //自轉週期,以10天為基準
glutSolidSphere(XXX,20,20); //半徑大小,與地球比較
其中glutSolidSphere用來畫"球體"
而 glutSolidTorus用來畫"面"
也就是土星的環
一開始我就直接將太陽放在原點,這樣公轉的時候就可以直接繞原點
省了很多麻煩
但...
將個星球依序畫下去
會出現幾顆星球因體積較大而互相遮蓋的問題
所以我後來
將土星與海王星移到-x的位置上
雖然不像wiki上的圖,是成一直線的
但為了方便看清楚各星球,我想,做這樣的調整應該是OK的
以下是我這次作業的程式架構
看了學長的網誌之後,我也增加了鍵盤控制的部分
分為兩部分:
KeyboardFunc()的部分
按下 x,X 可旋轉x軸
按下 y,Y 可旋轉y軸
按下 z,Z 可旋轉z軸
因要旋轉各軸
故我寫入了
glRotatef(x, 0.0, 1.0, 0.0);
glRotatef(y, 1.0, 0.0, 0.0);
glRotatef(z, 0.0, 0.0, 1.0);
glRotatef(y, 1.0, 0.0, 0.0);
glRotatef(z, 0.0, 0.0, 1.0);
來作旋轉
按下 + 可加快轉動速度
按下 - 可減緩轉動速度
而SpecialFunc()的部分
按下 ↑ 可放大地球與月亮的體積
按下 ↓ 可減小地球與月亮的體積
此功能是利用glScalef來完成
主要是為了方便觀看衛星繞地球而增加的
最後在加上,按下Esc可關閉視窗
因為每次測試都要用滑鼠點視窗右上角的X
增加了這個功能之後就可以稍微偷懶一下不要用滑鼠
以下影片為作業展示
心得與討論
一開始在研究光源與材質時
吃了很多苦頭
常常因為光源位置設錯
導致顏色變得很奇怪
甚至轉個角度,星球就消失了
經過這個作業的練習
對於光源與材質的運用算是熟練了
希望在往後的作業可以多多運用到這次所學習到的知識
另外一個遇到的問題就是在算個星球公轉自轉週期等計算
雖然wiki上的表格都有列出週期
但轉換成可以應用在作業上的角度時間時,常常鬼打牆一直算錯
導致轉得很奇怪
這次作業耗最多時間就是在理解
glTranslated和glRotated
誰先誰後造成的差異
寫到最後變得有點似懂非懂
都用測試的方法把它做到對
自己接下來會在多花一點時間去理解他
本來想用貼圖貼在星球上,使他看起來更逼真
但怎麼貼都不成功
上網查了很多資料,似乎是VS2008不支援glaux.lib
網友們提共了很多解決方法,但我都不適用
希望能盡快解決這個問題
下一個作業就可以應用這項技巧了
本來想用貼圖貼在星球上,使他看起來更逼真
但怎麼貼都不成功
上網查了很多資料,似乎是VS2008不支援glaux.lib
網友們提共了很多解決方法,但我都不適用
希望能盡快解決這個問題
下一個作業就可以應用這項技巧了

沒有留言:
張貼留言