2011-04-15 85 views
0

首先 - 我在绘图编程微笑。HGE-OpenGL移植Gfx_SetTransform函数

我支持基于移植版本的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(&matView); 
    else 
    { 
     D3DXMatrixTranslation(&matView, -x, -y, 0.0f); 
     D3DXMatrixScaling(&tmp, hscale, vscale, 1.0f); 
     D3DXMatrixMultiply(&matView, &matView, &tmp); 
     D3DXMatrixRotationZ(&tmp, -rot); 
     D3DXMatrixMultiply(&matView, &matView, &tmp); 
     D3DXMatrixTranslation(&tmp, x+dx, y+dy, 0.0f); 
     D3DXMatrixMultiply(&matView, &matView, &tmp); 
    } 

    _render_batch(); 
    pD3DDevice->SetTransform(D3DTS_VIEW, &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 他们不使用完全相同的命名血清胆碱酯酶我,虽然。

+0

非常感谢。 – e40pud 2011-04-15 11:23:43