OpenGL ES - 如何将某些对象保持为固定大小?

时间:2009-11-17 08:57:54

标签: iphone opengl-es

我正在使用OpenGL ES开发一款小游戏。

在后台,有一个世界/地图。地图只是一个很大的纹理。 缩放/缩放/平移用于移动。我正在使用glOrthof(left,right,bottom,top,zNear,zFar)来实现缩放/捏合。 当我放大时,地图顶部的精灵也会放大。但我想让一些精灵保持固定的大小。

我可以根据glOrthof的参数来计算比例因子,但必须有一种更自然,更简单的方法,而不是在放大时缩小精灵。

如果我在地图上添加一些文字或一些GUI元素,它们肯定会有一个固定的大小。

有没有解决办法,或者我必须在glOrthof中保留固定值并以另一种方式实现缩放/捏合?

编辑:更清楚:我希望精灵随地图放大/缩小,但保持相同的大小。 我有一些元素就像iPhone的地图应用程序上的引脚。缩放时,引脚保持相同的大小,但在屏幕上移动以保持在地图上的相同位置。这主要是我想要的解决方案。 解决方案已经在下面了,谢谢!

3 个答案:

答案 0 :(得分:1)

首先使用您拥有的设置调用glOrthof,然后绘制缩放的内容。然后使用不同的设置(可能在glOrthof之后)对<{1}}进行另一次调用,然后绘制不应缩放的内容。

答案 1 :(得分: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是精灵中与3D点匹配的参考点的坐标。

答案 2 :(得分:0)

在此主题中找到一个解决方案: Drawing "point-like" shapes in OpenGL, indifferent to zoom

Point sprites ... Apple的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左上角的像素。将图形移动到纹理的中间,你会没事的。