跳到主要內容

發表文章

OpenGL FAQ: 8. 使用視圖與相機鏡頭轉換,及 gluLookAt()

返回 OpenGL FAQ 目錄 8.010 OpenGL裡的相機鏡頭到底是怎麼運作的呢?  就目前的OpenGL來說,沒有相機鏡頭這種東西。更精確地講,相機永遠都位處於眼空間座標的原點 (0,0,0)。你的OpenGL應用程式為了假裝出移動相機的樣子,必須移動場景,對整個世界場景做相機鏡頭的逆空間轉換。 8.020 我要如何移動場景裡的眼睛或者相機鏡頭? 以相機鏡頭模型來說,OpenGL 並沒有提供介面去做這件事情。然而,GLU庫提供了gluLookAt()函數,傳入眼睛本身位置,眼睛瞄準點位置,以及朝上向量,都是世界空間坐標。這個函數依據參數計算出正確的相機逆空間轉換矩陣,並且乘上目前的矩陣。 8.030 我的相機鏡頭應該放在 ModelView 矩陣還是 Projection矩陣? GL_PROJECTION 矩陣只應該包含投影變換,它必須將眼空間坐標(eye space coordinates)轉換到裁切坐標(clip coordinates)。 GL_MODELVIEW矩陣呢,如其名,應該包含模型(modeling)與視圖(viewing)轉換,將物體空間坐標轉換成眼空間座標。所以請記住,永遠把相機鏡頭轉換放在GL_MODELVIEW矩陣,而不是GL_PROJECTION矩陣。 你可以把投影矩陣(projection matrix)想像成相機鏡頭的各種特性,像是視角的寬窄、焦距、用了魚眼鏡頭等等。而把模型視圖矩陣(model-view matrix)想成,你目前拿著相機站立的位置,及鏡頭指向的方向。 這份 The game dev FAQ  對這兩個矩陣說明得很不錯。 去讀讀 Steve Baker 的文章「 濫用投影 」( 備用連結 ) 吧。此篇文章寫得很好,值得推薦。它曾經幫助過許多OpenGL新手程式員。 8.040 我該如何實現鏡頭變焦 (Zoom) 的操作? 簡單的做法是對 ModelView矩陣做等比縮放(uniform scale)。但是當模型放得太大時,通常會導致模型被近平面及遠平面裁切掉。一個比較好的做法是限縮投影矩陣裡view volume的寬與高。舉例來說,你的程式對應使用者的輸入,儲存了一個縮放參數值。當縮放值是1.0 時不變焦。縮放值變大就縮小視角,結果模...

讀書心得: 朱敬一 給青年知識追求者的信

