【问题标题】:"glm::translate" outputs a matrix with incorrect values"glm::translate" 输出一个值不正确的矩阵
【发布时间】:2017-11-08 11:12:11
【问题描述】:

我拿了一个示例代码来测试 glm::translate 函数:

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;

它输出以下内容:

-4.29497e+08, -4.29497e+08, -4.29497e+08

而不是预期的2, 1, 0

可能的原因是什么,我该怎么办?

(我应该搜索这段代码之外的缺陷吗?)

【问题讨论】:

  • 是什么让你认为正确答案是2, 1, 0?您是否使用调试器单步执行了代码? MS VS 2017 内置了一个很棒的图形调试器。
  • 我无法重现您的问题。使用上面的代码,我得到了输出2, 1, 0
  • 无法复制。 trans 构建后立即包含哪些组件?我似乎记得glm 的旧版本,其mat4 默认构造函数使组件未初始化,而不是作为单位矩阵。
  • @G.M.是的,这就是问题所在。谢谢。将其初始化为单位矩阵会有所帮助。

标签: c++ opengl visual-studio-2017 glm-math


【解决方案1】:
-4.29497e+08

这看起来像是未初始化的内存,这会让我相信缺陷在于:

glm::mat4 trans;

您尚未初始化矩阵,但已对其执行算术运算。你不能假设构造函数会初始化它的内存,所以改为:

glm::mat4 trans(1.0f);

这应该可以解决问题。

可能不会出现在所有开发环境中,例如,VS 中的调试模式有一些保护措施来防止这种情况,但它会出现在发布模式中。

简单地说:练习 RAII:资源获取就是初始化。至少,将内存归零,因为当重新分配内存时,它将被设置为上次释放时的值。

【讨论】:

  • 仅作记录:在较新版本的 glm 中,默认构造函数总是创建一个单位矩阵。
  • 也许是这样,但如果您遵循良好的编程习惯,您还应该使用 RAII(资源获取即初始化)。未初始化的东西会导致大量错误,因此养成这种习惯会使代码更稳定。
  • @BDL 我使用了最新版本的 glm,但我仍然遇到同样的问题。是否需要设置任何配置才能启用默认构造?
  • @YuanMa:如果您有新问题,请随时提出(例如:“我有问题 X 并找到答案 Y。但不幸的是,由于 Z,这对我不起作用。”不要不要忘记提及编译器/操作系统,并提供您的不工作代码的最小示例)。你可以在这里 ping 我,我可能会看看。
【解决方案2】:

初始化你的翻译矩阵

glm::mat4 trans(1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多