0

シーンにボールを描きたいとしましょう。これを行うには2つの方法があります。

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はglTranslatefを適用します。displaySolarSystemは行列演算を使用します。問題は、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

Unwindに感謝します。この問題は、glMultMatrixf(SUN_TRANSLATION_MATRIX);を変更することで解決されました。glMultTransposeMatrixf(SUN_TRANSLATION_MATRIX);へ 「これは転置行列です」というヒントをありがとう

于 2012-06-13T11:46:44.110 に答える