为啥变换矩阵在 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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章