这种矩阵乘法有什么问题?

时间:2014-02-09 08:54:49

标签: c++ glm-math

我正在尝试做一个简单的投影,但我遇到GLM问题。我已将问题代码隔离到此示例中。一切都很好,直到glm::vec4 v = mvp * v;。由于类型不匹配(例如double和float),我已经读过其他遇到类似问题的人。我会得到非常大或非常小的数字来改变每个运行时。这让我相信某些东西指向垃圾地址。

如何判断vec4和mat4是什么类型(它们是模板化的)?这里还有其他问题吗?这令人沮丧,因为我知道我的错误一定很少,但我无法理解。

#define GLM_FORCE_RADIANS // Hide warnings
#include <cstdio>
#include <cstdlib>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>

void print_mat4(glm::mat4 mat)
{
    int i, j;
    for (j = 0; j < 4; j++) 
    {
        for (i = 0; i < 4; i++) 
        {
            printf("%f\t", mat[i][j]);
        }

        printf("\n");
    }
}

int main()
{
    glm::mat4 projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
    glm::mat4 view = glm::lookAt(
        glm::vec3(4.0f, 3.0f, 3.0f), 
        glm::vec3(0.0f, 0.0f, 0.0f), 
        glm::vec3(0.0f, 1.0f, 0.0f)  
    );

    glm::mat4 model = glm::mat4(1.0f);   
    glm::mat4 mvp   = projection * view * model;


    printf("Projection: \n");
    print_mat4(projection);
    printf("View: \n");
    print_mat4(view);
    printf("Model: \n");
    print_mat4(model);
    printf("MVP: \n");
    print_mat4(mvp);;

    glm::vec4 vert = glm::vec4(-1.0f, -1.0f, 0.0f, 1.0f);
    glm::vec4 v = mvp * v;

    printf("\nOriginal: (%f, %f, %f, %f)\n", vert.x, vert.y, vert.z, vert.w);
    printf("Transformed: (%f, %f, %f, %f)\n", v.x, v.y, v.z, v.w);

    return 0;
}

P.S。您可以编译并运行此代码而无需链接任何内容。 g++ matrix_test.cpp -o matrix_test && ./matrix_test

1 个答案:

答案 0 :(得分:2)

GLM没有任何问题,你在乘法中使用未初始化的glm::vec4 v

检查此行:

glm::vec4 v = mvp * v;

相反,你应该这样做:

glm::vec4 v = mvp * vert;