openGL / glut& glm ModelView矩阵

时间:2015-01-14 04:14:43

标签: opengl matrix glm-math model-view

我一直在尝试将模型视图矩阵用于我的一个项目,但是现在我得到了一些意想不到的结果,这阻碍了我的进一步发展。

GameEntity::GameEntity{
   view_matrix = glm::lookAt(glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f), glm::vec3(0.f, -1.f, 0.f));
   //view_matrix = glm::mat4(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0); //glLoadIdentity 
   //returns this matrix, since model_matrix is identity then this is clean view_matrix?
   model_matrix = glm::mat4(1.0f);
}

void GameEntity::Scale(glm::vec3 vector)
{
    model_matrix = glm::scale(model_matrix, vector);
}

void GameEntity::getMatrix(GLfloat arr[16])
{
    glm::mat4 modelview = view_matrix * model_matrix;
    for (int i = 0; i < 4; i++){
        arr[i] = modelview[i][0];
        arr[i+1] = modelview[i][1];
        arr[i+2] = modelview[i][2];
        arr[i+3] = modelview[i][3];
        }
}

现在预期的结果是矩阵(这是我从glLoadIdentity和glScale(0.3,0.3,1.0)得到的)

[ 0.3, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.3 ]
[ 0.0, 0.0, 0.3, 0.0 ]

但是在缩放后我得到矩阵(右边是直接使用inputed view_matrix,GameEntity注释代码)

[ 0.3, 0.0, 0.0, 0.0 ]    [ 0.3, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ]    [ 0.0, 0.0, 0.0, 0.0 ]
[ 0.0, 0.0, 0.0, 0.0 ]    [ 0.0, 0.0, 0.0, 1.0 ]
[ 0.0, 0.0, 0.0, 1.0 ]    [ 0.0, 0.0, 1.0, 0.0 ]

使用第一个矩阵,我得到一个扁平为双线的圆,其中第二个矩阵在单轴上伸展。我有什么想法我做错了吗?

1 个答案:

答案 0 :(得分:3)

您的Get Matrix功能错误。当你遍历循环时,你没有跳过arr中正确数量的元素,第一次迭代是

    arr[0] = modelview[0][0];
    arr[1] = modelview[0][1];
    arr[2] = modelview[0][2];
    arr[3] = modelview[0][3];

第二个

    arr[1] = modelview[1][0];
    arr[2] = modelview[1][1];
    arr[3] = modelview[1][2];
    arr[4] = modelview[1][3];

等等。你必须使用

解决这个问题
for (int i = 0; i < 4; i++) {
    arr[4*i  ] = modelview[i][0];
    arr[4*i+1] = modelview[i][1];
    arr[4*i+2] = modelview[i][2];
    arr[4*i+3] = modelview[i][3];
}

BTW:你为什么要在getMatrix原型中烦恼?显然你想在这里使用普通的C数组,所以只需使用指针(或大小的数组函数参数类型,它们就像一个指针)。 void GameEntity::getMatrix(GLfloat arr[16])同样适用,并且更容易阅读。在那里使用指针绝对没有任何好处。