"glm::translate" 输出一个值不正确的矩阵
Posted
技术标签:
【中文标题】"glm::translate" 输出一个值不正确的矩阵【英文标题】:"glm::translate" outputs a matrix with incorrect values 【发布时间】: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.是的,这就是问题所在。谢谢。将其初始化为单位矩阵会有所帮助。
【参考方案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);
【讨论】:
以上是关于"glm::translate" 输出一个值不正确的矩阵的主要内容,如果未能解决你的问题,请参考以下文章