HGE-перенос функции Gfx_SetTransform на OpenGL

#opengl #graphics #game-engine

#opengl #графика #игровой движок

Вопрос:

Прежде всего — я новичок в графическом программировании, улыбаюсь.

Я поддерживаю игру, основанную на портированной версии HGE, которая не содержит OpenGL-версию Gfx_SetTransform. Я нашел несколько примеров переноса на HGE-Opengl, но в любом примере есть эта функция.

Код:

 void CALL HGE_Impl::Gfx_SetTransform(float x, float y, float dx, float dy, float rot, float hscale, float vscale)
{
   D3DXMATRIX tmp;

   if(vscale==0.0f) D3DXMatrixIdentity(amp;matView);
   else
   {
      D3DXMatrixTranslation(amp;matView, -x, -y, 0.0f);
      D3DXMatrixScaling(amp;tmp, hscale, vscale, 1.0f);
      D3DXMatrixMultiply(amp;matView, amp;matView, amp;tmp);
      D3DXMatrixRotationZ(amp;tmp, -rot);
      D3DXMatrixMultiply(amp;matView, amp;matView, amp;tmp);
      D3DXMatrixTranslation(amp;tmp, x dx, y dy, 0.0f);
      D3DXMatrixMultiply(amp;matView, amp;matView, amp;tmp);
   }

   _render_batch();
   pD3DDevice->SetTransform(D3DTS_VIEW, amp;matView);
}
  

Итак, кто-нибудь может помочь в переносе Gfx_SetTransform или внести предложение (возможно, какой-нибудь простой пример или функции OpenGL, которые я должен искать)?
Спасибо.

Ответ №1:

При использовании OpenGL до версии, не включающей 3, вы можете заменить ее на следующую:

 void GL2_SetTransform(float x, float y, float dx, float dy, float rot, float hscale, float vscale)
{
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity(); // we start off a identity matrix

   // Instead of testing for 0, you should test for some
   // threshold, to increase numerical stability
   if( fabs(vscale) >= 1e-7 ) {
      glTranslatef(-x, -y, 0.0f);
      glScalef(hscale, vscale, 1.0f);
      glRotatef(-rot, 0., 0., 1.);
      glTranslatef(x dx, y dy, 0.0f);
   }
}
  

В OpenGL-3 функции манипулирования матрицей устарели, поэтому код выглядит почти идентично версии DirectX (я изменил несколько вещей для повышения стабильности):

 typedef float mat4x4[4][4];
// OpenGL uses column major mode, so the first
// index selects column, the second row - this is
// opposite to the usual C notation.

// The following functions must be implemented as well.
// But they're easy enough.

// function to set the matrix to identity
void mat4x4_identity(mat4x4 *M);

// those functions transform the matrix in-place,
// i.e. no temporaries needed.
void mat4x4_rotX(mat4x4 *M, float angle);
void mat4x4_rotY(mat4x4 *M, float angle);
void mat4x4_rotZ(mat4x4 *M, float angle);

void mat4x4_scale(mat4x4 *M, float x, float y, float z);

void mat4x4_translate(mat4x4 *M, float x, float y, float z);


void GL3_SetTransform(float x, float y, float dx, float dy, float rot, float hscale, float vscale)
{
   mat4x4 view;
   mat4x4_identity(view);

   if( fabs(vscale) >= 1e-8 ) {
      mat4x4_translate(view, -x, -y, 0.0f);
      mat4x4_scale(view, hscale, vscale, 1.0f);
      mat4x4_rotZ(view, -rot);
      mat4x4_translate(view, x dx, y dy, 0.0f);
   }

   _render_batch();
   // get_view_uniform_location returns the handle for the currently loaded
   // shader's modelview matrix' location. Application specific, so you've to
   // come up with that yourself.
   glUniformMatrix4fv(get_view_uniform_locaton(), 1, false, view);
}
  

Я разместил исходный код для функций манипулирования матрицей здесь:
http://pastebin.com/R0PHTW0M
Однако они не используют точно такую же схему именования.