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