Eigen,用四元数旋转vector3d?

时间:2018-05-24 11:01:04

标签: eigen

我有一个3d点数组,作​​为std::vector<Eigen::Vector3d>

我需要用位置和四元数转换这些点。

我的问题是:

如何使用四元数旋转这些点?是否有比以下更快的方式:

    Eigen::Vector3d Trans; // position to move by
    Eigen::Quaterniond quats;  // quat to rotate by

for (int p = 0; p < objectPoints.size(); p++)
        {
            Eigen::Vector3d pnt;
            //add pose
            pnt.x = objectPointsTri[p].x + -Trans.x();
            pnt.y = objectPointsTri[p].y + -Trans.y();
            pnt.z = objectPointsTri[p].z + -Trans.z();

            Eigen::Vector3d pntRot = // rotate pnt by the quaternion



        }

2 个答案:

答案 0 :(得分:5)

运营商_.debounce将完成这项工作,您当然可以简化代码:

*

甚至:

pnt = objectPointsTri[p] - Trans;
pntRot = quat * pnt;

或者,如果您将积分存储在pnt = quat * (objectPointsTri[p] - Trans);

Matrix3Xd

答案 1 :(得分:2)

@ggael的回答是完全正确的,我只想提供一些背景知识。

this Wikipedia article中,他们解释了四元数矢量乘法v'= qvq -1 。我们正在使用的<div class="menu-bar-text1"> <p style="margin-left: 124px;">⸺ GRAPHIC<br></p> <p style="margin-left: 82px;">&amp; EDITORIAL DESIGN.</p> </div> <div class="menu-bar-text2"> <p>TEXT<br></p> <p style="margin-left: 35px;">⸺</p> <p style="margin-left: 55px;margin-top: -14px;"> <a href="http://example.com" data-title="HOME"> HOME</a> </p> </div> <div class="menu-bar-contact"> <a href="mailto:hello@example.com" target="_blank" rel="noopener"> <span>SAY HELLO</span> </a> </div> <div id="responsive-menu-pro-header-bar-button" class="responsive-menu-pro-header-box"> <button id="responsive-menu-pro-button" class="responsive-menu-pro-button responsive-menu-pro-off is-active" type="button" aria-label="Menu" style="transform: translateX(800px);"> <span class="responsive-menu-pro-box"> <span class="responsive-menu-pro-inner"></span> </span> <span class="responsive-menu-pro-label responsive-menu-pro-label-bottom"> <span class="responsive-menu-pro-button-text" style="display: none;">ABOUT</span> <span class="responsive-menu-pro-button-text-open" style="display: inline;">CLOSE</span> </span> </button> </div>的本征速记显然也在Unity libraries中。

在当前版本的Eigen中,您将选择operator*中的this overload,其调用operator*

_transformVector

请参见template<typename RotationDerived,typename OtherVectorType> struct rotation_base_generic_product_selector<RotationDerived,OtherVectorType,true> { ... EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v) { return r._transformVector(v); } }; here上的备注

  

如果使用四元数旋转几个点(> 1),则将其首先转换为3x3矩阵会更加有效。 n个转换的操作成本比较:

     
      
  • Quaternion2:30n
  •   
  • 通过Matrix3:24 + 15n
  •   

ggael出于这些效率原因要求您更改解决问题的方式。