2D変換が3×3行列を必要とするのはなぜですか?
-
12-12-2019 - |
質問
私はいくつかの2D描画をしたいので、いくつかのマトリックス変換を実装したいです。私の軽い数学の背景で、私はC#でその方法を理解しようとしています(他のOOP言語は明らかにそれをするでしょう)。
私が読んだことは、翻訳に対処できるように3×3行列で働く必要があることを説明しています。乗算で翻訳をすることはできませんので。しかし、これは私達が私達の変換を作成する行列の乗算を含む。だから私たちはそのようなもので働いています:
{ x1, x2, tx }
{ y1, y2, ty }
{ 0, 0, 1 }
.
3番目の列の平均を理解していますが、なぜ3行目が必要ですか。識別行列と回転、スケールまたは回転の場合、最後の行は同じです。私が届かなかった操作はありませんか? 一部の言語(Java)が「二乗寸法」配列で良く機能するためですか?もしそうなら、私はC#の3列と2行を使用することができます(ギザギザの配列は同様にまたはより良く機能するため)。
たとえば、回転+翻訳の場合、こののようなマトリックスがあります。{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2, ty }
{ 0, 0, 1 }
.
最後の行を必要としません。
解決
これは私達が私達の変換を作成する行列の乗算を含む
このは私たちが正方行列を望んでいる理由です。
あなたが提案したものをやったとし、私たちの変換のために2x3行列を使用しました。
それから回転は
( x1, x2, 0 )
( y1, y2, 0 )
.
と翻訳は
です( 1, 0, tx )
( 0, 1, ty )
.
と私たちの行列にポイントを表す列ベクトルを掛けることで、回転や翻訳を実行できます。
( x )
M ( y )
( 0 )
.
正解を得るために
しかし - 私たちはどのように合成変換についてどのように行きますか?確かに、「回転+翻訳のために私はこのようなマトリックスを持っています」の例です、あなたはどのようにその行列を取得しましたか?確かに、この場合あなたはそれを書くことができますが、一般的に?まあ、あなたは答えを知っています:
これは私達が私達の変換を作成する行列の乗算を含む
だから2つの変換行列を複数の変換行列を乗算して別の変換行列を得ることができなければなりません。そして行列乗算の規則はこれを示しています:
( . . . ) ( . . . )
( . . . ) ( . . . ) = ???
.
は有効な行列乗数ではありません。私たちの変換が合成可能であるために乗算できる行列が必要です。だから私たちはその余分な行を持っています。
今、ここで表現した方法は実際には標準的な数学的発表から完全に後退しています。この中で、回転と翻訳のよく知られた変換は、射影平面上の均質な座標変換の完全なパワーの特別なケースです - しかし、私たちがその余分な行を必要な理由をあなたに示すためにすると思います - マトリックスの正方形を作ること、したがってマトリックスのように乗算することができます。
他のヒント
答えは均質な座標です。1つの操作で回転と翻訳を組み合わせるには、モデルが必要とするよりも1つの追加次元が必要です。平面的なもののためにこれは3つの部品であり、空間的なことのためにこれは4つの部品です。オペレータは3つのコンポーネントを取り、3×3行列を必要とする3つのコンポーネントを返します。