Вопрос

Imagine two coordinate systems layed on top of each other, with a rotation and scale difference between the two:

Example

The problem is to convert a point from the non-rotated system to the other. What we do have, are four corner points forming a rectangle, with coordinates known for both systems at each point. We also know the rotation difference, and I think I at least should know the scale difference too. How do I convert a point from the non-rotated system to the rotated system? I have Unity3D at use.

Extra points for clarity in math :)

PS: I'm writing this really late, going to edit later for more clarity.

Это было полезно?

Решение

Some linear algebra does the trick:

Express each operation as a matrix and matrix multiply those to combine them into a single resulting matrix (for efficiency).

If translation is involved you need to add a dimension to your matrices, see homogenous coordinates.

The reason is that the mappings are affine ones then, not linear ones. You can ignore the extra dimension in the end result. It is just a nice way to embed affine mappings into linear ones, so the algebra is easier.

Example

M = M_trans * M_rot * M_scale
x' = M x

The order here is right to left: vector x is first scaled, then rotated, then translated into vector x'. (Using column vectors).

Hints on the matrices: Rotation Matrix, Scaling Matrix

For deriving 2D formulas when given 3D ones: either keep z = 0 or delete the 3rd row and 3rd column from each matrix.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top