通过Opengl函数(glMultMatrixf())和我自己的函数之间的乘法变换矩阵的区别

时间:2011-02-25 08:20:16

标签: opengl vector transform 3d matrix-multiplication

所有,我试图将矩阵乘以OpenGL中的向量,但事实证明,通过调用opengl函数function(OpenGLUtility::VectorMultiMatrix4d())调用自己的乘法glMultMatrixf()得到的渲染结果是不同的。屏幕上绘制的两条线不相同。

我通过两种不同的方式调用我的代码。 OpenGLUtility :: VectorMultiMatrix4d()函数很简单,只是colume-major乘法。

有人能给我一些建议吗?非常感谢。


代码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);

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

因此。重新格式化代码后,我会对其进行评论:首先让我们看一下代码2

float inverse[16];

glMatrixMode(GL_MODELVIEW);
glPushMatrix();

好的,在模型视图矩阵上操作,推送模型视图矩阵堆栈。

glMultMatrixf(m_mat);

乘以矩阵m_mat

OpenGLUtility::InverseMatrix(m_mat, inverse);

反转它......

glMultMatrixf(inverse);

然后你将它再增加,所以你已经完成了

M * M ^ -1 = I

当然,这仅在mat_m完全可逆时才有效。但如果它是可逆的,那么这两个操作就会取消,不会发生任何事情。

顺便说一句:你错过了结束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来实现它的目的。如果第一个代码适合你:好!这正是应该如何完成的。

然而,目前还不完全清楚你想要达到的目标;可能会有一种更优雅或更直接的方式。