0

どうも、OpenGLで行列をベクトルに掛けようとしているのですがfunction(OpenGLUtility::VectorMultiMatrix4d())、opengl関数を呼び出すことで、自作の掛け算を呼び出して得たレンダリング結果が違うことがわかりましglMultMatrixf()た。画面に描かれた 2 本の線は同じではありません。

以下のように2つの異なる方法を呼び出してコードを配置しました。関数 OpenGLUtility::VectorMultiMatrix4d() は単純で、列優先の乗算のみです。

誰でもこれについてアドバイスをもらえますか?どうもありがとう。


コード 1:

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
double inverse[16];
OpenGLUtility::InverseMatrix(m_mat, inverse);


double tOrigin[4] = { 
    g_bottom_plane.m_Origin[0], 
    g_bottom_plane.m_Origin[1],
    g_bottom_plane.m_Origin[2],
    1.0 };

OpenGLUtility::VectorMultiMatrix4d(tOrigin,inversed);

double tNormal[4] = {
    g_bottom_plane.m_Normal[0],
    g_bottom_plane.m_Normal[1],
    g_bottom_plane.m_Normal[2],
    0.0 };


OpenGLUtility::VectorMultiMatrix4d(tNormal,inversed);

glBegin(GL_LINES);
glColor3f(0.0,1.0, 0.0);
glVertex4f(tOrigin[0], tOrigin[1], tOrigin[2], tOrigin[3]);
glVertex4f( tNormal[0]*tOrigin[3] + tOrigin[0], 
            tNormal[1]*tOrigin[3] + tOrigin[1], 
            tNormal[2]*tOrigin[3] + tOrigin[2], 
            tOrigin[3] );
glEnd();

///

void OpenGLUtility::VectorMultiMatrix4f(float* pVector, float* pMat)
{
    pVector[0] = pMat[0]*pVector[0] + pMat[4]*pVector[1] + pMat[ 8]*pVector[2] + pMat[12]*pVector[3] ;
    pVector[1] = pMat[1]*pVector[0] + pMat[5]*pVector[1] + pMat[ 9]*pVector[2] + pMat[13]*pVector[3] ;
    pVector[2] = pMat[2]*pVector[0] + pMat[6]*pVector[1] + pMat[10]*pVector[2] + pMat[14]*pVector[3] ;
    pVector[3] = pMat[3]*pVector[0] + pMat[7]*pVector[1] + pMat[11]*pVector[2] + pMat[15]*pVector[3] ;
}

コード 2

float inverse[16];

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glMultMatrixf(m_mat);

OpenGLUtility::InverseMatrix(m_mat, inverse);
glMultMatrixf(inverse);

double tOrigin[4] = { 
    g_bottom_plane.m_Origin[0], 
    g_bottom_plane.m_Origin[1], 
    g_bottom_plane.m_Origin[2], 
    1.0 };

double tNormal[4] = { 
    g_bottom_plane.m_Normal[0], 
    g_bottom_plane.m_Normal[1], 
    g_bottom_plane.m_Normal[2],
    0.0 };


glBegin(GL_LINES);
glColor3f(0.0,1.0, 0.0);
glVertex4f( tOrigin[0], tOrigin[1], tOrigin[2], tOrigin[3] );
glVertex4f( tNormal[0]*tOrigin[3] + tOrigin[0], 
            tNormal[1]*tOrigin[3] + tOrigin[1], 
            tNormal[2]*tOrigin[3] + tOrigin[2], 
            tOrigin[3] );
glEnd();

glMultMatrixf(m_mat);
4

2 に答える 2

1

そう。コードを再フォーマットした後、コメントします: まずコード 2を見てみましょう

float inverse[16];

glMatrixMode(GL_MODELVIEW);
glPushMatrix();

さて、モデルビュー マトリックスを操作して、モデルビュー マトリックス スタックをプッシュします。

glMultMatrixf(m_mat);

行列の乗算m_mat

OpenGLUtility::InverseMatrix(m_mat, inverse);

反転中…</p>

glMultMatrixf(inverse);

そして、あなたはそれを元に戻すので、あなたはやった

M * M^-1 = 私

もちろん、これmat_mは完全に可逆である場合にのみ機能します。しかし、可逆の場合、これら 2 つの操作は相殺され、何も起こりません。

ところで:締めくくりがありませんglPopMatrix();

次に、これ:

glBegin(GL_LINES);
glColor3f(0.0,1.0, 0.0);
glVertex4f( tOrigin[0], tOrigin[1], tOrigin[2], tOrigin[3] );
glVertex4f( tNormal[0]*tOrigin[3] + tOrigin[0], 
            tNormal[1]*tOrigin[3] + tOrigin[1], 
            tNormal[2]*tOrigin[3] + tOrigin[2], 
            tOrigin[3] );
glEnd();

glMultMatrixf(m_mat);

最後の glMultMatrix が何をすることを期待していますか?

私に当てさせてください?どういうわけか、OpenGL がそのベクトルを行列で乗算し (これを行う)、それを返すことを期待します (これは、少なくともこの方法ではありません)。

ここで知っておくべき重要なことがあります: OpenGL は数学ライブラリではありません

実際、すべての行列操作関数が OpenGL-4 から削除されたため、人々は OpenGL を目的としていないものを使用しなくなりました。最初のコードがうまくいった場合: これはまさにそれが行われるべき方法です。

ただし、正確に何を達成しようとしているのかは完全には明らかではありません。もっとエレガントで簡単な方法があるかもしれません。

于 2011-02-25T11:20:53.733 に答える
1

乗算の問題は、乗算pVectorが完了する前に変更することです。一時変数または別の変数に保存する必要があります!

関数を次のように変更します。

void OpenGLUtility::VectorMultiMatrix4f(float* pVector, float* pMat)
{
    float x = pMat[0]*pVector[0] + pMat[4]*pVector[1] + pMat[ 8]*pVector[2] + pMat[12]*pVector[3] ;
    float y = pMat[1]*pVector[0] + pMat[5]*pVector[1] + pMat[ 9]*pVector[2] + pMat[13]*pVector[3] ;
    float z = pMat[2]*pVector[0] + pMat[6]*pVector[1] + pMat[10]*pVector[2] + pMat[14]*pVector[3] ;
    float w = pMat[3]*pVector[0] + pMat[7]*pVector[1] + pMat[11]*pVector[2] + pMat[15]*pVector[3] ;

    pVector[0] = x;
    pVector[1] = y;
    pVector[2] = z;
    pVector[3] = w;
}
于 2011-02-25T09:55:07.983 に答える