flutter - 如何在 flutter 中用平移、倾斜和缩放值填充 Matrix4?

标签 flutter dart math matrix coordinates

假设,我有一个高度为 200 和宽度为 300 的容器的这些值:

  • scaleX = 0.9198
  • scaleY = 0.9198
  • skewX = -0.3923
  • 偏斜 = 0.3923
  • 翻译X = 150
  • 翻译Y = 150

  • 现在,如何在 Matrix4 中正确填充这些值?
    我尝试这样做:
    Matrix4(
      0.9198, 0, 0, 0, //
      0, 0.9198, 0, 0, //
      0, 0, 1, 0, //
      150, 150, 0, 1,
    )
    
    即,
    Matrix4(
      scaleX, 0, 0, 0, //
      0, scaleY, 0, 0, //
      0, 0, 1, 0, //
      translateX, translateY, 0, 1,
    )
    
    但我不知道该放在哪里 skewXskewY该矩阵中的值。请帮我解决一下这个。

    最佳答案

    偏斜值
    这是一个有点微妙的话题,因为它可以用几种不同的方式来解释。矩阵的特定单元格与特定名称相关联,如您的问题 translate x 中所述。 , translate y , scale x , 和 scale y .在这种情况下,您很可能是指来自矩阵的值,称为 skew xskew y (有时也称为 shear xshear y ),它指的是索引 4 和 1(从零开始,列主要顺序)。它们被称为这些名称是因为当它们自己放入单位矩阵时,它们会执行该操作(平移、缩放或倾斜),但是当有多个值时,它会变得更加复杂。
    另一方面,这也可以解释为一系列操作(例如按 (0.9198, 0.9198, 1) 缩放,然后按 (-0.3923, 0.3923) 倾斜,然后按 (150, 150, 0) 平移),以及那么它是一系列矩阵乘法,最终会产生一个相似但数值不同的矩阵。我假设你不是这个问题的意思。您可以阅读更多相关信息 here尽管。
    您可以咨询Flutter Matrix4 documentation ,它还提供了 Matrix4.skewX 的实现说明和 Matrix4.skewY .倾斜存储在(从零开始的)索引 4 和 1 中,作为倾斜角度的切线。

    Matrix4(
      scaleX, skewY,   0,   0, // skewY could also be tan(ySkewAngle)
      skewX,  scaleY,  0,   0, // skewX could also be tan(xSkewAngle)
      0,      0,       1,   0, //
      translateX, translateY, 0, 1,
    )
    
    请注意那些不熟悉 Flutter 数据结构的人,值存储在 中。栏目主要订单这意味着上面代码中的每一行实际上都是一列,所以如果你把矩阵表示为一个正常的变换矩阵,它就会被转置。
    更多信息:
    变换矩阵:https://en.wikipedia.org/wiki/Transformation_matrix
    矩阵如何与 CSS 变换一起使用:How do I use the matrix transform and other transform CSS properties?

    关于flutter - 如何在 flutter 中用平移、倾斜和缩放值填充 Matrix4?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64734413/

    相关文章:

    flutter - 如何增加 flutter 中的 slider 轨道宽度

    flutter - 我试图在 flutter 中添加一个轮播 slider ,但我面临缺少所需的参数错误

    flutter - 如何在 flutter 中停止音频播放器插件的本地音乐?

    flutter - Flutter 中 colorScheme 和 ThemeData 声明的原色

    android - 尝试调试 flutter 应用程序时 AVC 被拒绝

    android - 如何可视化指向特定坐标(纬度,经度)的箭头,给定俯仰和偏航

    php 剥离标签?

    c - 如何避免模乘法溢出?

    FlutterError(在初始化绑定(bind)之前访问了ServicesBinding.defaultBinaryMessenger

    flutter - 如何在 Flutter 中离开屏幕前显示确认对话框