行列を使用した 3D グラフィックス用の 2 つの異なる線形数学ライブラリを比較しています。2 つのライブラリからの 2 つの類似した変換関数を次に示します。
static Matrix4<T> Translate(T x, T y, T z)
{
Matrix4 m;
m.x.x = 1; m.x.y = 0; m.x.z = 0; m.x.w = 0;
m.y.x = 0; m.y.y = 1; m.y.z = 0; m.y.w = 0;
m.z.x = 0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
m.w.x = x; m.w.y = y; m.w.z = z; m.w.w = 1;
return m;
}
(SO ユーザーのプライドアウトからの c++ ライブラリ)
static inline void mat4x4_translate(mat4x4 T, float x, float y, float z)
{
mat4x4_identity(T);
T[3][0] = x;
T[3][1] = y;
T[3][2] = z;
}
(SO ユーザー datenwolf の linmath c ライブラリ)
私はこれに慣れていませんが、行列の乗算の順序は、列優先または行優先の形式を使用しているかどうかに大きく依存することを知っています。
私の目には、これら 2 つは同じ形式を使用しており、最初のインデックスは行として扱われ、2 番目のインデックスは列として扱われます。つまり、どちらもx y z
同じ最初のインデックスに適用されます。これは行優先であることを意味するため、行列の乗算は連想のままになります (たとえば、通常はrotate * translate
その順序で a を実行します)。
左連想コンテキストで最初の例を何度も使用しましたが、期待どおりに機能しています。私は2番目を使用していませんが、著者はそれが右結合であると言いますが、2つの形式の違いを見るのに苦労しています。