2013-10-12 62 views
0

我有在OpenGL-ES 2.0中創建的2D地圖。現在我想畫一個比例尺。根據OpenGL中的屏幕座標繪製線條

因爲當用戶拖動地圖時不會移動它,所以我需要它以某種方式在屏幕座標中繪製。

我可以使用一些建議,如何做到這一點。

+0

考慮使用標準化設備座標,這是一個座標系,範圍從所有3個軸的[-1,1]。無論您的世界或投影如何定義,該座標空間總是具有該範圍,(-1,-1,-1)處的點始終位於左下方並位於近平面上。這個座標空間是視口轉換之前的最後一步,它可以讓你屏幕座標,所以如果你知道你的視口尺寸,你可以輕鬆地做一些簡單的數學計算,然後回溯到NDC。 –

+0

在NDC中工作的好處是,您可以使用現有的着色器,當您想繪製NDC中定義的某些內容時,只需爲投影和模型視圖提供標識矩陣。如果你對所有這些都感到困惑,我可以嘗試用答案的形式編寫一些僞代碼;但它將不得不等到明天。 –

+0

Hi @ AndonM.Coleman我從來沒有嘗試過,所以越能提供更好的服務。感謝您的幫助! – Hank

回答

1

要做到這一點,所有你需要知道的是你的視口的尺寸。要知道,視口變換是一個非常簡單的規模和偏置操作,有效的工作原理是這樣:

NDC Screen 
--- ------ 
-1.0 -> x   \_ X (Passed using glViewport (...)) 
1.0 -> x + width/

-1.0 -> y   \_ Y (Passed using glViewport (...)) 
1.0 -> y + height/

-1.0 -> near  \_ Z (Passed using glDepthRange (...)) 
1.0 -> far  /

我的醜ASCII藝術道歉,我希望堆棧溢出支持乳膠。

換言之,對於X和Y,標準化設備座標(NDC)被縮放以適合的寬度和高度許多單位內,並且左下最點由(X,Y所定義)。對於您可能不關心的Z,NDC從您定義的近值縮放到定義的遠值。

你想要做的是反轉的視口映射操作;從屏幕空間座標開始,重新回到NDC。

  • NDC X =(2.0 *(屏幕 X - 視口 X)/視口W¯¯) - 1.0;

  • NDC Ŷ =(2.0 *(屏幕ý - 視口Ÿ)/視口ħ) - 1.0;

這應該爲您提供所有必要的步驟,以產生NDC (X,Y)從屏幕座標(X,Y)。獲得NDC座標後,可以使用模型,視圖和投影的身份矩陣將它們直接傳遞給着色器。

另一種方法是跳過所有這些,並使用投影和窗口(屏幕空間的另一個名稱)座標之間定義1:1映射的正投影矩陣,但我認爲教NDC更好,以及長時間運行視口映射:)