鉴于4x4三维变换矩阵,计算它是否比缩放和转换更好的最佳方法是什么?具体来说,我想知道它是否旋转或倾斜图像。
我正在使用Cocoa,因此可以使用像CoreGraphics和CoreAnimation这样的库。
答案 0 :(得分:2)
查看具有如下编号的元素的矩阵:
[ a00 a01 a02 a03 ]
[ a10 a11 a12 a13 ]
[ a20 a21 a22 a23 ]
[ a30 a31 a32 a33 ]
a00
,a11
和/或a22
中的值不是1.0。a03
,a13
和/或a23
中的值不是0.0。如果这些是您期望的唯一转换类型,则所有其他值必须与单位矩阵匹配。
在最后一行中使用非同一性值相对较少,除非您以投影矩阵为例进行处理。如果所讨论的矩阵可能具有这种形式,那么您必须测试:
a30 == 0.0
a31 == 0.0
a32 == 0.0
a33 == 1.0
除此之外,您只需测试左上3x3矩阵的非对角线元素为零:
a01 == 0.0
a02 == 0.0
a10 == 0.0
a12 == 0.0
a20 == 0.0
a21 == 0.0
这些值中的任何一个都不为零会引入某种形式的旋转/倾斜。
与往常一样,请注意比较浮点值是否相等。如果它们从未设置为其他任何值,则上面的值将精确为0.0。但是如果矩阵是某种形式的计算的结果,你可能必须测试小于常数的值,而不是精确的0.0。
在测试矩阵值时,请注意矩阵按行或列主要顺序存储。例如,如果矩阵元素存储在数组中,则元素a03
将按行主顺序位于索引3处,而按列主顺序位于索引12处。
答案 1 :(得分:1)
如果您缺乏知识,请参阅Understanding 4x4 homogenous transform matrices
现在,如果您的转换只是:
如果你把它放在一起
缩放和平移应使轴与全局轴平行,所以:
X,Y,Z
P=(0,0,0,1)
...底行类似的东西:
X/=|X|;
Y/=|Y|;
Z/=|Z|;
if ( fabs(fabs(dot(X,(1,0,0)))-1.0)
+fabs(fabs(dot(Y,(0,1,0)))-1.0)
+fabs(fabs(dot(Z,(0,0,1)))-1.0)
+fabs(P.x-0.0)
+fabs(P.y-0.0)
+fabs(P.z-0.0)
+fabs(P.w-1.0) > 1e-6) return "not just scaling&translation";
其中:
|X|=sqrt(X.x*X.x+X.y*X.y+X.z*X.z);
dot(X,Y)=(X.x*Y.x)+(X.y*Y.y)+(X.z*Y.z);
<强> [注释] 强>