glm :: mat4通过零参数构造函数创建的值应包含哪些值?

问题描述 投票:1回答:1

glm :: mat4通过零参数构造函数创建的值应包含哪些值?在64位Windows 10上,使用通过vcpkg安装的64位GLM v0.9.9.0,glm::mat4()的结果是一个填充零的4x4矩阵。在具有默认GLM的64位Ubuntu 18.04 LTS上也是如此。

另一方面,我可以看到GLM的type_mat4x4.inl顶部附近存在一个定义,它将内容设置为等于单位矩阵。 (这在我上面描述的两个版本中有条件地被排除。)我的同事虽然告诉我,在他的系统上调用glm::mat4()会产生一个单位矩阵。

这些差异是否反映了最近GLM的变化​​?也就是说,如果我们都使用最新版本的GLM,差异会消失吗?或者,GLM是否会在两个不同的系统上产生两种不同的结果?

c++ constructor glm-math
1个回答
1
投票

来自GLM site

GLM提供的类和函数设计和实现具有与GLSL相同的命名约定和功能

GLSL spec

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

因此,qazxsw poi是全零矩阵,而qazxsw poi是单位矩阵。

在0.9.9之前的GLM版本中,您可以在glm::mat4()找到

glm::mat4(1)

type_mat4x4.inl

#   if !GLM_HAS_DEFAULTED_FUNCTIONS || !defined(GLM_FORCE_NO_CTOR_INIT)
            template <typename T, precision P>
            GLM_FUNC_QUALIFIER tmat4x4<T, P>::tmat4x4()
            {
#           ifndef GLM_FORCE_NO_CTOR_INIT 
                this->value[0] = col_type(1, 0, 0, 0);
                this->value[1] = col_type(0, 1, 0, 0);
                this->value[2] = col_type(0, 0, 1, 0);
                this->value[3] = col_type(0, 0, 0, 1);
#           endif
            }
#   endif

换句话说:GLM允许并且一直允许通过使用一些this has changed in 0.9.9s来更改默认的GLSL初始化。如果没有,# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE template<typename T, qualifier Q> GLM_FUNC_QUALIFIER GLM_CONSTEXPR mat<4, 4, T, Q>::mat() # if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALIZER_LIST : value{col_type(1, 0, 0, 0), col_type(0, 1, 0, 0), col_type(0, 0, 1, 0), col_type(0, 0, 0, 1)} # endif { # if GLM_CONFIG_CTOR_INIT == GLM_CTOR_INITIALISATION this->value[0] = col_type(1, 0, 0, 0); this->value[1] = col_type(0, 1, 0, 0); this->value[2] = col_type(0, 0, 1, 0); this->value[3] = col_type(0, 0, 0, 1); # endif } # endif 将永远是全零。

© www.soinside.com 2019 - 2024. All rights reserved.