检测4x4转换矩阵是否在Cocoa中进行扩展和转换

时间:2015-07-17 20:24:20

标签: matrix graphics 3d core-animation

鉴于4x4三维变换矩阵,计算它是否比缩放和转换更好的最佳方法是什么?具体来说,我想知道它是否旋转或倾斜图像。

我正在使用Cocoa,因此可以使用像CoreGraphics和CoreAnimation这样的库。

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果您缺乏知识,请参阅Understanding 4x4 homogenous transform matrices

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

  1. 旋转
    • 然后轴保持彼此垂直
    • 并且它们的大小保持不变(通常是单位向量)
    • 但他们会轮换
  2. 缩放
    • 仅更改轴方向矢量的大小
    • 所以轴必须保持彼此垂直且不改变方向
  3. 翻译
    • 这只是移动原始矢量
    • 所有其余的都保持原样
  4. 歪斜
    • 这打破了正交性
    • 所以轴不会彼此垂直
  5. 如果你把它放在一起

    • 缩放和平移应使轴与全局轴平行,所以:

      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);

    <强> [注释]

    • 请注意您的矩阵形式我是OpenGL样式矩阵(列式)
    • 如果你有行式矩阵,那么你需要转置......