一點小疑問

2021-09-22 11:01:04 字數 4370 閱讀 1377

記得我第一次看nehe教程裡第9課的時候,就被他下面這段**弄暈了:

glrotatef(tilt,1.0f,0.0f,0.0f);                    // tilt the view (using the value in 'tilt')

glrotatef(star[loop].angle,0.0f,1.0f,0.0f);        // rotate to the current stars angle

gltranslatef(star[loop].dist,0.0f,0.0f);        // move forward on the x plane

glrotatef(-star[loop].angle,0.0f,1.0f,0.0f);    // cancel the current stars angle

glrotatef(-tilt,1.0f,0.0f,0.0f);                // cancel the screen tilt

他給出的解釋更是讓我摸不著頭腦:

現在我們來移動星星。星星開始時位於螢幕的中心。我們要做的第一件事是把場景沿y軸旋轉。如果我們旋轉90度的話,x軸不再是自左至右的了,他將由裡向外穿出螢幕。為了讓大家更清楚些,舉個例子。假想您站在房子中間。再設想您左側的牆上寫著-x,前面的牆上寫著-z,右面牆上就是+x咯,您身後的牆上則是+ z。加入整個房子向右轉90度,但您沒有動,那麼前面的牆上將是-x而不再是-z了。所有其他的牆也都跟著移動。-z出現在右側,+z出現在左側,+x出現在您背後。神經錯亂了吧?通過旋轉場景,我們改變了x和z平面的方向。

第二行**沿x軸移動乙個正值。通常x軸上的正值代表移向了螢幕的右側(也就是通常的x軸的正向),但這裡由於我們繞y軸旋轉了座標系,x軸的正向可以是任意方向。如果我們轉180度的話,螢幕的左右側就映象反向了。因此,當我們沿 x軸正向移動時,可能向左,向右,向前或向後。

接著的**帶點小技巧。星星實際上是乙個平面的紋理。現在您在螢幕中心畫了個平面的四邊形然後貼上紋理,這看起來很不錯。一切都如您所想的那樣。但是當您當您沿著y軸轉上個90度的話,紋理在螢幕上就只剩右側和左側的兩條邊朝著您。看起來就是一條細線。這不是我們所想要的。我們希望星星永遠正面朝著我們,而不管螢幕如何旋轉或傾斜。

我們通過在繪製星星之前,抵消對星星所作的任何旋轉來實現這個願望。您可以採用逆序來抵消旋轉。當我們傾斜螢幕時,我們實際上以當前角度旋轉了星星。通過逆序,我們又以當前角度"反旋轉"星星。也就是以當前角度的負值來旋轉星星。就是說,如果我們將星星旋轉了10度的話,又將其旋轉-10度來使星星在那個軸上重新面對螢幕。下面的第一行抵消了沿y軸的旋轉。然後,我們還需要抵消掉沿x軸的螢幕傾斜。要做到這一點,我們只需要將螢幕再旋轉-tilt傾角。在抵消掉x和y軸的旋轉後,星星又完全面對著我們了。

今天又複習到這一課了,還是理解不了他幹嘛要旋轉座標軸,接著又逆向旋轉回去,就和susu討論了下:

phinecos 15:53:12

我感覺他是多餘了,我修改了下**

phinecos 15:53:22

效果也差不多呀

susu 15:53:31

是不是僅在距離上有點變化

phinecos 15:53:38

//glrotatef(tilt,1.0f,0.0f,0.0f);                    // tilt the view (using the value in 'tilt')

glrotatef(star[loop].angle,0.0f,0.0f,1.0f);        // rotate to the current stars angle

gltranslatef(star[loop].dist,0.0f,0.0f);        // move forward on the x plane

//    glrotatef(-star[loop].angle,0.0f,1.0f,0.0f);    // cancel the current stars angle

//    glrotatef(-tilt,1.0f,0.0f,0.0f);                // cancel the screen tilt

susu 15:53:49

我看他唯一沒有抵消的快樂能是dist了

phinecos 15:54:17

沒必要抵消嘛,他把座標軸轉了個90度,我認為沒必要

susu 15:54:31

是啊,轉來轉去的

phinecos 15:54:41

glrotatef(star[loop].angle,0.0f,0.0f,1.0f);    

