Eigen slerp导致读取访问冲突(C ++ / OpenGL)

时间:2018-05-04 05:59:14

标签: c++ vector eigen quaternions

我从Eigen libary拨打slerp(),如下所示:

Eigen::MatrixXf Rtime = (Eigen::Quaternionf::Identity().slerp(timer, quarts[i])).toRotationMatrix();

其中timer是浮点数,夸脱被声明为

std::vector<Eigen::Quaternionf> quarts;

此slerp调用有时会导致读取访问冲突(大约50%的时间),这让我感到困惑。

查看堆栈框架,Stack Frame 我可以看到代码到达Eigen::internal::pload,直到它中断。

一般来说,我认为我的指数不正确但即使崩溃也会崩溃 i = 0quarts.size() = 1。我在向量中声明了唯一的四元数:

Eigen::Matrix3f rotMatrix;
    rotMatrix = U * V;
    Eigen::Quaternionf temp;
    temp = rotMatrix;
    quarts.push_back(temp);

其中UV来自奇异值分解的计算,所以我宣布四元数的方式可能有问题吗?或者以某种方式将其存储在矢量中会影响它?我不确定。

1 个答案:

答案 0 :(得分:2)

问题是Quaternionf需要std::vector无法保证的16字节对齐。更多细节there。解决方案要么使用对齐的分配器,例如:

std::vector<Quaternionf,Eigen::aligned_allocator<Quaternionf>> quats;

或在向量中使用未对齐的四元数:

std::vector<Quaternion<float,Eigen::DontAlign>> quats;