给出一个4x4 3d转换矩阵,最好的方法是计算它是否比缩放和平移还要多?具体来说,我想知道图像是否旋转或倾斜。
我正在使用Cocoa,因此可以使用CoreGraphics和CoreAnimation之类的库。
查看元素编号如下的矩阵:
[ 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处。
如果您不了解,请参阅Understanding 4x4 homogenous transform matrices
现在,如果您的变换只是:
旋转
然后,轴保持彼此垂直,并且其大小保持相同(通常是单位矢量),但它们会旋转。
缩放
仅更改轴方向矢量的大小,因此轴必须保持彼此垂直并且不改变方向。
translation
这只会移动原点向量,其余所有点都保持原状
歪斜
这会破坏正交性,因此轴将不会彼此垂直
如果将它们放在一起
缩放和平移应该使左轴与全局轴平行,这样:
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);
[[notes]
当心矩阵形式,如果您有行矩阵,我将使用OpenGL样式矩阵(列方式),那么您需要转置...