web-dev-qa-db-ja.com

2D変換に3x3行列が必要なのはなぜですか?

2D描画を実行したいので、行列変換を実装したいと思います。私の軽い数学のバックグラウンドで、私はC#でそれを行う方法を理解しようとしています(他のオブジェクト指向言語は明らかにそれを行います)。

私が読んだのは、翻訳に対処できるようにするために3x3行列を操作する必要があることを説明しているだけです。掛け算では翻訳できないからです。しかし、これは、変換を作成する行列の乗算です。したがって、次のようなものを使用します。

{ x1, x2, tx }
{ y1, y2, ty }
{ 0,  0,  1  }

3番目の列の平均は理解できますが、なぜ3番目の行が必要なのですか?単位行列でも、回転、スケール、または回転でも、最後の行は同じです。まだ到達していない、それを必要とする操作はありますか?一部の言語(Java)は、「2乗次元」配列の方がパフォーマンスが優れているためですか?もしそうなら、C#で3列と2行を使用できます(ギザギザの配列も同様に機能するため)。

たとえば、回転と平行移動の場合、次のような行列があります

{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2,    ty }
{ 0,           0,              1  }

最後の行は必要ありません。

19
Mr.Pe

これは、変換を作成する行列の乗算です。

これが正方行列が必要な理由です。

あなたが提案したことを行い、変換に2x3行列を使用したとします。

次に、回転は

( x1, x2, 0 )
( y1, y2, 0 )

そして翻訳は

( 1, 0, tx )
( 0, 1, ty )

行列に点を表す列ベクトルを掛けることで、回転または平行移動を実行できます。

    ( x )
M   ( y )
    ( 0 )

正しい答えを得るために。

ただし-どのように処理しますか作成変換?確かに、「回転+平行移動の場合、このような行列があります」の例では、どのようにしてその行列に到達しましたか?確かに、この場合、あなたはそれを書き出すことができますが、一般的には?まあ、あなたは答えを知っています:

これは、変換を作成する行列の乗算です。

したがって、2つの変換行列を乗算して、別の変換行列を生成できる必要があります。そして、行列乗算の規則は、これを示しています。

( . . . ) ( . . . )
( . . . ) ( . . . ) = ???

は有効な行列乗算ではありません。変換を構成可能にするには、乗算できる行列が必要です。したがって、その余分な行があります。


さて、ここで私が表現した方法は、実際には、回転と平行移動のよく知られた変換が射影平面での同次座標変換のフルパワーの特殊なケースである標準的な数学表現から完全に逆になっています-しかし、私は思います行列を正方行列にするために、なぜその余分な行が必要なのかを示し、同様の行列で乗算できるようにします。

28
AakashM

答えは同次座標です。 1回の操作で回転と平行移動を組み合わせるには、モデルが必要とするよりも1つの追加の寸法が必要です。平面のものの場合、これは3つのコンポーネントであり、空間的なものの場合、これは4つのコンポーネントです。演算子は3つのコンポーネントを取り、3x3行列を必要とする3つのコンポーネントを返します。

5
ja72