跳到主要內容

發表文章

目前顯示的是有「OpenGL」標籤的文章

OpenGL FAQ: 9. 空間轉換

9.001 我搞不定空間轉換啦。我可以去哪兒學習了解矩陣這東西? 基本矩陣數學與線性代數的詳細解說已經超出了本FAQ的範圍,這些內容美國的高中課程會教。如果你已經學過了,只是現在有點混淆 (這是老手也有的常見問題),去讀 Steve Baker 的 矩陣觀念複習 與 尤拉角度的文章 。 這兒有向量、矩陣、四元數運算的 Delphi 基本演示代碼 9.005 OpenGL 矩陣是 column-major 還是 row-major 呢? 以編程觀點來看,OpenGL矩陣是個陣列,有16個數值,四個基底向量依序地擺放在記憶體中。陣列的索引值編號為 1~16,其中位移分量(Translate Component) 佔據了16值的陣列的第13、14、15號元素,這些內容都寫在 OpenGL 2.1 規格書的 2.11.2 小節。 Column-major 與 Row-major 表示法純粹只是慣例上的差別。請注意,把向量乘在 column-major 矩陣的後頭,跟把向量乘在 row-major 矩陣的前頭,產生的結果完全相同。OpenGL規格書與OpenGL參考手冊雙雙採用了 column-major 表示法。只要夠明確,你用任何一種表示法都行。 但不幸地,規格書跟藍皮書中的 columr-major 格式造成了 OpenGL社群無止盡的混淆。因為 Column-major 表示法與一般編程人員預期的記憶體布局不相同。 9.010 OpenGL坐標系使用什麼長度單位呢? 短答案: 你想要單位是什麼就是什麼。 依據於你的幾何資料,應用程式可以把OpenGL座標單位視為毫米(millimeter) / 秒差距 (parsec) 或者任意更大或更小的長度單位,端賴哪個對你比較方便。 OpenGL也允許你指定不同的坐標系單位。比方說,你覺得這樣做比較方便,飛機控制以公分為單位,但是機身使用單位公尺,翱翔在單位是公里的世界天空中。OpenGL 的 ModelView 矩陣可以隨意縮放不同的座標系統,最後落於同一個眼空間座標中。 建立適切的投影矩陣跟ModelView矩陣是應用程式的責任,確保觀看者有適當的距離、視角、而且近平面跟遠平面都位於適當的範圍。比方說,一個展示微米尺度級的分子應用程式的鏡頭就不該放在10呎遠,且視角60度寬。 ...

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 時不變焦。縮放值變大就縮小視角,結果模...