代码之家  ›  专栏  ›  技术社区  ›  gargantuan

有人能推荐一些假人的变换矩阵教程吗?[关闭]

  •  9
  • gargantuan  · 技术社区  · 14 年前

    有人能推荐一些好的起点来理解像我这样数学能力差的傻瓜的转换矩阵吗?

    我愿意学习数学,我也不是一个十足的白痴(我希望如此),但我发现的例子似乎需要从我知道的,到我需要知道的有一个巨大的飞跃。

    3 回复  |  直到 11 年前
        1
  •  18
  •   alex    11 年前

    我写了一个web程序,可以用来处理转换矩阵。它允许预设类型和自定义类型。

    screenshot of transformation matrix program

    Play with it online grab the source .

    它应该很容易玩数字,并立即看到它如何影响房子绘图。看看在线的代码,确定它在做什么,你应该能够理解发生了什么。

    如果你有困难,请意识到3_3矩阵只是被房子形状中的每个顶点(x&y坐标)相乘。矩阵与顶点相乘(我们现在将其称为向量),变换矩阵看起来是这样的…

    1 0 0   1
    0 1 0 * 2
    0 0 1   0
    

    左边是一个 identity matrix (一个不影响向量的等幂矩阵)和1,2,0的向量(假设这映射到上面提到的程序图中的位置x1和y2,忽略最后一个 0 )

    Matrix multiplication 可以想象成这样…

    a b c   x   a * x + b * y + c * z
    d e f + y = d * x + e * y + f * z
    g h i   z   g * x + h * y + i * z
    

    所以,在我们的例子中,那将是…

    1 0 0   1   1 * 1 + 0 * 2 + 0 * 0
    0 1 0 * 2 = 0 * 1 + 1 * 2 + 0 * 0
    0 0 1   0   0 * 1 + 0 * 2 + 1 * 0
    

    算出最后一个向量…

    1
    2
    0
    

    因为我们说我们的身份矩阵不应该修改这些值,我们可以在上面看到,这是因为结果向量与原始向量匹配。

    要进一步解释,请考虑何时需要转换向量。假设我们想把房子翻译成 5 沿X轴的像素。我们想从身份矩阵开始,但是把右上角的数字改成 在向量中加上额外的维数 1 (你会明白为什么)。

    1 0 5   1   1 * 1 + 0 * 2 + 5 * 1 
    0 1 0 * 2 = 0 * 1 + 1 * 2 + 0 * 1
    0 0 1   1   0 * 1 + 0 * 2 + 1 * 1
    

    我们再做一次数学运算…

    6
    2
    1
    

    我们可以看到第一个数字(在我们的坐标系中的x)已经沿着x轴平移了 . 在上面链接的程序中试试。

    我们创造第三个价值的原因 是这样的,在计算时,考虑了翻译。是否曾经 ,它将被忽略,因为任何数字乘以 结果在 .

    如果你仍然有麻烦,请上网查看视频( this one ,它可以帮助以更直观的方式解释它。

    记住:几乎每个人都能开车,而且几乎每个人都能学会这一点,尽管任何自我评价的数学理解力很差。坚持:坚持是关键。祝你好运。

        2
  •  8
  •   Xavier Ho    14 年前

    正如Duffymo所指出的,矩阵变换只不过是(预先)将向量(如三维点)乘以矩阵。然而,这是纯粹的数学,有些人很难想象。

    理解转换矩阵的最好方法(至少对我来说)是 示例代码 得到它 跑步 玩弄数字 . 尝试查看是否可以将对象放置在更远的位置,或旋转45度。尝试将转换放入 不同的顺序 看看结果如何。

    都在工作?很好。

    一旦你有了这种感觉,如果你有足够的勇气解决数学问题,你可以采取以下步骤:

    首先,了解矩阵乘法是如何工作的。一些链接:

    一旦你习惯了手工乘法一个矩阵,你就会明白为什么转换是这样写的。当你使用它们时,对矩阵的理解最终会到来。

    第二,我总是建议花一个下午来实现你自己的 Matrix 类并定义一些常见的操作,如 mul(Vector v) , transpose() 甚至 createTranslationMatrix(float x, float y, float z) . 做一些测试,看看结果是否和你手工做的一样。

    如果你已经走到了这一步,尝试实现你自己的视角转换吧!这是我们从未体会到的最神奇的事情。这里有一个有用的解释:

    一旦你完成了一个最繁重的任务,但却没有得到赏识的实现一个矩阵对象,你就会为自己感到骄傲。祝你好运!

        3
  •  6
  •   duffymo    14 年前

    一个变换只不过是一个矩阵乘以一个向量来得到变换后的向量,所以如果你不理解矩阵的乘法和加法,你就不会走得很远。

    从矩阵和线性代数开始。外面有很多书,但是要意识到根据我上面的陈述,你不需要读整本书。你不需要特征值,高斯消去,向量空间,或其他任何先进和困难的东西。

    你只需要知道如何扩展你所知道的关于乘法和加法的知识。

    获取转换矩阵中的条目完全是另一回事。你需要一本关于数学和计算机图形学的好书。你在线性代数课本上找不到。