記得在學unity的時候也有講到太陽系的公轉&自轉,當時我還聽到睡著,真是慚愧。

 

程式可以到這裡複製:

实验5 OpenGL模型视图变换 - 慢步前行 - 博客园 (cnblogs.com)

 

這是執行之後的畫面。

image

 

image

我們來看這個程式,第25行到第37行可以想像成是獨立的空間,然後一行一行看。

第27行是畫太陽

第29行是旋轉,四個參數分別是(角度,x,y,z),x就是左右、y是上下、z軸就是前後,可以用右手定則,大拇指指向方向,剩下的四隻手指就是旋轉方向。

 

image

我們來看這個y=1表示大拇指往上,以逆時鐘的方式旋轉,這個小顆的可能會看不太清楚她的自轉方向,我們來看繞者大顆的轉會比較清楚。

 

按下按鈕d,小顆球旋轉。

按下y小顆球繞者大顆球旋轉。

 

看別人講解真的有看沒有懂,只有自己改參數慢慢摸索才有點心得。

 

image

可以把這一段程式分成3個部分,第1個部份他的座標位置是(0,0),在這裡畫出一太陽,第三個部份的glTranslatef(2.0,0.0,0.0)是改變座標位址變成(2,0),glutWireSphere會在太陽的右邊畫出一顆小行星。

 

當我按下y的時候會有反應的是第二部分year的值從0~360,就會轉一圈然後座標軸位置是(0,0)所以是以(0,0)為中心旋轉,太陽因為在glRotatef的上面所以並不會影響到。

當我按下d的時候會有反應的是第三部分day的值從0~360座標軸的位置是(2,0)所以會以(2,0)為中心旋轉,太陽在上面所以不會旋轉。

 

所以Rotatef只會影響到他以下的物件,他以上的物件並不會受到影響。

 

如果我們要在新增一個行星一樣會自轉跟公轉,我們先看一段影片在看程式。

 

按下d

按下y

我們可以發現這並不是我們想要的結果,因為右邊的小球是以左邊的小球為中心旋轉,我們來看為什麼。

注意glTranslatef是相對位置,假設你在2的位置你要回到0點就要輸入-2來到0點,並不能直接輸入0。

image

首先當我按下d的時候會有兩個區塊動作,我們可以看到第33行會以座標(2,0)為中心旋轉,所以你看到右邊的球是正常的那我說過glRotatef會影響到下面,所以左邊球會以座標(2,0)旋轉,那39行的Rotatef影響左邊的行星,會以(-2,0)旋轉,所以左邊的球繞者右邊的球旋轉的時候還是會自轉的,所以只有一個glPushMatrix()是做不出來的(應該喇),下面來改良一下。

可以想成這兩個是在同一個世界但是在不同維度,沒有辦法影響到對方。

image

 

旋轉的部分大概都講完了,可以去改變轉的方向或的是創多個行星來練習。

 

上面有不懂的可以留言問我,如果我會的話(´・ω・`)。

 

arrow
arrow
    創作者介紹
    創作者 讀書小天地 的頭像
    讀書小天地

    書籍分享天地

    讀書小天地 發表在 痞客邦 留言(0) 人氣()