从二维变换矩阵中提取旋转、缩放值
如何从二维变换矩阵中提取旋转、缩放和平移值?我的意思是 a 有一个二维变换
matrix = [1, 0, 0, 1, 0, 0]
matrix.rotate(45 / 180 * PI)
matrix.scale(3, 4)
matrix.translate(50, 100)
matrix.rotate(30 / 180 * PI)
matrix.scale(-2, 4)
,现在我的矩阵有值 [a, b, c, d, tx, ty]
让我们忘记上面的过程,想象我们只有值 a, b, c, d, tx, ty
我如何通过 a、b、c、d、tx、ty 找到总旋转和比例值
抱歉我的英语
谢谢您的提前
编辑
我认为这应该是某个地方的答案...
我刚刚尝试过在 Flash Builder (AS3) 中像这样
var m:Matrix = new Matrix;
m.rotate(.25 * Math.PI);
m.scale(4, 5);
m.translate(100, 50);
m.rotate(.33 * Math.PI);
m.scale(-3, 2.5);
var shape:Shape = new Shape;
shape.transform.matrix = m;
trace(shape.x, shape.y, shape.scaleX, shape.scaleY, shape.rotation);
,输出是:
x = -23.6
y = 278.8
scaleX = 11.627334873920528
scaleY = -13.54222263865791
rotation = 65.56274134518259 (in degrees)
how can i extract rotation, scale and translation values from 2d transformation matrix? i mean a have a 2d transformation
matrix = [1, 0, 0, 1, 0, 0]
matrix.rotate(45 / 180 * PI)
matrix.scale(3, 4)
matrix.translate(50, 100)
matrix.rotate(30 / 180 * PI)
matrix.scale(-2, 4)
now my matrix have values [a, b, c, d, tx, ty]
lets forget about the processes above and imagine that we have only the values a, b, c, d, tx, ty
how can i find total rotation and scale values via a, b, c, d, tx, ty
sorry for my english
Thanks your advance
EDIT
I think it should be an answer somewhere...
i just tried in Flash Builder (AS3) like this
var m:Matrix = new Matrix;
m.rotate(.25 * Math.PI);
m.scale(4, 5);
m.translate(100, 50);
m.rotate(.33 * Math.PI);
m.scale(-3, 2.5);
var shape:Shape = new Shape;
shape.transform.matrix = m;
trace(shape.x, shape.y, shape.scaleX, shape.scaleY, shape.rotation);
and the output is:
x = -23.6
y = 278.8
scaleX = 11.627334873920528
scaleY = -13.54222263865791
rotation = 65.56274134518259 (in degrees)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
并非 a、b、c、d、tx、ty 的所有值都会产生有效的旋转序列。我假设上述值是 2D 3x3 齐次旋转矩阵的一部分
,它将坐标
[x, y, 1]
转换为:[dx, dy]=[ tx, ty]
sx = sqrt(a² + c²)
且sy = sqrt(b² + d²)
t = atan(c/d)
或t = atan(-b/a)
因为它们也应该是相同的。否则你就没有有效的旋转矩阵。
将上面的变换展开为:
当顺序是旋转时,先是缩放,再是平移。
Not all values of a,b,c,d,tx,ty will yield a valid rotation sequence. I assume the above values are part of a 3x3 homogeneous rotation matrix in 2D
which transforms the coordinates
[x, y, 1]
into:[dx, dy]=[tx, ty]
sx = sqrt(a² + c²)
andsy = sqrt(b² + d²)
t = atan(c/d)
ort = atan(-b/a)
as also they should be the same.Otherwise you don't have a valid rotation matrix.
The above transformation is expanded to:
when the order is rotation, followed by scale and then translation.
我今天遇到了这个问题,并找到了使用矩阵变换点的最简单的解决方案。这样,您可以先提取平移,然后提取旋转和缩放。
仅当 x 和 y 始终缩放相同(均匀缩放)时,此方法才有效。
给定你的矩阵 m 已经经历了一系列的变换,
你就可以了!
I ran into this problem today and found the easiest solution to transform a point using the matrix. This way, you can extract the translation first, then rotation and scaling.
This only works if x and y are always scaled the same (uniform scaling).
Given your matrix m which has undergone a series of transforms,
There you go!
这个术语是矩阵分解。这是一个包含倾斜的解决方案,如所述弗雷德里克·王。
The term for this is matrix decomposition. Here is a solution that includes skew as described by Frédéric Wang.
如果在缩放时,您在 x 和 y 中缩放相同的量,那么矩阵的行列式,即 ad-bc,它告诉您面积乘数也会告诉您缩放的线性变化 - 它将是平方行列式的根。 atan( b/a ) 或更好的 atan2( b,a ) 会告诉您旋转的总角度。
然而,由于缩放不均匀,通常没有办法将一系列旋转和缩放压缩为单个旋转,然后在 x 和 y 上进行单个非均匀缩放。
If in scaling you'd scaled by the same amount in x and in y, then the determinant of the matrix, i.e. ad-bc, which tells you the area multiplier would tell you the linear change of scale too - it would be the square root of the determinant. atan( b/a ) or better atan2( b,a ) would tell you the total angle you have rotated through.
However, as your scaling isn't uniform, there is usually not going to be a way to condense your series of rotations and scaling to a single rotation followed by a single non-uniform scaling in x and y.