- pretranslate、prerotate表示左乘,即以世界坐标为参考
- translate、rotate表示右乘,即以局部坐标系为参考
下面以直线L做45度旋转和向X方向移动200像素两次线性变换为例子:
isometry1.rotate(axisd);//右乘(局部坐标参考)
isometry1.translate(Eigen::Vector3d(200,0,0));isometry2.prerotate(axisd);//左乘(世界坐标参考)
isometry2.pretranslate(Eigen::Vector3d(200,0,0));
第一次变换,旋转45度,由于变换之前局部坐标系和世界坐标系重合,所以rotate和prerotate的结果一样,旋转之后局部坐标系和世界坐标系右45度夹角
第二次变换,向X方向移动200像素,pretranslate是以世界坐标系为参考,所以平移向右边移动;
translate是以局部坐标系为参考,所以平移向右下角45度方向移动文章来源:https://www.toymoban.com/news/detail-733931.html
QT代码如下:文章来源地址https://www.toymoban.com/news/detail-733931.html
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setWindow(-400,-300,800,600);
QPointF p1(0,0), p2 (100,0);
Eigen::Vector3d v1{p1.x(),p1.y(),0};
Eigen::Vector3d v2{p2.x(),p2.y(),0};
Eigen::AngleAxisd axisd(45*3.1415926/180, Eigen::Vector3d::UnitZ());
Eigen::Isometry3d isometry1=Eigen::Isometry3d::Identity(),isometry2=Eigen::Isometry3d::Identity();
isometry1.rotate(axisd);//右乘(局部坐标参考)
isometry1.translate(Eigen::Vector3d(200,0,0));
Eigen::Vector3d v3 = isometry1*v1;
Eigen::Vector3d v4 = isometry1*v2;
isometry2.prerotate(axisd);//左乘(世界坐标参考)
isometry2.pretranslate(Eigen::Vector3d(200,0,0));
Eigen::Vector3d v5 = isometry2*v1;
Eigen::Vector3d v6 = isometry2*v2;
painter.drawLine(p1, p2);
painter.setPen(Qt::red);
painter.drawLine(QPointF(v3.x(), v3.y()), QPointF(v4.x(), v4.y()));
painter.setPen(Qt::green);
painter.drawLine(QPointF(v5.x(), v5.y()), QPointF(v6.x(), v6.y()));
}
到了这里,关于Eigen::Isometry3d的用法(pretranslate、translate、prerotate、rotate的区别)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!