【问题标题】:glm returning nan on simple translateglm 在简单翻译上返回 nan
【发布时间】:2018-08-10 00:49:11
【问题描述】:

我正在使用 glfw、glad 和 glm 修补 OpenGL。在我正在使用的其中一个教程中,他们演示了 glm 的一些简单用法:

glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);
glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
vec = trans * vec;
std::cout << vec.x << vec.y << vec.z << std::endl;

当我编译和运行这段代码时,我得到了垃圾值(通常是 NAN)。该教程特别指出,实例化

glm::mat4 trans;

默认情况下会为变量“trans”创建一个单位矩阵。我认为这可能是问题所在,尽管我已经验证 glm 默认会这样做。

如果对您有帮助,您可以在第 308 行找到整个源文件 here。非常感谢您的宝贵时间!

【问题讨论】:

  • 感谢 Rabbid76。我刚刚发现 glm::mat4 trans = glm::mat4(1.0f);是一种更详细的方式来执行您刚刚展示的内容。当您发布此问题时,我正在自己回答这个问题。我不能接受我发布了至少 2 天的答案,所以如果您想将您的评论作为答案发布,我会将其标记为正确。

标签: c++ opengl matrix glm-math coordinate-transformation


【解决方案1】:

回答我自己的问题:虽然教程和其他消息来源说 glm 会自动实例化一个身份向量

glm::mat4 trans;

它没有。看一个不同的教程,似乎你可以明确地这样做

glm::mat4 trans = glm::mat4(1.0f);

这解决了问题!

【讨论】:

  • 是的,这是一种奇怪的行为,我只是在处理同样令人讨厌的错误。 glm::mat4 m 应该自动初始化为单位矩阵,但它没有。也许这是一个版本的事情......
【解决方案2】:

你必须初始化矩阵变量glm::mat4 trans

glm API documentation 指的是The OpenGL Shading Language specification 4.20

5.4.2 向量和矩阵构造函数

如果向量构造函数有一个标量参数,它用于将构造向量的所有组件初始化为该标量的值。 如果矩阵构造函数只有一个标量参数,则用于初始化矩阵对角线上的所有分量,其余分量初始化为 0.0。

这意味着,单位矩阵可以由单个参数 1.0 初始化:glm::mat4(1.0f)

以某种方式更改您的代码:

glm::mat4 trans(1.0f);


另见OpenGL Mathematics (GLM); 2. Vector and Matrix Constructors

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多