我正在尝试做一个简单的投影,但我遇到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
答案 0 :(得分:2)
GLM没有任何问题,你在乘法中使用未初始化的glm::vec4 v
。
检查此行:
glm::vec4 v = mvp * v;
相反,你应该这样做:
glm::vec4 v = mvp * vert;