【问题标题】:glm::quat why the order of x,y,z,w components are mixedglm::quat 为什么 x,y,z,w 分量的顺序是混合的
【发布时间】:2018-01-19 19:48:52
【问题描述】:

我刚开始使用四元数并注意到 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。这是预期的行为吗?如果是的话,这背后的原因是什么?

【问题讨论】:

  • 对于四元数,w,x,y,z 的正确性不亚于 x,y,z,w。或者换一种说法,如果选择先打印quat.w,就不再是“混”了。
  • 是的,所以在我的程序中,我只是按照 w,x,y,z 的顺序或常规的 x,y,z,w (至少在我使用 vec4 时是常规的)和一切效果很好。我只是好奇为什么会这样。
  • 啊。您可能会问为什么quatvec4 为共享相同 名称的变量选择不同 排序。

标签: c++ quaternions glm-math


【解决方案1】:

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

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

四元数.hpp:
GLM_FUNC_DECL GLM_CONSTEXPR tquat(T w, T x, T y, T z);

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

内部顺序为x、y、z、w

四元数.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&lt;T, defaultp&gt;));

使用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 (&amp;x)[i];(假设 x 是第一个)

【讨论】:

  • 感谢您比我更好地澄清了我对 quats 的挫败感 :)。这正是我的问题。作为 3D 图形领域的初学者,由于这些不一致,我遭受了大约 6 个小时的痛苦。我试图调试我的程序并且得到了意想不到的结果,因为我不知道构造函数和内部订单将“W”组件放在不同的插槽中。
  • jozxyqk,只是感兴趣...... GLM 是否在某处声明“空构造函数不再初始化为标识”? (这是一个非常重要的变化,在迁移到新的 GLM 后可能会导致大问题......)
  • @Gediminas 是的。我对此有一个小注释,只是将其扩展为引用 GLM_FORCE_CTOR_INIT。
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多