glm :: quat * glm :: quat避免不准确

问题描述 投票:0回答:1

EDIT 2.0:

我在大学有一个项目。

对于“计算机图形学”模块的讲座“坐标转换”,我必须编写一个与Unity提供的转换类相似的转换类。因此,我在Unity中创建了一个测试方案,以获取一些数据以在类完成后对其进行测试。现在我完成了课程,现在想测试它。

班上的学生很好。正确计算了全局位置,旋转和比例以及localToWorldMatrix和worldToLocalMatrix。但仅当对象不旋转时。如果将它们旋转,则其值与预期的统一测试值会略有不同。这是因为glm四元数乘法返回的值与Unity四元数乘法不同,尽管计算方式完全相同。

参考:https://github.com/jamesjlinden/unity-decompiled/blob/master/UnityEngine/UnityEngine/Quaternion.cs第121行

[我的最初想法是四元数未进行归一化,但是当我对glm和unity的结果进行归一化时,它们仍然相差1-3个百分点。

[此外,当我将四元数放入像https://quaternions.online/这样的可视化工具中时,无论我使用哪种旋转顺序,统一四元数都代表正确的旋转,而glm四元数代表相差3-5°的旋转。

示例:

假设我有一个对象,其旋转度为glm::quat(1.0f, 0.2f, 0.0f, 0.0f),而另一个对象的第一个对象为其父级,其局部旋转度为glm::quat(0.9f, -0.1f, -0.3f, 0.3f).。要计算子级的GLOBAL旋转度,我们只需计算parent * child 。因此,使用glm的代码应如下所示:

glm::quat parent(1.0f, 0.2f, 0.0f, 0.0f);
glm::quat child(0.9f, -0.1f, -0.3f, 0.3f);
glm::quat global = parent * child;

当我输出global时,它具有以下值:0.92 0.08 -0.36 0.24.但这非常不精确。期望值单位近似:0.888225 0.08835998 -0.3977757 0.2121877.

[当我使用矩阵计算时,它会变得更好一点:0.902219 0.0855668 -0.355124 0.232759.但是,这仍然非常不精确:

glm::quat global = glm::quat_cast(glm::mat4_cast(parent) * glm::mat4_cast(child));

是否有它们不同的原因,这会导致错误的图形表示吗?

c++ glm quaternions
1个回答
0
投票

请在您的问题中添加一个最小的工作示例。我不是数学家,但您可能想看看operator*-glm::qua第280-292行的here实现。您的假设在手动计算时有意义吗?

© www.soinside.com 2019 - 2024. All rights reserved.