从2d变换矩阵中提取旋转,缩放值
问题描述:
如何从2d变换矩阵中提取旋转,缩放和平移值?我的意思是一款拥有2D转换从2d变换矩阵中提取旋转,缩放值
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,德克萨斯州总旋转和缩放值,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)
答
并非a,b,c,d,tx,ty的所有值都是y应该有一个有效的旋转顺序。我假定上述值是3×3的均匀旋转矩阵的一部分在2D
| a b tx |
A = | c d ty |
| 0 0 1 |
其将坐标[x, y, 1]
成:
[x', y', 1] = A * |x|
|y|
|z|
- 因此设置的翻译中成
[dx, dy]=[tx, ty]
- 规模是
sx = sqrt(a² + c²)
和sy = sqrt(b² + d²)
- 旋转角度为
t = atan(c/d)
或t = atan(-b/a)
也应该是相同的。
否则,您没有有效的旋转矩阵。
上述变换扩展为:
x' = tx + sx (x Cos θ - y Sin θ)
y' = ty + sy (x Sin θ + y Cos θ)
时的顺序是旋转,接着规模,然后翻译。
答
如果按比例缩放x和y中的相同数量,那么矩阵的行列式(即ad-bc)会告诉您面积乘数会告诉您比例的线性变化 - 它将是行列式的平方根。 atan(b/a)或更好的atan2(b,a)会告诉你旋转过的总角度。
但是,由于缩放不均匀,通常不会有办法将一系列旋转和缩放缩放为单次旋转,然后在x和y中进行单一非均匀缩放。
答
我今天遇到了这个问题,并找到了使用矩阵变换点的最简单的解决方案。这样,您可以先提取翻译,然后旋转和缩放。
这只适用于如果x和y总是缩放相同(均匀缩放)。
由于已经经历了一系列的变换你的矩阵m,
var translate:Point;
var rotate:Number;
var scale:Number;
// extract translation
var p:Point = new Point();
translate = m.transformPoint(p);
m.translate(-translate.x, -translate.y);
// extract (uniform) scale
p.x = 1.0;
p.y = 0.0;
p = m.transformPoint(p);
scale = p.length;
// and rotation
rotate = Math.atan2(p.y, p.x);
你去那里!
此问题最适合http://math.stackexchange.com/ - 您将得到更快的响应:-) – Bojangles 2010-12-05 21:18:57
我刚才在这里:http://math.stackexchange.com/questions/13150/从2d转换矩阵中提取旋转缩放值谢谢 – 2010-12-05 21:25:13