все, я пытаюсь умножить матрицу на вектор в OpenGL, но оказывается, что результат рендеринга, который я получил, вызвав свое умножение function(OpenGLUtility::VectorMultiMatrix4d())
, отличается от вызова функции opengl glMultMatrixf()
. Две линии, нарисованные на экране, не совпадают.
Я поставил свой код, назвав его двумя разными способами.
Функция OpenGLUtility :: VectorMultiMatrix4d () проста, просто умножение на столбцы.
Может кто-нибудь дать мне несколько советов по этому поводу? Большое спасибо.
Code1:
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);