朱敬一先生是少數幾位我聽過的中研院院士的其中之一,可惜不是因為他的研究,而是新聞報導上常常看見朱先生的大名。個人粗淺的印象中,此人敢說敢做,意見頗值得一聽,所以偶然在圖書館翻到這本書,就把它帶回來了。本書總共由十封信組成,內容大略可分為兩半,前五封信是個人治學心得,我覺得相當不錯,後五封信則是對學術圈的建議,可能要有志於學術者讀起來才比較有感覺吧。 整本書看完後,我認為朱敬一先生想要對這個高度專業分工,以致於過於狹隘與僵化的社會提供一點反思,用朱敬一先生的話來說就是: 「你如果專注於其中部分領域而一頭鑽進去,當然是好的,但是你若想遊走諸方而觸類旁通,也沒有什麼不可以」。每當我想著「資訊工程是我的專業」的時候,到底是不是替我自己立下了一道牆,阻止我往外看,而失去了一些激發思想火花的機會。朱敬一是社會學家,所以書裡用很生動的例子來說明這種法政經社本一體的狀況,雖然表面觀察的對象不同,但是底下的氣息卻隱隱互通。 書裡舉了經濟學家拉維(Levitt) 作為這類遊走諸方的學者典型。拉維教授的其中一個研究證明,美國各州到一九九零年左右突然犯罪率大幅下降,其實是肇因於十八年前美國最高法院判定禁止墮胎違憲。墮胎合法化後,許多意外懷孕的女人就不用生下「不想要的小孩」,因而抑止了將來潛在的犯罪者的出生。這樣驚奇的研究結論,實在很難相信出自一位經濟學家之手。不過我看過拉維的例子後,我開始有點相信朱敬一說的,廣博的通識教育帶來的不是顯然可見的解題能力,而是「發掘、形成新問題」的能力。這也是許多台灣學生的弱點,解問題一流,但是不懂得找問題。 而想要有這種能力,就要依靠後天的「不住相讀書」,朱敬一改自金剛經的句子說「學子不住相讀書,其功用不可限量」,讀書不該功利的只求「有用」,不帶目的廣泛的讀書,才能成其大用,在大腦裡面埋下知識火種,也許有一天各個不相干的點會突然串起來,另闢蹊徑。這讓我想起賈伯斯的演講,他就是休學跑去旁聽書法課,我們今天才有漂亮字體的Mac電腦。 書中有段話剛好點醒了我最近的一些迷惘,朱敬一說,到了一定年紀之後,就不要再以「我某某還不夠好」的彌補心態來作為學習的動力,因為知識永遠學不完。最好的方式是一腳踏到浪頭上去,讓自己成為前緣浪花的一部份。 其實不管內容的話,聽聽朱敬一閒聊也是蠻有趣的,裏頭有一段兩三頁就簡單的道出社會科學的本質,文字淺顯清楚,相當精彩...

遲到的 Amazon Kindle DX 電子閱讀器開箱文

Amazon 網路書店出的電子書閱讀器 Kindle DX,當初我看著機子猶豫了很久,一直無法決定要不要買。直到下定決心買下手後,到現在使用超過半年了,我的感想是「真的很不錯」, 雖然有些小缺點,但是瑕不掩瑜。 Kindle DX vs. iPad 首先,廢話不多說,我以「長時間閱讀」來評分,如果紙本閱讀是滿分10分,而螢幕閱讀是0分的話,那我會給這台 Kindle DX 打 7分,蘋果的 iPad 頂多只有 2 分吧。 這是單單以「長時間閱讀」來打的分數。我用 iPad 看完兩本書,Kindle 則是看完十幾本了,閱讀舒適度確實差很多。 iPad 的閱讀體驗跟螢幕差不多,除了拿在手上比較方便以外,所有螢幕的缺點 iPad 都有,像是背光會給眼睛造成負擔,近距離字的邊緣不夠清晰,太陽下會看不清楚等等。 Kindle 的閱讀感覺則已經 90% 像紙面印刷品,這感覺很奇妙,很難形容,我自己覺是最接近的形容就是「字印在墊板上」,不管怎樣 Kindle 使用的電子墨水技術已經甩開了一般印象中螢幕的閱讀體驗,文字邊緣銳利清楚,而且靠自然光閱讀就是舒服,長篇小說讀一整天都沒有問題。 不過除了閱讀以外,Kindle 就一無是處了,我建議絕對不要有任何一絲想用 Kindle 上網、玩遊戲、或者聽音樂等等的不純妄想,Kindle 的長處就是讀書很舒服,而且是唯一的優點。 相較之下 iPad 什麼都好,但就是讀書不好。事實上,我認為「電子書閱讀器」跟「平板電腦」是完完全全兩個不同取向的產品,除了外觀都是一塊板子之外,本質完全不同。 說起買 Kindle DX 的原因,因為小弟我的本業需要閱讀很多的原文文件,而且沒意外的話今年是我最後一年學生生涯,也是有閒暇可以大量閱讀的最後機會,於是心一橫就買下去了。買到現在,原本打算讀的專業書籍沒讀幾本,小說倒是一本接一本看了不少。orz 接下來就幾個方面來討論一下 螢幕尺寸:  Kindle DX 螢幕是 9.7 吋,大約是B5尺寸。一般開本的PDF檔看起來相當舒適,頁邊會自動切白,但如果是 A4 的頁面如學術論文,看起來就會嫌字太小。 翻頁速度:   按下翻頁鍵到翻頁完成大約半秒鐘,個人覺得還好。最適合 Kindle 閱讀的讀物是長篇小說,一頁一頁...

