数学のスキルが低い私のようなダミーの変換行列を理解するための良い出発点を誰かに勧めてもらえますか?
私は数学を学びたいと思っています、そして私は完全な馬鹿ではありません(私は願っています)が、私が見つけた例は私が知っていることから私が知る必要があることへの大きな飛躍を必要とするようです。
数学のスキルが低い私のようなダミーの変換行列を理解するための良い出発点を誰かに勧めてもらえますか?
私は数学を学びたいと思っています、そして私は完全な馬鹿ではありません(私は願っています)が、私が見つけた例は私が知っていることから私が知る必要があることへの大きな飛躍を必要とするようです。
変換行列を試すために使用できるWebプログラムを作成しました。プリセットタイプとカスタムタイプを使用できます。
数字で遊んで、それが家の絵にどのように影響するかをすぐに確認できるはずです。オンラインで入手できるコードを見て、何が行われているのかを判断すると、何が起こっているのかを理解できるはずです。
問題が発生した場合は、3×3の行列が家の形の各頂点(XおよびY座標)で乗算されていることに注意してください。頂点との行列の乗算(これをベクトルと呼びます)と変換行列は次のようになります...
1 0 0 1
0 1 0 * 2
0 0 1 0
左側には、単位行列(ベクトルに影響を与えないべき等行列)と1、2、0のベクトルがあります(これは、上記のグラフの位置X1とY2にマップされ、最後は無視されます0
)。
行列の乗算は次のように視覚化できます...
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軸に沿ったピクセルで家を平行移動したいとします。単位行列から始めたいのですが、右上の数値をに変更5
し、ベクトルに追加の次元を作成し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軸に沿ってによって変換されていることがわかります5
。上記のリンク先のプログラムでお試しください。
3番目の値を作成した理由は1
、計算が実行されたときに変換が考慮されたためです。の場合0
は無視されます。数値に数値を掛けると、0
結果が得られるため0
です。
それでも問題が解決しない場合は、オンラインでビデオ(たとえば、これ)をチェックしてください。これは、より視覚的な方法で説明するのに役立ちます。
覚えておいてください:数学についての自己評価の不十分な理解にもかかわらず、ほとんど誰でも車を運転することができ、ほとんど誰でもこれを学ぶことができます。ただそれを維持してください:永続性が鍵です。幸運を。
duffymoが指摘しているように、行列変換は、ベクトル(3Dポイントなど)に行列を(事前に)乗算することに他なりません。しかし、それは純粋数学であり、視覚化するのが難しい人もいます。
変換行列を理解するための最良の方法は(少なくとも私にとっては)、サンプルコードを取得し、それを実行して、数値を試してみることです。オブジェクトをさらに遠くに配置できるか、または45度回転できるかどうかを確認してください。変換を別の順序で並べてみて、結果がどうなるかを確認してください。
すべて動作していますか?良い。
あなたがそれを感じたら、そしてあなたが数学に取り組むのに十分勇気があるなら、あなたはこれらのステップを踏むことができます:
まず、行列の乗算がどのように機能するかを理解します。いくつかのリンク:
手作業で行列を乗算することに慣れたら、変換がそのように記述されている理由を理解できます。それらを使用すると、最終的にマトリックスの理解が得られます。
第二に、私はいつも午後を過ごして独自のクラスを実装し、、またはのMatrix
ようないくつかの一般的な操作を定義することをお勧めします。いくつかのテストを行い、結果が手作業で行ったものと同じであるかどうかを確認します。mul(Vector v)
transpose()
createTranslationMatrix(float x, float y, float z)
ここまで来たら、独自のパースペクティブトランスフォーメーションを実装してみてください。それは私たちが決して感謝するようにならない最も驚くべきことです。ここで役立つ説明:
マトリックスオブジェクトを実装するという最も骨の折れる、しかし過小評価されているタスクの1つを実行すると、自分自身を非常に誇りに思うでしょう。幸運を!
変換は、変換されたベクトルを生成するためにベクトルを乗算する行列にすぎません。したがって、行列の乗算と加算を理解していないと、それほど遠くまで行くことはできません。
行列と線形代数から始めます。そこにはたくさんの本がありますが、私が上で述べた声明に基づいて、あなたはその本全体を読む必要がないことを理解してください。固有値やガウスの消去法、ベクトル空間など、高度で難しいものは必要ありません。
行列に数値を掛けたり足したりすることについて知っていることを拡張する方法を知る必要があります。
その変換行列のエントリを取得することは、まったく別の問題です。数学とコンピュータグラフィックスに関する優れた本が必要です。線形代数の教科書にはありません。