【问题标题】:NaNs in Eigen3 quaternion returned by slerp()slerp() 返回的 Eigen3 四元数中的 NaN
【发布时间】:2021-10-20 17:35:35
【问题描述】:

我在使用 Eigen3 四元数时遇到了一些奇怪的行为。在我正在开发的应用程序的上下文中,我偶尔会使用两个相同的四元数调用slerp() - 有时就像将实部设为 1 并将所有虚部系数设为 0 一样简单。 slerp() 返回的四元数的所有系数都有 NaN。为了让它更令人沮丧,我写了一个简单的main(),除了操纵类似的四元数之外什么都不做。在那里,slerp() 的行为符合我的预期。

还有其他人遇到过这种情况吗?

在我的应用程序中,我已经求助于测试两个四元数是否通过了isApprox() 测试,如果通过了,则跳过对slerp() 的调用。这可以作为创可贴,但我不喜欢 slerp() 在稍微不同的情况下也会出现类似的行为不端的感觉。

【问题讨论】:

  • 您必须在获得 NaN 时隔离案例。例如。记录确切的输入值并在您的简单main 中尝试它们。不要忘记以足够的精度记录以准确再现数字,即使用std::numeric_limits::max_digits10
  • @Ruslan 我以为我已经做到了,但事实证明我没有。感谢您对我的推动,让我检查了一些假设。

标签: c++ quaternions eigen3


【解决方案1】:

事实证明,我无意中删除了我正在处理的代码中的一个重要的} else { 行。这确保了我传递给slerp() 的插值因子是除以零运算的结果。在我的简单测试设备中,我提供的插值因子应该是实际代码中的值。

再一次,这个故事的寓意是确保你实际上测试你认为你正在测试的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多