私は頭がぼやけてぼんやりしているほど長い間このものを見つめてきましたが、私はそれを理解していると思います. 私はマトリックス ライブラリを使用しています。マトリックスのデータは次のように保存されます。
struct Matrix4{
vec4 x;
vec4 y;
vec4 z;
vec4 w;
..... functions
}
Avec4
は、次のようなデータを持つ単純な構造体です。
T x;
T y;
T z;
T w;
(T
通常はfloat
)
重要な質問は、おそらく次のように答えられます。
Matrix4 operator * (const Matrix4& b) const
{
Matrix4 m;
m.x.x = x.x * b.x.x + x.y * b.y.x + x.z * b.z.x + x.w * b.w.x;
m.x.y = x.x * b.x.y + x.y * b.y.y + x.z * b.z.y + x.w * b.w.y;
m.x.z = x.x * b.x.z + x.y * b.y.z + x.z * b.z.z + x.w * b.w.z;
m.x.w = x.x * b.x.w + x.y * b.y.w + x.z * b.z.w + x.w * b.w.w;
m.y.x = y.x * b.x.x + y.y * b.y.x + y.z * b.z.x + y.w * b.w.x;
m.y.y = y.x * b.x.y + y.y * b.y.y + y.z * b.z.y + y.w * b.w.y;
m.y.z = y.x * b.x.z + y.y * b.y.z + y.z * b.z.z + y.w * b.w.z;
m.y.w = y.x * b.x.w + y.y * b.y.w + y.z * b.z.w + y.w * b.w.w;
m.z.x = z.x * b.x.x + z.y * b.y.x + z.z * b.z.x + z.w * b.w.x;
m.z.y = z.x * b.x.y + z.y * b.y.y + z.z * b.z.y + z.w * b.w.y;
m.z.z = z.x * b.x.z + z.y * b.y.z + z.z * b.z.z + z.w * b.w.z;
m.z.w = z.x * b.x.w + z.y * b.y.w + z.z * b.z.w + z.w * b.w.w;
m.w.x = w.x * b.x.x + w.y * b.y.x + w.z * b.z.x + w.w * b.w.x;
m.w.y = w.x * b.x.y + w.y * b.y.y + w.z * b.z.y + w.w * b.w.y;
m.w.z = w.x * b.x.z + w.y * b.y.z + w.z * b.z.z + w.w * b.w.z;
m.w.w = w.x * b.x.w + w.y * b.y.w + w.z * b.z.w + w.w * b.w.w;
return m;
}
列優先のシステムでは、各列ベクトルの最初の要素が格納されるoperator*
ため、左側の行列の一番上の行が連続したメモリにないと想定する必要があります。この関数は明らかに左側の行列 (*this
行列) の最初の行を連続として扱っているため、これが行優先の行列ライブラリであることを暗示していますよね?
このようなものを長い間見てきた後、ライブラリが列優先か行優先かを実際に判断する唯一の方法は、データのレイアウト方法に関して乗算をどのように処理するかを調べることであることがわかりました。
私の質問を診断するために必要ではない可能性がありますが、ライブラリが提供する 3D 変換変換用の変換マトリックスは、x, y, z
データを final に配置しvec4
ます。しかし、このデータは、列優先または行優先のシステムのこの場所にある可能性があるため、おそらく些細な証拠です。