Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;glm::翻译;输出值不正确的矩阵_C++_Opengl_Visual Studio 2017_Glm Math - Fatal编程技术网

C++ &引用;glm::翻译;输出值不正确的矩阵

C++ &引用;glm::翻译;输出值不正确的矩阵,c++,opengl,visual-studio-2017,glm-math,C++,Opengl,Visual Studio 2017,Glm Math,我使用示例代码测试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 <&

我使用示例代码测试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;
而不是预期的
2,1,0

可能的原因是什么?我能做些什么

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

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

glm::mat4 trans;
您尚未初始化矩阵,但已对其执行算术运算。您不能假设构造函数将初始化其内存,因此请更改为:

glm::mat4 trans(1.0f);
这应该可以解决问题

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


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

初始化翻译矩阵

glm::mat4 trans(1);

是什么让你认为正确的答案是
2,1,0
?您是否已使用调试器逐步完成了代码?MS VS 2017内置了一个很棒的图形调试器。我无法重现您的问题。使用上面的代码,我得到的输出
2,1,0
。无法重现。施工后立即进行的
trans
的组件是什么?我似乎想起了一个较旧版本的
glm
,它的
mat4
默认构造函数使组件未初始化,而不是作为标识矩阵。@G.M.是的,这就是问题所在。谢谢将其初始化为标识矩阵有帮助。仅用于记录:在较新版本的glm中,默认构造函数总是创建标识矩阵。也许是这样,但如果您遵循良好的编程实践,您也应该使用RAII(资源获取就是初始化)。未初始化的东西会导致大量错误,因此养成这种习惯会使代码更加稳定。@BDL我使用了最新版本的glm,但仍然遇到同样的问题。是否需要设置任何配置来启用默认构造?@YuanMa:如果您有新问题,请随意提问(例如:“我有问题X,找到了答案Y。但不幸的是,由于Z,这对我不起作用。”别忘了提到编译器/OS,并提供一个不起作用的代码的最小示例)。你可以把我放在这里,我可以看看。
glm::mat4 trans(1.0f);
glm::mat4 trans(1);