通过零参数构造函数生成的glm :: mat4应该包含哪些值?

时间:2018-09-11 23:04:13

标签: c++ constructor glm-math

通过零参数构造函数生成的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在设计上会在两个不同的系统上产生两个不同的结果?

1 个答案:

答案 0 :(得分:1)

来自GLM site

  

GLM提供了通过以下方式设计和实现的类和功能:   与GLSL相同的命名约定和功能

还有GLSL spec

  

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

因此,glm::mat4()是全零矩阵,glm::mat4(1)是恒等矩阵。

在0.9.9之前的GLM版本中,您可以在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

还有this has changed in 0.9.9

#   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

换句话说:GLM允许并且一直允许通过使用一些#define来更改默认的GLSL初始化。否则,glm::mat4()将始终为全零。