OpenGL ES 1.1 вращение изображения из его центра - PullRequest
0 голосов
/ 21 октября 2010

Я пытаюсь повернуть 2D-изображение с помощью OGL ES.После загрузки я могу перемещать его по экрану, но при попытке повернуть изображение через его центр, это имеет странное поведение, поскольку центр вращения - это левый нижний угол экрана, а не центр самого изображения.

Поглядывая вокруг, я прочитал, что могу нажать текущую матрицу, изменить все, что мне нужно (перевести координаты, повернуть изображение и т. Д.), А затем вытолкнуть матрицу, возвращающуюся к предыдущему состоянию матрицы ...все еще не работает так, как я ищу (но, по крайней мере, теперь кажется, что исходные координаты, где он вращается, не являются левым нижним углом ...)

Есть мысли?Кто-нибудь может определить, где моя проблема?

Любая помощь будет высоко ценится!Спасибо !!

void drawImage(Image *img)
{

   GLfloat fX = (GLfloat)img->x;

   GLfloat fY = (GLfloat)(flipY(img->m_height+img->y));

   GLfloat   coordinates[] = { 0, img->m_textureHeight, img->m_textureWidth, img->m_textureHeight, 0, 0, img->m_textureWidth, 0 };
   GLfloat      vertices[] = 
   { 
      fX, fY, 0.0,
      img->m_width+fX, fY, 0.0,
      fX, img->m_height+fY, 0.0,
      img->m_width+fX, img->m_height+fY, 0.0 
   };   

   //Push and change de matrix, translate coords, rotate and scale image and then pop the matrix
   glPushMatrix(); //push texture matrix
   glTranslatef((int)fX, (int)fY, 0.0);  //translate texture matrix

   // rotate
   if (img->rotation != 0.0f )
      glRotatef( -img->rotation, 0.0f, 0.0f, 1.0f );

   // scale
   if (img->scaleX != 1.0f || img->scaleY != 1.0f)
      glScalef( img->scaleX, img->scaleY, 1.0f );

   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

   glEnableClientState(GL_TEXTURE_COORD_ARRAY);

   glColor4f(1.0, 0.0, 0.0, 1.0);
   glBindTexture(GL_TEXTURE_2D, img->m_name);
   glVertexPointer(3, GL_FLOAT, 0, vertices);
   glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

   glDisableClientState(GL_TEXTURE_COORD_ARRAY);

   glPopMatrix();
}

1 Ответ

0 голосов
/ 21 октября 2010

Самое главное, вам нужно понять, как выполнить эту операцию.

перед вращением вы должны перевести себя в начало вращения и только затем применить к вращению.

Ознакомьтесь с этой статьей , которая хорошо это объясняет.

Простая разбивка:

  • переместить объект в начало координат.
  • Поворот.
  • Переместить объект назад.
...