确定4x4转换矩阵是否比可可缩放和转换要多

问题描述 投票:0回答:2

给出一个4x4 3d转换矩阵,最好的方法是计算它是否比缩放和平移还要多?具体来说,我想知道图像是否旋转或倾斜。

我正在使用Cocoa,因此可以使用CoreGraphics和CoreAnimation之类的库。

matrix graphics 3d core-animation
2个回答
2
投票

查看元素编号如下的矩阵:

[ a00 a01 a02 a03 ]
[ a10 a11 a12 a13 ]
[ a20 a21 a22 a23 ]
[ a30 a31 a32 a33 ]
  • 缩放转换在元素a00a11和/或a22中具有1.0以外的值。
  • 转换矩阵的元素a03a13和/或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
投票

如果您不了解,请参阅Understanding 4x4 homogenous transform matrices

现在,如果您的变换只是:

  1. 旋转

    然后,轴保持彼此垂直,并且其大小保持相同(通常是单位矢量),但它们会旋转。

  2. 缩放

    仅更改轴方向矢量的大小,因此轴必须保持彼此垂直并且不改变方向。

  3. translation

    这只会移动原点向量,其余所有点都保持原状

  4. 歪斜

    这会破坏正交性,因此轴将不会彼此垂直

如果将它们放在一起

缩放和平移应该使左轴与全局轴平行,这样:

  1. 提取轴矢量X,Y,Z
  2. 使其成为单位向量
  3. 将它们与全局坐标轴进行比较
  4. 矩阵的投影部分应为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样式矩阵(列方式),那么您需要转置...

© www.soinside.com 2019 - 2024. All rights reserved.