glm :: quat为什么x,y,z,w组件的顺序是混合的

时间:2018-01-19 19:48:53

标签: c++ quaternions glm-math

我刚刚开始使用四元数,并注意到glm :: quat元素的顺序是混合的。这就是我的意思。如果我声明像这样的glm :: quat

glm::quat quat = glm::quat(1, 2, 3, 4);

然后像这样打印x,y,z,w

std::cout << quat.x << " " << quat.y << " " << quat.z << " " << quat.w;

它打印2 3 4 1.这是预期的行为吗?如果是的话,这背后的原因是什么?

1 个答案:

答案 0 :(得分:5)

这真令人沮丧。各种数学库使用不同的约定,但GLM似乎在内部不一致(至少从2018年初开始)。

构造函数glm::quat(...) w,x,y,z

  

quaternion.hpp:
GLM_FUNC_DECL GLM_CONSTEXPR tquat(T w, T x, T y, T z);

*注意空构造函数不再初始化为标识。见GLM_FORCE_CTOR_INIT。可以添加到CFLAGS。

内部订单为 x,y,z,w

  

quaternion.hpp:
struct { T x, y, z, w;};

使用glm::make_quat只需一个memcpy,即 x,y,z,w

  

type_ptr.inl:
memcpy(value_ptr(Result), ptr, sizeof(tquat<T, defaultp>));

使用glm::string_cast可以 w,x,y,z

  

string_cast.inl:

return detail::format(FormatStr.c_str(),
          static_cast<typename cast<T>::value_type>(x[3]),
          static_cast<typename cast<T>::value_type>(x[0]),
          static_cast<typename cast<T>::value_type>(x[1]),
          static_cast<typename cast<T>::value_type>(x[2]));
     

注意:[]运算符为return (&x)[i];(假定x为第一个)