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));
是否有它们不同的原因,这会导致错误的图形表示吗?
请在您的问题中添加一个最小的工作示例。我不是数学家,但您可能想看看operator*
-glm::qua
第280-292行的here实现。您的假设在手动计算时有意义吗?