ことれいのもり

ゲーム開発初心者のための転置行列入門 行優先・列優先との関係も図解で解説

はじめに

ゲーム開発をしていると、「行列を転置してかける」ということをよく行ないます。

これは、特にライブラリ間で行列を渡すときに行なうのですが、なぜ転置するのか理解できていますか?

この記事では「行列を転置するとどうなるのか?」について解説していきます!

難しい数式は一切出てこないので安心してください!

知っておいた方が分かりやすい前提知識

行列の列優先・行優先

ゲーム開発初心者のための行列の行優先・列優先入門 違いと注意点を図解で解説

転置行列とは

転置行列とは、行列の行と列を入れ替えたものです。

4x4の行列で考えてみます。


転置行列の説明画像


左の行列が元の行列、右が転置したものです。

行と列を完全に入れ替えたものになっていて、斜めの部分は固定で変わることはありません。

斜めの部分を基準にして入れ替えたもの、というイメージの方が伝わりやすいかも。

これだけだと「へー。そうなんだー」で終わるんですが、ここで行優先・列優先の話と絡めるととんでもないことになります!!

転置行列と行優先・列優先の関係

先程の行列をよく見てください。

何かに気がつきませんか?


転置行列と行優先・列優先の関係画像


画像を見ると、一目で分かると思います。

最初の行列は行優先と同じ並びをしています。

そして、最初の行列を転置したものは、列優先と同じ並びをしています。

つまり、「転置を取ると、行優先と列優先を入れ替えられる」と言えます!

これは非常に使い勝手が良いです。


例えば行優先のAssimpで読み込んだFBXの行列を、列優先のOpenGLで描画したいとします。

このとき、Assimpで取得した行列をそのままOpenGLに渡すと、OpenGL側は列優先として解釈してしまうんです。

すると何が起きるでしょうか?

Assimpが「X軸に90度回転」と思っていた行列を、OpenGLが「Y軸に90度回転」みたいに勘違いしてしまう、なんてことが普通に起こります。

(ゲームでキャラが変な方向を向いたり、アニメーションが崩れたりする原因の一つです)


そこで転置行列の出番です!

Assimpで取得した行優先の行列を転置すると、列優先の並びと同じ見た目になります。

この「見た目が同じ」の行列をOpenGLに渡せば、優先度の違いによるずれがなくなり、意図した通りの回転や変換がちゃんと反映されるようになります。


これが、「ライブラリ間で行列を渡すときに転置を取る理由」です!!

このように、同じ行列でも優先度の解釈が違うと全く別の動きになるということがあるので、行優先・列優先の違いを解決する手段として、転置が使われるんですね。

おわりに

転置行列は、ただ行と列を入れ替えるだけのイメージがあるかもしれません。

しかし、行優先と列優先という考え方の違いをつなぐ架け橋として、とても大事な役割を担ってくれています。

ゲーム開発をしていると、AssimpやOpenGLのように、内部で行列の扱いが異なるライブラリを組み合わせることがあると思います。

「なんか回転がおかしいな?」と思ったら「転置してみる」という視点を持ってみてください!