どうも、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);