为什么2D变换需要3x3矩阵?

Mr.*_*.Pe 18 2d matrix homogenous-transformation

我想做一些2D绘图,因此想要实现一些矩阵变换.凭借我轻松的数学背景,我试图了解如何在C#中实现这一点(任何其他oop语言都可以做到这一点).

我读到的只是解释我们需要使用3x3矩阵来处理翻译.因为你不能用乘法进行翻译.但这是我们创建转换的矩阵的乘法.所以我们使用类似的东西:

{ x1, x2, tx }
{ y1, y2, ty }
{ 0,  0,  1  }
Run Code Online (Sandbox Code Playgroud)

我理解第三列的意思,但为什么我们需要第三列呢?在单位矩阵以及旋转,缩放或旋转中,最后一行是相同的.我还没有达到需要的操作吗?是因为某些语言(Java)使用"平方维度"数组表现更好吗?如果是这样的话,我可以在C#中使用3列和2行(因为锯齿状数组的效果也一样好或者更好).

例如,对于旋转+平移,我有一个像这样的矩阵

{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2,    ty }
{ 0,           0,              1  }
Run Code Online (Sandbox Code Playgroud)

不需要最后一行.

Aak*_*shM 29

这是我们创建转换的矩阵的乘法

就是我们想要方形矩阵的原因.

假设我们做了你提出的建议,并使用2x3矩阵进行转换.

然后旋转

( x1, x2, 0 )
( y1, y2, 0 )
Run Code Online (Sandbox Code Playgroud)

并将翻译

( 1, 0, tx )
( 0, 1, ty )
Run Code Online (Sandbox Code Playgroud)

我们可以通过将矩阵乘以表示点的列向量来执行旋转或平移:

    ( x )
M   ( y )
    ( 0 )
Run Code Online (Sandbox Code Playgroud)

得到正确的答案.

但是 - 我们将如何进行组合转换?事实上,对于你的"旋转+翻译,我有一个像这样的矩阵"的例子,你是如何得到那个矩阵的?当然,在这种情况下你可以写出来,但一般情况下?嗯,你知道答案:

这是我们创建转换的矩阵的乘法

因此,必须能够将两个变换矩阵相乘以给出另一个变换矩阵.矩阵乘法规则表明:

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???
Run Code Online (Sandbox Code Playgroud)

不是有效的矩阵乘法.我们需要可以乘法的矩阵,以便我们的变换可以组合.所以我们有额外的行.


现在,我在这里表达的方式实际上完全落后于标准的数学表达式,其中熟悉的旋转和平移变换只是投影平面上齐次坐标变换的全部力量的特殊情况 - 但我认为它将向您展示为什么我们需要额外的行 - 使矩阵成为正方形,从而能够与矩阵相乘.


ja7*_*a72 6

答案是同质坐标.要在一个操作中组合旋转和平移,需要一个额外的维度,而不是模型所需的维度.对于平面物体,这是3个组件,对于空间物体,这是4个组件.操作员需要3个组件并返回需要3x3矩阵的3个组件.