I have an affine transform in 3D and I wish to discard any z-axis information from. Is there a convenient way to convert from an Affine3d
to and Affine2d
?
Asked
Active
Viewed 3,603 times
2

Drew Noakes
- 300,895
- 165
- 679
- 742
1 Answers
3
Try following:
Affine2d S2d = Translation2d(S3d.translation().topRows<2>()) *
S3d.linear().topLeftCorner<2,2>();
Demo:
#include <Eigen/Dense>
#include <iostream>
#include <string>
int main()
{
using namespace Eigen;
using namespace std;
Vector3d p3d(1.,2.,3.);
cout << p3d << endl << endl;
Affine3d S3d = Translation3d(2.,2.,2.)*Scaling(3.,2.,5.);
Vector3d scalled = S3d*p3d;
cout << S3d.matrix() << endl << endl;
cout << scalled << endl << endl;
cout << string(16,'_') << endl;
Vector2d p2d = p3d.topRows<2>();
cout << p2d << endl << endl;
Affine2d S2d = Translation2d(S3d.translation().topRows<2>()) *
S3d.linear().topLeftCorner<2,2>();
Vector2d scalled2d = S2d*p2d;
cout << S2d.matrix() << endl << endl;
cout << scalled2d << endl << endl;
}
Output:
1
2
3
3 0 0 2
0 2 0 2
0 0 5 2
0 0 0 1
5
6
17
________________
1
2
3 0 2
0 2 2
0 0 1
5
6

Evgeny Panasyuk
- 9,076
- 1
- 33
- 54
-
@DrewNoakes You are welcome! However, maybe there is more convenient way to do this. – Evgeny Panasyuk Apr 23 '13 at 14:42
-
`S3d` is a 4x4 matrix while `p3d` is vector or say 3x1 matrix then how that matrix multiplication `S3d*p3d` is possible? Does *Eigen* converts the vector `p3d` to homogeneous coordinates i.e. appends 1 at the bottom and makes it 4x1 matrix before multiplication and converts it back to Cartesian coordinates afterward? – Milan Aug 25 '20 at 17:11
-
@Milan `S3d` is not just a regular 4x4 matrix, it is an object of special type: `typedef Transform< double, 3, Affine > Affine3d;` http://eigen.tuxfamily.org/dox-3.2/classEigen_1_1Transform.html – Evgeny Panasyuk Oct 01 '20 at 05:29