2011-10-20 65 views
3

我認爲這已經在之前討論過了,但我無法找到適合我的答案。OpenGL ES 2.0 for 2D,如何將原點設置爲左上方

我正在用OpenGL ES 2.0爲iPad開發2D「繪圖」應用程序。

我正在用「iPhone 3D Programming」一書中描述的函數創建一個Ortho投影矩陣,並且據我所知矩陣是正確的。函數調用是這樣的:

proj = identity.Ortho(-width/2, width/2, -height/2, height/2, -1.0f, 1.0f); 

它工作正常,但它將原點放在視口的中心。我需要從用戶那裏獲取觸摸信息進行繪製,所以我希望原點位於左上角。

我知道我並不真的需要這個,因爲我只能減去(width/2,height/2),但是如果原點在TL,所有東西都會更容易。

所以,我想這一點:

proj = identity.Ortho(0, width, 0, height, -1.0f, 1.0f); 

不過,這並不在所有的工作,如果我畫一個矩形,我只是看到一些線或三角形,當我旋轉視圖模型矩陣,它就像它越來越扭曲。

謝謝。

+0

在OpenGL中,垂直座標是從底部開始的距離,在可可視圖中,它是距頂部的距離。 – jbat100

+0

我知道你的意思,但我不認爲這解決了我與投影矩陣的問題。或者我錯過了什麼? – Odrakir

+0

不知道這就是爲什麼它是一個評論:) – jbat100

回答

4

With identity.Ortho(0, width, 0, height, -1.0f, 1.0f)你是在正確的軌道上。但是這會將原點定位在左下角(因爲它仍然在右手三維空間中操作,而不是在屏幕空間中操作,所以y向上,x向右)。相反,只是換用

proj = identity.Ortho(0, width, height, 0, -1.0f, 1.0f); 

頂部和底部,但要記住,既然這反映了y方向(像你想的話),它會反轉你得出任何三角形的方向,逆時針旋轉三角形爲順時針方向。這不是一個真正的問題,當你根據三角形的方向進行操作時(例如背面剔除,雙面材料...),只需要牢記這一點,並且可以使用glFrontFace來切換默認的前端收卷順序。但是既然你想做2D,無論如何,三角形取向和背面剔除對你來說都不是什麼大問題。

+0

是的,我也嘗試過,但一些奇怪的事情必須與我的代碼發生,因爲它也不會工作。 正如我所說,我畫了一個矩形,你可以在屏幕中間旋轉。只有這一點,如果我使用Ortho矩陣,它不再是矩形,就像我旋轉時出現和消失的三角形一樣。 ?!?!? – Odrakir

+0

@Odrakir也許你已啓用背面剔除功能?嘗試調用'glDisable(GL_CULL_FACE)',雖然這聽起來很奇怪。也許更多的代碼將有助於澄清這種情況。 –

+0

你知道嗎?我放棄。我猜我有一天會發現,但現在我必須和中心的原點一起生活。無論如何,這並沒有那麼糟糕。 – Odrakir