0

私はopenglが初めてです。独自のマトリックスを使用して球体を動かそうとしましたが、結果が正しくありません。

左側の球は私が期待するもので、右側は glMultMatrixd() で結果を生成します。私は何を間違えましたか?

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);

    glPushMatrix();
    GLdouble translate[16] = {1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1};    
    glMultMatrixd(translate);
    DrawSphere();
    glPopMatrix();

    glPushMatrix();
    glTranslatef(1,0,0);
    DrawSphere();
    glPopMatrix();

    glutSwapBuffers();
}   
void Reshape(int width, int height) {
    tbReshape(width, height);

    glViewport(0, 0, width, height);
    glGetIntegerv(GL_VIEWPORT, viewport);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(60.0, (GLdouble)width/height, 0.01, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, -5, // eye
              0.0, 0.0, 0.0, // center
              0.0, 1.0, 0.0); // up
}
4

1 に答える 1

1

GLdouble translate[16] = {1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1};

と同じです

glTranslated(1, 0, 0)

ローカル座標系を (1, 0, 0) で変換することを意味します

結果は右側。

何も問題はありません。「マトリックス アルゴリズム」を理解していないだけです。

行列を直接使用する前に線形代数を学ぶことをお勧めします。

- - - - - - 編集 - - - - - - -

私のせいでごめんなさい。 GLdouble translate[16] = {1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1};は正しい行列です。

opengl の行列は列優先なので、次のように GLdouble m[16]レイアウトします。

m[0] m[4] m[8]  m[12]
m[1] m[5] m[9]  m[13]
m[2] m[6] m[10] m[14]
m[3] m[7] m[11] m[15]
于 2013-09-25T02:17:57.923 に答える