OpenGL ES - как сохранить некоторый объект в фиксированном размере? - PullRequest
2 голосов
/ 17 ноября 2009

Я работаю над небольшой игрой в OpenGL ES.

На заднем плане есть мир / карта. Карта это просто большая текстура. Zoom / Pinch / Pan используется для перемещения. И я использую glOrthof (влево, вправо, внизу, сверху, zNear, zFar) для реализации масштабирования / масштабирования. При увеличении масштаба спрайты в верхней части карты также увеличиваются. Но я хотел бы, чтобы некоторые спрайты оставались фиксированного размера.

Я мог бы, вероятно, рассчитать масштабный коэффициент, в зависимости от параметров glOrthof, но должен быть более естественный и простой способ сделать это, вместо того, чтобы уменьшать спрайты при увеличении масштаба.

Если я добавлю текст или некоторые элементы графического интерфейса поверх карты, они обязательно должны иметь фиксированный размер.

Есть ли решение для этого или мне нужно оставить фиксированные значения в glOrthof и реализовать масштабирование / сжатие другим способом?

РЕДАКТИРОВАТЬ: Чтобы быть более ясным: я хочу спрайты, которые увеличивают / уменьшают масштаб вместе с картой, но остаются с тем же размером. У меня есть некоторые элементы, которые похожи на контакты в приложении карты iPhone. Когда вы увеличиваете масштаб, штифты остаются одинакового размера, но перемещаются по экрану, чтобы оставаться на том же месте на карте. Это в основном то, для чего я хочу найти решение. Решения для этого уже пришли ниже, спасибо!

Ответы [ 3 ]

1 голос
/ 17 ноября 2009

Сначала позвоните glOrthof с имеющимися настройками, затем нарисуйте вещи, которые масштабируются. Затем выполните еще один вызов glOrthof с другими настройками (вероятно, после glLoadIdentity), а затем нарисуйте вещи, которые не следует масштабировать.

0 голосов
/ 17 ноября 2009

Нашел одно решение в этой теме: Рисование «точечных» фигур в OpenGL, безразлично для увеличения

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);

Они будут двигаться, когда карта перемещается, но не меняет размер.

Редактировать: Небольшой совет: Помните, что координата точки - это середина текстуры, а не угол или что-либо еще. Я немного боролся со своими спрайтами, по-видимому, «движущимися», потому что я использовал только верхние левые пиксели 35x35 в текстуре 64x64. Переместите вашу графику в середину текстуры, и все будет в порядке.

0 голосов
/ 17 ноября 2009

вы можете использовать что-то подобное для рисования элементов фиксированного размера в заданной 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 - это координаты контрольной точки в спрайте, которая будет соответствовать трехмерной точке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...