2009-11-17 43 views
2

我正在開發OpenGL ES中的一個小遊戲。OpenGL ES - 如何將某個對象保持在固定大小?

在背景中,有一個世界/地圖。地圖只是一個很大的紋理。 縮放/捏/平移用於移動。我正在使用glOrthof(左,右,下,上,zNear,zFar)來實現縮放。 當我放大時,地圖頂部的精靈也放大了。但是我想讓一些精靈保持在一個固定的大小。

我大概計算一個比例係數,根據不同的參數來glOrthof,但必須有這樣做的,而不是縮放精靈下來的時候我放大的更自然,更直接的方式。

如果我在地圖頂部添加一些文本或一些GUI元素,它們應該明確具有固定大小。

是否有解決方案來做到這一點,或者我必須在glOrthof中保留固定值並以其他方式實施縮放/捏合?

編輯:更清晰:我想要精靈一起放大/縮小地圖,但保持相同的大小。 我有一些元素就像iPhone的地圖應用程序的引腳。在縮放時,引腳保持相同的大小,但在屏幕上四處移動以保持在地圖上的相同位置。這主要是我想要的解決方案。 解決方案已經下面,謝謝!

回答

0

發現在這個線程一個解決方案: Drawing "point-like" shapes in OpenGL, indifferent to zoom

點精靈......蘋果公司的GLPaint例子也用這個。 非常簡單易用。使用當前紋理。

glEnable(GL_POINT_SPRITE_OES); 
glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); 
glPointSize(40.0f); 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_POINTS, 0, 4); 

這些會在地圖移動時移動,但不會更改大小。

編輯:小提示:請記住,點座標是紋理的中間,而不是角落或任何東西。我用我的精靈顯然「移動」掙扎了一下,因爲我只用了64x64紋理中的35x35左上像素。將你的圖形移動到紋理的中間,你會沒事的。

1

首先調用glOrthof並設置您的設置,然後繪製縮放比例。然後用再撥撥打glOrthof用不同的設置(在glLoadIdentity之後),然後畫出不應該縮放的東西。

+0

對此進行了快速測試。 當我放大地圖時,精靈保持相同的大小/位置。 此解決方案對於應該保持在iPhone屏幕上的固定位置的元素(如UI元素和文本)將很好地工作。 但我想有一些精靈留在地圖上的相同位置。有點像iPhone地圖應用程序中的引腳。在地圖上縮放/平移時,引腳會保持與地圖相同的位置,但引腳的大小保持不變。 有沒有快速的解決方案呢? :-) – OMH 2009-11-17 09:58:38

+0

在繪製小精靈之前,將一個比例矩陣推到堆棧上(使用'glScalef'或其他)來扭轉世界的縮放比例。 – Thomas 2009-11-17 12:18:44

+0

有趣,但我不太明白。請你詳細說明一下嗎? – OMH 2009-11-17 14:38:07

0

你可以使用這樣的事情在一個給定的3D位置繪製固定大小的元素,保持當前投影設置:

// go to correct coordinates 
double v[3] = { x , y , z }; 
glRasterPos3dv(v); 
glBitmap(0 , 0 , 0 , 0 , -center_pix_x , -center_pix_y , NULL); 

// and draw pixels 
glPixelStorei(GL_PACK_LSB_FIRST , true); 
glPixelStorei(GL_PACK_ALIGNMENT , 1); 
glDrawPixels(img_width , img_height , GL_RGBA , GL_UNSIGNED_BYTE , img_data_ptr); 

center_pix是精靈的基準點,將匹配的三維座標點。