首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移植Gfx_SetTransform函数

移植Gfx_SetTransform函数
EN

Stack Overflow用户
提问于 2011-04-15 07:45:22
回答 1查看 336关注 0票数 0

首先,我是图形编程微笑的核心。

我支持基于HGE移植版本的游戏,它不包含Gfx_SetTransform.的OpenGL版本我发现了几个例子的HGE-Opengl移植,但任何一个例子都有这个功能.

代码:

代码语言:javascript
复制
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函数,我应该去寻找)?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-15 10:15:19

如果OpenGL的版本不包括3,您可以用以下方法替换它:

代码语言:javascript
复制
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版本几乎相同(为了提高稳定性,我做了一些更改):

代码语言:javascript
复制
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 --它们使用的命名方案并不完全相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5673796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档