"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" 输出一个值不正确的矩阵的主要内容,如果未能解决你的问题,请参考以下文章

glm::translate 与本地空间

一些opengl和glm解释

包含/使用 GLM 库的问题

GLM 中的矩阵除法

GL Math : GLM 旋转函数旋转整个坐标系

旋转玩家模型以指向一个点