我正在尝试使用从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
代表转换的翻译部分):
1, 0, 0, X,
0, 1, 0, X,
0, 0, 1, X,
0, 0, 0, 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