ことれいのもり

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

はじめに

ゲーム開発をしていると、「行列の行優先・列優先」という言葉をよく見かけますよね。

最初に見たとき、行優先だから何なの?列優先だから何に気をつけたら良いの?と混乱した覚えがあります。

この記事では、「行優先・列優先の特徴と何に気をつけたら良いのか」について解説していきます!

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

今回はないよ(^o^)

行優先とは

行優先とは、行列を見たときに、行ごとにX軸・Y軸・Z軸の成分が並んでいることです。

例えば4x4の行列があったとします。

このとき、1行目はX軸、2行目はY軸、3行目はZ軸を表しています。


行優先の説明画像

簡単に言うと、「行方向に軸の成分を取るよ!」ということです。

行優先を使っているのは

  • DirectX
  • UnrealEngine
  • Assimp
  • C/C++
  • OpenSiv3D

などがあります。


これはメモリの格納順とも一致しています。

データがきたときに、行優先の場合、a1→a2→a3→a4→b1→b2→… という順番で格納されます。

横に並んでいるので配列をイメージすると分かりやすいかもしれません。

列優先とは

列優先とは、行列を見たときに、列ごとにX軸・Y軸・Z軸の成分が並んでいる事です。

さっきと同じ4x4の行列で考えてみます。

このとき、1列目はX軸、2列目はY軸、3列目はZ軸を表しています。


列優先の説明画像


簡単に言うと、「列方向に軸の成分を取るよ!」ということです。

列優先を使っているのは、

  • OpenGL
  • FBX系
  • Unity

などがあります。


列優先もメモリの格納順と一致しています。

データが来たときに、列優先の場合、a1→b1→c1→d1→a2→b2→… という順番で格納されます。

行優先と列優先の何に気をつけたら良いのか

軸の取り方やメモリの格納順が違うことは分かりました。

では何に気をつけたら良いのでしょうか。

ポイント1:別のライブラリ間でやりとりするとき

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

このとき普通に使うと、回転やスケーリングが自分の意図したものと違ってしまうことがあります。

対処法として「行列を転置」してわたすようにしましょう。


行列の転置についはこちらの記事で詳しく解説しています!

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

ポイント2:掛け算の順番が異なる場合がある

行優先では、「行ベクトル×行列(左からかける)」、

列優先では、「行列×列ベクトル(右からかける)」が基本になっていることが多いです。

ライブラリによってはかけ方が変わり、逆方向になってしまうこともあります。

対処法として「行列×ベクトル」の順番をドキュメントで確認しましょう。

おわりに

行列の「行優先」「列優先」は、一見するとただの形式の違いに見えますが、グラフィックス系のライブラリを使っていると、とても重要な違いです!

とくに、複数のライブラリ間をデータが渡るときに違いを理解しておかないと、「なぜか描画が崩れる」「変な方向に回転する」といったトラブルが起こりがちです。

この記事を参考にして、「今使っている行列はどの優先か?」を意識して扱ってみてください!