gltranslatef(star[loop].dist,0.0f,0.0f);        

phinecos 15:55:05

我就這兩句,讓星星圍著z軸轉個角度,再平移個距離

susu 15:55:32

那又沒有那個四邊形沒有正對著照相機?

phinecos 15:56:05

好像沒有呀

phinecos 15:56:21

我再比對下效果看看

susu 15:56:27

對,前面座標軸沒有動

phinecos 15:56:44

哪個座標軸沒動呢?

susu 15:57:01

//glrotatef(tilt,1.0f,0.0f,0.0f);

phinecos 15:57:38

這個座標軸轉個90度到底有啥用處嗎?讓四邊形對著視點?

phinecos 15:58:02

它這是繞x軸轉90度,我想不通

susu 15:58:11 對阿

phinecos 15:59:10

繞x軸轉90度,那y,z軸就互換了,對嗎?

susu 15:59:26 對

phinecos 15:59:34

這裡轉90度,是座標軸轉,還是物體轉呢?

phinecos 15:59:42

我認為是座標軸呢

susu 15:59:46

座標軸吧

phinecos 16:00:31

那y,z軸既然已經換了,那這句:glrotatef(star[loop].angle,0.0f,1.0f,0.0f);    // 旋轉至當前所畫星星的角度;到底是圍著哪條軸轉的?

phinecos 16:01:02

本來應該是繞y軸,可現在z軸在它的位置上,不是變繞z了?

susu 16:01:09

應該是phinecos 16:02:06

gltranslatef(star[loop].dist,0.0f,0.0f);    // 沿x軸正向移動,這裡又繞x軸平移,本來x軸就沒動過,所以前面做的座標軸變換不是白搭了。。。

phinecos 16:02:37

我試下兩種**的效果區別先

susu 16:02:45 是啊

phinecos 16:05:42

汗,我是看不出效果的區別。。。

susu 16:06:00 呵呵

susu 16:06:14

gltranslatef(star[loop].dist,0.0f,0.0f);是不是只做了一遍

phinecos 16:06:28

恩,是的

susu 16:06:43

它應該是使星星分散開的

susu 16:06:58

想明白就可以了,呵呵

phinecos 16:07:08

哦,那下面還有的:        star[loop].dist-=0.01f;

if (star[loop].dist<0.0f)

phinecos 16:07:23

先讓它歸中,然後丟擲去

susu 16:07:34

形成動畫

phinecos 16:08:01

恩,我修改後的**和nehe的效果沒什麼區別,但沒有剛才那麼難理解了

phinecos 16:08:15

剛才它旋轉來,又旋轉回去,暈掉了

susu 16:08:16

呵呵,他可能當時有點暈了

我覺得他先把座標軸繞x軸轉了個90度,這不就讓y,z軸互換了嗎?再讓四邊形繞y軸(我理解這裡應該是旋轉後的z軸了)**己的角度,最後平移自己到中心的距離,可最終他又反向旋轉回去,真是讓人暈,那這樣旋轉座標軸到底有什麼用處呢?不轉還不是一樣,***就修改了他的**,根本不去轉那個該死的座標軸,好像最終效果也差不多呀:

glrotatef(star[loop].angle,0.0f,0.0f,1.0f);        // rotate to the current stars angle

gltranslatef(star[loop].dist,0.0f,0.0f);        // move forward on the x plane

我就讓星星繞z軸**己的角度,再繞x軸平移自己距中心的距離,這樣有什麼問題呢?至少我是想不通。。。

C 中的一點疑問

雖然到如今自己已經學習 c 已經將近半年了,在這學習的半年中,也深刻地體會到了 c 語言的簡單與易用性。雖然也曾經用它開發了一點點不是很像樣的東西。但是始終對其中的一些問題感到有點困惑。先記錄如下,希望在以後的學習與使用中,能夠真正理解其中的內涵。首先,我想談的是 中的屬性機制,雖然這個東西自己在寫...

關於bitset的一點疑問

文件中,基本都是如此定義了bitset的乙個ctor bitset const basic string str,typename basic string size type pos 0,typename basic string size type count basic string npos...

委託和事件的一點疑問?

定義乙個委託 public delegate void analysisformshow dockpane previouspane,dockalignment alignment,double proportion private analysisformshow m formshow publi...