0

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

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() 出了什么问题?

4

2 回答 2

2

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

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

这意味着通过将矩阵乘以向量来应用变换,反之亦然。所以,平移矩阵是这样的 1 0 0 X 0 1 0 Y 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
};
于 2012-06-13T11:51:01.640 回答
0

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

于 2012-06-13T11:46:44.110 回答