【问题标题】:glm quaternion rotation mergeglm四元数旋转合并
【发布时间】: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:那么这个四元数积累的东西是从哪里来的?如果您要为每个骨骼创建一个矩阵,并将其与父矩阵相加,那么您为什么要尝试将一堆四元数相乘?每个骨骼的方向都是一个单个四元数,那么每个骨骼的多个四元数是从哪里得到的?

标签: opengl glm-math assimp


【解决方案1】:

经过 3 天的反复试验,我终于弄清楚发生了什么。原来我的一些骨头在搅拌机里有一个“滚动”,把事情搞砸了。颠倒的骨头也是我的网格中的一个问题。因此,对于任何遇到 assimp 加载动画问题的人:

  • 首先检查您的绑定姿势
  • 确保没有倒置的骨头,这可能会导致一些问题。
  • 检查所有骨骼信息(在我的情况下是“滚动”导致问题)

所以我的四元数代码没有错...

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 2012-08-16
    • 2020-11-06
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多