Essas funções são coluna-maior ou maior?
Estou comparando duas bibliotecas matemáticas lineares diferentes para gráficos 3D usando matrizes. Aqui estão duas funções semelhantes do Translate das duas bibliotecas:
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;
}
(biblioteca c ++ do orgulho do usuário SO)
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;
}
(biblioteca linmath c do usuário SO datenwolf)
Eu sou novo nessas coisas, mas sei que a ordem de multiplicação de matrizes depende muito do fato de você estar usando um formato de coluna principal ou de linha principal.
Aos meus olhos, estes dois estão usando o mesmo formato, em que tanto o primeiro índice é tratado como a linha, o segundo índice é a coluna. Ou seja, tanto nox y z
são aplicados ao mesmo primeiro índice. Isso implicaria para mim row-major, e assim a multiplicação de matrizes é deixada associativa (por exemplo, você normalmente faria umarotate * translate
naquela ordem).
Eu usei o primeiro exemplo muitas vezes em um contexto associativo à esquerda e ele está funcionando como esperado. Embora eu não tenha usado o segundo, o autor diz que é associativo à direita, mas estou tendo problemas para ver a diferença entre os formatos dos dois.