Применить перевод к собственным вершинам - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь сместить геометрию на Eigen, используя информацию о переводе, полученную из внешней библиотеки в виде Vector3d. Меня не волнует ротация.

Я перепробовал все, что позволяли мои ограниченные знания Eigen. Мой текущий код выглядит так:

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

Теперь мне очень тяжело применить этот перевод к моим m_vertices столбцам MatrixXd, 3 by N, где 3 представляет x, y, z, а N представляет вершины.

Матрица преобразования в конечном итоге выглядит следующим образом (X s представляет переводящую часть преобразования):

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

Исходя из этого, я почти уверен, что до этого момента все было в порядке.

Я сделал несколько попыток применить перевод, но те, которые скомпилировали, потерпели крах во время выполнения.

1 Ответ

0 голосов
/ 29 июня 2018

Если вам нужны только переводы, вам не нужен объект 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
...