0

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

我通过调用以下两种不同的方式来放置我的代码。函数 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

乘法的问题在于您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 回答
1

所以。重新格式化你的代码后,我会评论它:首先让我们看看代码 2

float inverse[16];

glMatrixMode(GL_MODELVIEW);
glPushMatrix();

好的,对modelview矩阵进行操作,推送modelview矩阵栈。

glMultMatrixf(m_mat);

与矩阵相乘m_mat

OpenGLUtility::InverseMatrix(m_mat, inverse);

反转它……</p>

glMultMatrixf(inverse);

然后你把它乘回来,所以你已经完成了

M * M^-1 = 我

当然,这只有在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 来处理它不适合的事情。如果第一个代码适合您:很好!这正是它应该如何完成的。

但是,尚不完全清楚您到底要达到什么目标;可能有一种更优雅或更直接的方式来做到这一点。

于 2011-02-25T11:20:53.733 回答