简体   繁体   中英

How to create a transformation matrix from a scale and a translation, using Eigen3?

I am stumped on how to create a simple transformation matrix.

I have the following C++ code:

  static constexpr float pos_scale = 2 * size / iside;
  static constexpr std::array<float, 2> pos_translation = { -size, -size };

Unfortunately, the pos_translation needs to be a std::array because you can't make an Eigen::Vector2f constexpr.

Then I have a vector:

Vector2i xy;

That will be filled with some data. I want to convert xy to a Vector2f by converting it to homogeneous coordinates, multiplying it with a transformation matrix and then dropping the homogeneous coordinates again.

The transformation matrix is declared as

Matrix3f xy_to_pos;

at least, I think that is the right type to use?

My question is, how can I initialize xy_to_pos from pos_scale (which has to be applied first: first the scale then the translation) and pos_translation ?

And once I have xy_to_pos how would I use it to convert xy to Vector2f pos ?

I tried all kinds of things, like

Matrix3f xy_to_pos = Matrix3f::Identity() * Eigen::Scaling(pos_scale) * Eigen::Translation2f(pos_translation[0], pos_translation[1]);

but nothing compiles, and the compile errors don't help. I Googled for this too of course, but couldn't find an example that helped.

I figured it out:

static constexpr float pos_scale = 2 * size / iside;
static constexpr std::array<float, 2> pos_translation = { -size, -size };

Transform<float, 2, Affine> const xy_to_pos =
    Transform<float, 2, Affine>{Transform<float, 2, Affine>::Identity()}
    .translate(Vector2f{pos_translation.data()})
    .scale(pos_scale);

Vector2i xy(2, 3); // Or whatever

Vector2f pos = xy_to_pos * xy.cast<float>();


The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM