将翻译应用于本征顶点

时间:2018-06-28 22:24:38

标签: c++ matrix geometry eigen

我正在尝试使用从Eigen形式从外部库接收到的翻译信息,以Vector3d替换几何。我不担心轮换。

我已经尝试了我对Eigen的有限了解所允许的一切。我当前的代码如下:

void Mesh::displace(const Vector3d& v)
{
    Transform<double, 3, Affine> t = Transform<double, 3, Affine>::Identity();
    t.translate(v);
}

现在,我很难将这种翻译应用于我的m_vertices,这是MatrixXd3 by N列,其中3代表x, y, z N代表顶点。

转换矩阵最终看起来像这样(X代表转换的翻译部分):

1, 0, 0, X,
0, 1, 0, X,
0, 0, 1, X,
0, 0, 0, 1

基于此,我很确定我到目前为止已经做好了一切。

我尝试了许多应用翻译的尝试,但是编译的尝试在运行时崩溃了。

1 个答案:

答案 0 :(得分:1)

如果仅需要翻译,则不需要Transform对象。您可以简单地对平移向量与网格中每个需要移位的位置向量进行向量相加。如果您既需要旋转又需要平移,则需要将它们分别应用为

Output = Rotation*Input + Translation

下面的代码演示了这两种方法是等效的。

#include <iostream>
#include <Eigen/Dense>
#include <Eigen/Geometry>

using namespace Eigen;

int main(){
    int N = 2;

    // The translation vector
    Vector3d translation;
    translation << 1.0, 2.0, 3.0;

    // The N points to be translated
    Matrix3Xd points(3,N);
    points.setRandom(3,N);
    std::cout<< " The initial positions :" << std::endl
             << points << std::endl;

    // ******************** Case 1: Pure Translation ******************** //
    // Just add the translation vector to each point
    Matrix3Xd displaced_points(3,N);
    displaced_points = points.colwise() + translation;
    std::cout<< " The displaced positions :" << std::endl
             << displaced_points << std::endl;

    // **************** Case 2: Full Affine transformation **************** //
    std::cout<< "******************** Method 2 ********************" << std::endl;
    Transform<double_t, 3, Affine> t =
            Transform<double_t, 3, Affine>::Identity();
    t.translate(translation);
    std::cout<< "The transformation: " << std::endl
             << t.translation() << std::endl;
    // We need to apply the rotation and translation separately
    for( auto i=0; i < N; ++i){
        displaced_points.col(i) = t.linear()*points.col(i) + t.translation();
    }
    std::cout<< " The displaced positions :" << std::endl
             << displaced_points << std::endl;

    return 0;
}

这将产生如下输出:

The initial positions :
 0.680375   0.59688
-0.211234  0.823295
 0.566198 -0.604897

 The displaced positions :
1.68038 1.59688
1.78877 2.82329
 3.5662  2.3951
******************** Method 2 ********************
The transformation: 
1
2
3
 The displaced positions :
1.68038 1.59688
1.78877 2.82329
 3.5662  2.3951