OpenGL ES - 如何将某个对象保持在固定大小?
我正在开发OpenGL ES中的一个小游戏。OpenGL ES - 如何将某个对象保持在固定大小?
在背景中,有一个世界/地图。地图只是一个很大的纹理。 缩放/捏/平移用于移动。我正在使用glOrthof(左,右,下,上,zNear,zFar)来实现缩放。 当我放大时,地图顶部的精灵也放大了。但是我想让一些精灵保持在一个固定的大小。
我大概计算一个比例系数,根据不同的参数来glOrthof,但必须有这样做的,而不是缩放精灵下来的时候我放大的更自然,更直接的方式。
如果我在地图顶部添加一些文本或一些GUI元素,它们应该明确具有固定大小。
是否有解决方案来做到这一点,或者我必须在glOrthof中保留固定值并以其他方式实施缩放/捏合?
编辑:更清晰:我想要精灵一起放大/缩小地图,但保持相同的大小。 我有一些元素就像iPhone的地图应用程序的引脚。在缩放时,引脚保持相同的大小,但在屏幕上四处移动以保持在地图上的相同位置。这主要是我想要的解决方案。 解决方案已经下面,谢谢!
发现在这个线程一个解决方案: 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左上像素。将你的图形移动到纹理的中间,你会没事的。
首先调用glOrthof
并设置您的设置,然后绘制缩放比例。然后用再拨拨打glOrthof
用不同的设置(在glLoadIdentity
之后),然后画出不应该缩放的东西。
你可以使用这样的事情在一个给定的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是精灵的基准点,将匹配的三维坐标点。
对此进行了快速测试。 当我放大地图时,精灵保持相同的大小/位置。 此解决方案对于应该保持在iPhone屏幕上的固定位置的元素(如UI元素和文本)将很好地工作。 但我想有一些精灵留在地图上的相同位置。有点像iPhone地图应用程序中的引脚。在地图上缩放/平移时,引脚会保持与地图相同的位置,但引脚的大小保持不变。 有没有快速的解决方案呢? :-) – OMH 2009-11-17 09:58:38
在绘制小精灵之前,将一个比例矩阵推到堆栈上(使用'glScalef'或其他)来扭转世界的缩放比例。 – Thomas 2009-11-17 12:18:44
有趣,但我不太明白。请你详细说明一下吗? – OMH 2009-11-17 14:38:07