讀書心得: 撒哈拉的故事

初拿起「撒哈拉的故事」時,我心中想著大概是本以沙漠為背景的美麗幻想般的愛情小說吧,有誰會真的費盡千辛萬苦跑去撒哈拉沙漠,在物質極為缺乏的環境下過著刻苦的生活呢? 沒想到這人就是三毛,只因為一個理由「我要認識沙漠」。 「撒哈拉的故事」是三毛與她的丈夫荷西在撒哈拉沙漠旅遊生活的紀實,生活在沙漠很糟糕,至少我看完最後一篇『白手成家』後認為實在很糟,不過在樂觀又開朗的三毛的筆下,撒哈拉沙漠化為一個有趣又不可思議的國度,說著一個又一個異國的故事。 如果不是三毛,我無法想像原來世界上還有這樣子的一群人,還有這等事情,你能想像沙哈拉威人三四年才洗一次澡嗎? 『觀浴記』裡三毛跑去看沙漠女人洗澡,要先用蒸氣蒸,再用石片刮下身上的泥沙,而且沙漠女人不只洗外面,還洗裡面,讓我看的哈哈大笑。『娃娃新娘』 裡則是三毛的一個沙哈拉威鄰居叫「姑卡」要出嫁了,可是她才十歲呀,結婚習俗更是特別,新郎去迎接新娘時,新娘拼命的抵抗,原來才在沙哈拉威人的觀念裡,打得激烈才叫做「好女人」,不掙扎事後會被取笑的。 沙哈拉威人很少受教育,思想沒有邏輯,通常講道理是講不通的。有次三毛要參加晚宴,遍尋不著自己的漂亮高跟鞋,反倒是鞋櫃上多了一雙破鞋子,原來高跟鞋被鄰居小女孩偷去穿了。事後三毛很生氣地跟她理論,小女孩竟然回嘴「生氣,生氣,你的鞋子在我家,我的鞋子還不是在你家,我比你還要氣。」聽見這種話真的是秀才遇到兵,有理講不清,還好三毛是個灑脫的人,笑笑就過去了。 事實上,生活在沙漠真的需要灑脫,老是計較小事肯定活不下去。除了講不清道理的沙拉哈威鄰居,沙漠也有許多危險,書中至少有兩次三毛差點在沙漠裡丟掉小命。但是每一篇故事裡,我都看見一位勇氣可嘉的中國女孩兒,她不屈不撓,以樂觀的心和智慧面對生活中的困難,盡情的玩,盡情的享受生活,像個瘋狂的孩子般,最後甚至布置了一個號稱撒哈拉沙漠裡最美麗的家,連記者都聞風專程前來拜訪,他們的物質生活雖不富裕,但是精神卻很富足。 說到三毛不能不提她的另一半荷西。三毛書裡這樣子描寫『荷西有一個很大的優點,任何三毛所做的事情,在別人看來也許是瘋狂的行為,在他看來卻是理所當然的』,所以當三毛說要去沙漠時,荷西早她兩個月,就先對著撒哈拉沙漠找工作去了,沙漠裡的瘋狂事也總有荷西的一份。人生能遇見這樣的他,既是羨慕,也是感動。

讀書心得: 禮物

在人生中剛剛好的時刻,遇見一本書,提醒我許多已經忘記的事。溫暖的一本小書,簡短的故事,我在圖書館拿著書直接翻完了,卻比長篇大論更打動人心。 剛好我現在的年紀,開始會對以前做的一些事情懊悔,發現人生沒有那麼簡單,對未來又有一些迷惘和擔憂的時候,有時候就會被這些情緒佔用了我大部分的生活。 今天是上天賜與的禮物,這是為何他被叫作 當下(present) 的理由。這本小故事就是禮物,當你覺得事事不順的時候,就專注在當下的好事上吧,不要為過去自怨自艾,學習過去的失敗的經驗,去創造未來。 簡單再不過的事情,或許有點過於理想,幸福感多到漫出來了,重點是,你去實行了嗎?

