glm::quat 为什么 x,y,z,w 分量的顺序是混合的
glm::quat why the order of x,y,z,w components are mixed
我刚开始使用四元数并注意到 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。这是预期的行为吗?如果是,这背后的原因是什么?
这真是令人沮丧。各种数学库使用不同的约定,但 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]));
Note: The [] operator is return (&x)[i];
(which assumes x is first)
我刚开始使用四元数并注意到 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。这是预期的行为吗?如果是,这背后的原因是什么?
这真是令人沮丧。各种数学库使用不同的约定,但 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]));
Note: The [] operator is
return (&x)[i];
(which assumes x is first)