通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
What values should a glm::mat4 made via a zero argument constructor contain?
通过零参数构造函数创建的 glm::mat4 应该包含哪些值?在 64 位 Windows 10 上,使用通过 vcpkg 安装的 64 位 GLM v0.9.9.0,glm::mat4()
的结果是一个填充零的 4x4 矩阵。这在具有默认 GLM 的 64 位 Ubuntu 18.04 LTS 上是相同的。
另一方面,我可以在 GLMtype_mat4x4.inl
的顶部附近看到存在一个定义,该定义将内容设置为等于单位矩阵。(这在我上面描述的两个版本中被有条件地排除在外。不过,我的同事告诉我,在他的系统上调用glm::mat4()
确实会产生一个单位矩阵。
这些差异是否反映了 GLM 的最新变化?也就是说,如果我们都使用最新版本的 GLM,差异会消失吗?或者,GLM 在两个不同的系统上会产生两种不同的结果是设计使然吗?
来自 GLM 网站:
GLM 提供使用 与 GLSL 相同的命名约定和功能
和 GLSL 规范
如果矩阵构造函数只有一个标量参数,则它是 用于初始化矩阵对角线上的所有分量,使用 其余组件初始化为 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
这在 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()
将始终为全零。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 我有一个包裹的矢量.我该如何判断它包含哪种类型
- 我应该使用main.cpp中包含的哪一个(LNK2005已经定义)