Matrix 检测4x4变换矩阵是否不仅仅在Cocoa中进行缩放和转换

Matrix 检测4x4变换矩阵是否不仅仅在Cocoa中进行缩放和转换,matrix,graphics,3d,core-animation,Matrix,Graphics,3d,Core Animation,给定4x4 3d变换矩阵,计算其是否比缩放和平移更有效的最佳方法是什么?具体来说,我想知道它是否旋转或扭曲图像 我正在使用Cocoa,因此可以使用CoreGraphics和CoreAnimation等库。看看您是否缺乏相关知识 如果您的变换只是: 旋转 然后轴彼此保持垂直,它们的大小保持不变(通常为单位向量),但它们会旋转 缩放 仅更改轴方向向量的大小,以便轴必须保持相互垂直且不更改方向 翻译 这只是移动原点向量,其余的保持原样 倾斜 这会破坏正交性,因此轴不会相互垂直 如果你把这些放在

给定4x4 3d变换矩阵,计算其是否比缩放和平移更有效的最佳方法是什么?具体来说,我想知道它是否旋转或扭曲图像

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

看看您是否缺乏相关知识

如果您的变换只是:

  • 旋转

    然后轴彼此保持垂直,它们的大小保持不变(通常为单位向量),但它们会旋转

  • 缩放

    仅更改轴方向向量的大小,以便轴必须保持相互垂直且不更改方向

  • 翻译

    这只是移动原点向量,其余的保持原样

  • 倾斜

    这会破坏正交性,因此轴不会相互垂直

  • 如果你把这些放在一起

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

  • 提取轴向量
    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风格的矩阵(列式),如果你有行式矩阵,那么你需要转置…

    看看你是否缺乏相关知识

    如果您的变换只是:

  • 旋转

    然后轴彼此保持垂直,它们的大小保持不变(通常为单位向量),但它们会旋转

  • 缩放

    仅更改轴方向向量的大小,以便轴必须保持相互垂直且不更改方向

  • 翻译

    这只是移动原点向量,其余的保持原样

  • 倾斜

    这会破坏正交性,因此轴不会相互垂直

  • 如果你把这些放在一起

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

  • 提取轴向量
    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风格的矩阵(列式),如果你有行式矩阵,那么你需要转置…

    看看你是否缺乏相关知识

    如果您的变换只是:

  • 旋转

    然后轴彼此保持垂直,它们的大小保持不变(通常为单位向量),但它们会旋转

  • 缩放

    仅更改轴方向向量的大小,以便轴必须保持相互垂直且不更改方向

  • 翻译

    这只是移动原点向量,其余的保持原样

  • 倾斜

    这会破坏正交性,因此轴不会相互垂直

  • 如果你把这些放在一起

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

  • 提取轴向量
    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风格的矩阵(列式),如果你有行式矩阵,那么你需要转置…

    看看你是否缺乏相关知识

    如果您的变换只是:

  • 旋转

    然后轴彼此保持垂直,它们的大小保持不变(通常为单位向量),但它们会旋转

  • 缩放

    仅更改轴方向向量的大小,以便轴必须保持相互垂直且不更改方向

  • 翻译

    这只是移动原点向量,其余的保持原样

  • 倾斜

    这会破坏正交性,因此轴不会相互垂直

  • 如果你把这些放在一起

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

  • 提取轴向量
    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样式的矩阵(列式),如果你有行式矩阵,那么你需要转置…

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

    [ 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
    如果这些是您期望的唯一转换类型,则所有其他值必须与identit匹配