为啥变换矩阵在 OpenGL 中不起作用

Posted

技术标签:

【中文标题】为啥变换矩阵在 OpenGL 中不起作用【英文标题】:Why Transform Matrix doesn't work in OpenGL为什么变换矩阵在 OpenGL 中不起作用 【发布时间】:2012-06-13 11:14:35 【问题描述】:

假设我想在场景中画一个球,这里有两种不同的方法。

float SUN_TRANSLATION_MATRIX[] = 
  1.0f, 0.0f, 0.0f, 0.0f,
  0.0f, 1.0f, 0.0f, 0.0f,
  0.0f, 0.0f, 1.0f, -15.0f,
  0.0f, 0.0f, 0.0f, 1.0f
;

void displaySolarSystem1()
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(0.0f, 0.0f, -15.f);
  glColor3f(1.0f, 0.8f, 0.5f);
  glutSolidSphere(2.0, 50, 40);
  glutSwapBuffers();


void displaySolarSystem()
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();         
  glMultMatrixf(SUN_TRANSLATION_MATRIX);
  glColor3f(1.0f, 0.8f, 0.5f);
  glutSolidSphere(2.0, 50, 40); 
  glutSwapBuffers();

displaySolarSystem1 在 displaySolarSystem 使用矩阵运算的地方应用 glTranslatef,问题是 displaySolarSystem1 按预期工作,但矩阵失败。

displaySolarSystem() 出了什么问题?

【问题讨论】:

见***.com/questions/4360918/…。基本上你的矩阵是转置的。 我不确定,但我想你应该简单地从矩阵中获取翻译信息,然后像在 displaySolarSystem1() 中一样使用 glTranslatef 来翻译它 不是答案而是调试提示,使用 glGetDoublev(GL_MODELVIEW, modelMatrix);检查矩阵是否有效,然后与另一个矩阵进行比较。 【参考方案1】:

http://www.opengl.org/sdk/docs/man/xhtml/glMultMatrix.xml

使用参数 m = [...] 调用 glMultMatrix 会将当前转换替换为 C × M × v

这意味着通过将矩阵乘以向量来应用变换,反之亦然。所以,翻译矩阵会是这样的 1 0 0 X 0 1 0 是 0 0 1 Z 0 0 0 1 但这是矩阵,以行优先顺序编写,OpenGL 采用列优先顺序矩阵,因此您需要对其进行转置。 所以,最后,你只需要使用glMultTransposeMatrix,如果我没记错的话,它会稍微慢一些,或者将你的矩阵转置成这样

float SUN_TRANSLATION_MATRIX[] = 
  1.0f, 0.0f, 0.0f, 0.0f,
  0.0f, 1.0f, 0.0f, 0.0f,
  0.0f, 0.0f, 1.0f, 0.0f,
  0.0f, 0.0f, -15.0f, 1.0f
;

【讨论】:

【参考方案2】:

谢谢放松。通过更改 glMultMatrixf(SUN_TRANSLATION_MATRIX); 解决了这个问题。到 glMultTransposeMatrixf(SUN_TRANSLATION_MATRIX);感谢您提示“这是一个转置矩阵”

【讨论】:

以上是关于为啥变换矩阵在 OpenGL 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为 glm 翻译添加统一向量在 OpenGL 中不起作用

着色器在 2d OpenGL 中不起作用

颜色在开始示例opengl中不起作用

CSS变换旋转和倾斜在Safari中不起作用

在 OpenGL 中使用矩阵——MVP 矩阵不起作用

3D(7 参数)Helmert 变换在 Python 中不起作用