2

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?

Drew Noakes
  • 300,895
  • 165
  • 679
  • 742

1 Answers1

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