我有一个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
}
答案 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;">& 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出于这些效率原因要求您更改解决问题的方式。