はじめに
ゲーム開発をしていると、「行列の行優先・列優先」という言葉をよく見かけますよね。
最初に見たとき、行優先だから何なの?列優先だから何に気をつけたら良いの?と混乱した覚えがあります。
この記事では、「行優先・列優先の特徴と何に気をつけたら良いのか」について解説していきます!
2025-05-08
ゲーム開発をしていると、「行列の行優先・列優先」という言葉をよく見かけますよね。
最初に見たとき、行優先だから何なの?列優先だから何に気をつけたら良いの?と混乱した覚えがあります。
この記事では、「行優先・列優先の特徴と何に気をつけたら良いのか」について解説していきます!
今回はないよ(^o^)
行優先とは、行列を見たときに、行ごとにX軸・Y軸・Z軸の成分が並んでいることです。
例えば4x4の行列があったとします。
このとき、1行目はX軸、2行目はY軸、3行目はZ軸を表しています。
簡単に言うと、「行方向に軸の成分を取るよ!」ということです。
行優先を使っているのは
などがあります。
これはメモリの格納順とも一致しています。
データがきたときに、行優先の場合、a1→a2→a3→a4→b1→b2→… という順番で格納されます。
横に並んでいるので配列をイメージすると分かりやすいかもしれません。
列優先とは、行列を見たときに、列ごとにX軸・Y軸・Z軸の成分が並んでいる事です。
さっきと同じ4x4の行列で考えてみます。
このとき、1列目はX軸、2列目はY軸、3列目はZ軸を表しています。
簡単に言うと、「列方向に軸の成分を取るよ!」ということです。
列優先を使っているのは、
などがあります。
列優先もメモリの格納順と一致しています。
データが来たときに、列優先の場合、a1→b1→c1→d1→a2→b2→… という順番で格納されます。
軸の取り方やメモリの格納順が違うことは分かりました。
では何に気をつけたら良いのでしょうか。
例えば、行優先のAssimpで読み込んだFBXの行列を、列優先のOpenGLで描画したいとします。
このとき普通に使うと、回転やスケーリングが自分の意図したものと違ってしまうことがあります。
対処法として「行列を転置」してわたすようにしましょう。
行列の転置についはこちらの記事で詳しく解説しています!
ゲーム開発初心者のための転置行列入門 行優先・列優先との関係も図解で解説行優先では、「行ベクトル×行列(左からかける)」、
列優先では、「行列×列ベクトル(右からかける)」が基本になっていることが多いです。
ライブラリによってはかけ方が変わり、逆方向になってしまうこともあります。
対処法として「行列×ベクトル」の順番をドキュメントで確認しましょう。
行列の「行優先」「列優先」は、一見するとただの形式の違いに見えますが、グラフィックス系のライブラリを使っていると、とても重要な違いです!
とくに、複数のライブラリ間をデータが渡るときに違いを理解しておかないと、「なぜか描画が崩れる」「変な方向に回転する」といったトラブルが起こりがちです。
この記事を参考にして、「今使っている行列はどの優先か?」を意識して扱ってみてください!