【发布时间】:2016-08-11 18:36:35
【问题描述】:
我目前正试图弄清楚四元数如何在 glm 中为 opengl 相乘和连接,但我发现的每个线程都只提到 1 个四元数旋转....基本上,我如何组合四元数以使所有旋转连接?例如:
glm::quat quaternions[4]; // how to merge all 4 quaternions?
到目前为止,我已经尝试了两种方法:
// approach 1:
glm::quat quaternions[4];
glm::quat q = glm::quat(glm::vec3(0));
q *= quaternions[0];
q *= quaternions[1];
q *= quaternions[2];
q *= quaternions[2];
glm::mat4 matrix = glm::toMat4(q);
// approach 2:
glm::quat quaternions[4];
glm::mat4 matrix = glm::mat4(1.0f);
matrix = matrix * glm::toMat4(quaternions[0]);
matrix = matrix * glm::toMat4(quaternions[1]);
matrix = matrix * glm::toMat4(quaternions[2]);
matrix = matrix * glm::toMat4(quaternions[2]);
这些方法似乎都没有给我预期的结果。
编辑:我应该补充一点,我正在尝试使用 assimp 和 glm 对 collada 模型进行皮肤处理。方法 1 和 2 为我提供了我正在寻找的确切解决方案,因此任何一个都应该有效。
【问题讨论】:
-
一个更好的问题是......为什么你有 4 个四元数开始?它们代表什么?另外,您期待什么结果?
-
@Jas 我可以推荐你做一个小的 UnitTest。例如,您创建 2 或 3 个四元数并将其合并并输出结果。我希望你能看一下最终的四元数值并说它是否正确。我怎么知道四元数是矢量+天使(或者你可以转换四元数欧拉度)。您也可以将此测试发布到问题中,这将有助于找到解决方案。有许多细微差别:乘法顺序、乘法方法等。
-
@Jas: "而且骨骼有一个父子层次结构,所以我需要结合四元数来实现子元素的旋转。" 不,你需要结合 transformations,而不是旋转。平移、旋转、缩放,所有这些都在层次结构中累积。您需要在本地独立计算每个对象的变换矩阵,然后组合它们以获得完整的对象到局部变换。这不需要累积四元数,而是需要完整的矩阵变换。
-
@Jas,我认为您可以使用俯仰、滚动、偏航来获得欧拉角。
-
@Jas:那么这个四元数积累的东西是从哪里来的?如果您要为每个骨骼创建一个矩阵,并将其与父矩阵相加,那么您为什么要尝试将一堆四元数相乘?每个骨骼的方向都是一个单个四元数,那么每个骨骼的多个四元数是从哪里得到的?