C++ 什么';这个矩阵乘法怎么了?

C++ 什么';这个矩阵乘法怎么了?,c++,glm-math,C++,Glm Math,我正在尝试做一个简单的投影,但是我在使用GLM时遇到了问题。我已经将问题代码隔离到这个示例中。在glm::vec4 v=mvp*v之前,一切都是井然有序的。我曾读到其他人因为类型不匹配(例如double和float)而遇到类似问题。我得到了非常大或非常小的数字,它们会改变每个运行时。这让我相信有东西指向某个垃圾地址 如何判断vec4和mat4是什么类型(它们是模板化的)?这里还有什么问题吗?这是越来越令人沮丧,因为我知道我的错误一定很小,但我不能找出它 #define GLM_FORCE_RAD

我正在尝试做一个简单的投影,但是我在使用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;
}
#定义GLM_力_弧度//隐藏警告
#包括
#包括
#包括
#包括
#包括
无效打印材料4(glm::mat4材料)
{
int i,j;
对于(j=0;j<4;j++)
{
对于(i=0;i<4;i++)
{
printf(“%f\t”,mat[i][j]);
}
printf(“\n”);
}
}
int main()
{
glm::mat4投影=glm::透视图(45.0f、1.0f、0.1f、100.0f);
glm::mat4视图=glm::注视(
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模型=glm::mat4(1.0f);
glm::mat4 mvp=投影*视图*模型;
printf(“投影:\n”);
印刷材料4(投影);
printf(“视图:\n”);
打印图4(视图);
printf(“型号:\n”);
打印材料4(型号);
printf(“MVP:\n”);
印刷材料4(mvp);;
glm::vec4 vert=glm::vec4(-1.0f,-1.0f,0.0f,1.0f);
glm::vec4 v=mvp*v;
printf(“\n原始:(%f,%f,%f,%f)\n”,垂直x、垂直y、垂直z、垂直w);
printf(“已转换:(%f,%f,%f,%f)\n”,v.x,v.y,v.z,v.w);
返回0;
}

另外,您可以编译和运行此代码,而无需链接任何内容
g++matrix_test.cpp-o matrix_test&./matrix_test

GLM没有问题,您在乘法中使用了未初始化的
GLM::vec4 v

选中此行:

glm::vec4 v = mvp * v;
相反,您应该这样做:

glm::vec4 v = mvp * vert;

好的,这样就解决了这个问题。我猜这在我的实际程序中不起作用的原因是我将制服传递给GLSL的方式。你的回答是一个很大的帮助,因为现在我知道错误不在于矩阵的形成,而在于我之后对它们所做的。谢谢