讀書心得: The C++ Standard Library : a Tutorial and Reference

Effective C++第一條款就寫明「C++是一個語言聯邦。」 這個語言聯邦由四個次語言組成,分別是 C、 物件導向C++、Template C++、以及標準庫 STL。我去年接了大一程設課助教,每週都要上台教 C++,這份苦差事意外挖出不少自己當年學習上的盲點。其中最大的問題就是我對 C++ 的後兩個部分: Template C++以及 STL 不夠熟悉,只好找上這本書來補足這方面的知識。 STL 是一個相當淺明易用的程式庫,這從我以前亂逛 cplusplus.com,糊里糊塗就能隨便抄幾句 STL 來用就可以得證。本書對我的主要幫助不是學會 STL,而是能夠從宏觀的視野來看待整個 STL,了解當初 STL 設計的時候架構上的取捨,引發的優點以及缺點,能讀到這些設計上的觀點我覺得很難能可貴。就好像我以前都覺得 STL algorithm 異常難用,看了書才知道原來 STL algorithms 要搭配 function object 才能發揮威力。各種 Iterator 的錮中差異,也是看了此書後才有全盤了解。 內容上我認為第五章是整本書的核心精華,清楚說明了 STL 三大組件的關係與腳色 (圖片節錄自書上5.1節) Container 負責管理物件集合,Algorithm 是操作手法,而 Iterator 則扮演此二者間的黏著劑,讓雙方可以透過抽象手法互相作用,不會有過緊的依賴關係,由此可以看出 STL 設計之初軟體架構就相當軟Q。接下來六 ~ 九章是書本的主力內容,分別對Container、Iterator、Algorithm 做專門深入的探討。 第八章 Function Object 我認為是值得一讀的特別章節,因為坦白說 function object 這東西使用上並不直覺 (我一直覺得只有聰明鬼才能想出替 object 加上operator( ) 來當函數呼叫的餿主意 ),但是要靈活地使用STL Algorithm,就一定要搭配 function object 才行。沒有function object,STL Algorithms 就只是彆腳程式庫。第十章之後還有介紹一些C++的其他標準庫,像是字串、I/O、國際化問題等等。 整體來講,這是一本好書,但是有點無聊。本書安排內容的方式是把 STL 各個部分切開來,每部份分配一...

C++ Standard Library 讀書筆記: Function Object

我讀 C++ Standard Library: a Tutorial and Reference 後的筆記,主要內容來自 5.9小節,整個第八章,以及一些我自己的感想。 STL Algorithms C++ STL Algorithms 裡一系列操作容器的函數,我一直以來都覺得這系列函數異常的難用。例如萬年範例 -- for_each 逐一打印容器的元素: void print_int( int i ) { cout << i << endl; } for_each(v.begin(), v.end(), print_int); //逐一印出元素 乍看之下簡潔,但是這 for_each 有個致命的缺點,就是沒辦法傳入額外參數。例如我想對集合內的每個數值都加上一個固定值,用 for 迴圈再直覺不過: int value = 5; vector<int> ::iterator it; for(it=v.begin(); it!=v.end(); ++it) *it = *it + value; 這麼簡單的程式,想要改寫成for_each版本,馬上碰壁: void add_value( int & i ) { i = i + ???; // add something? } int main() { vector<int> v; for_each(v.begin(), v.end(), add_value); } 問號的地方只能放常數或者全域變數,而兩個選項都很爛,我真正想要的是從 main 裡面傳入一個變數。所以很長一段時間我把 for_each 封印起來,乖乖自己寫 for 迴圈。 Function Object 直到最近,我才明瞭到 function object 可能是這個惱人的問題的答案。 所謂的 function object 就是一個object,但是實做了operator() 。它實際上是物件,但可以當作函數來呼叫。要發揮整個 STL Algorithms 的威力,就一定要瞭解 function object。萬年打印範例用funciton object 來實作就會長這樣子 : class PrintInt{ vo...