Czy te funkcje są kolumnami głównymi lub rzędami głównymi?

Porównuję dwie różne liniowe biblioteki matematyczne dla grafiki 3D przy użyciu macierzy. Oto dwie podobne funkcje Tłumacza z dwóch bibliotek:

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;
}

(biblioteka c ++ z dumy użytkownika 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;
 }

(biblioteka c linmath od użytkownika SO datenwolf)

Jestem nowicjuszem w tej dziedzinie, ale wiem, że kolejność mnożenia macierzy zależy w dużej mierze od tego, czy używasz formatu głównego kolumny czy głównego rzędu.

Moim zdaniem te dwa pliki używają tego samego formatu, ponieważ zarówno w pierwszym indeksie, jak iw wierszu, drugim indeksem jest kolumna. To znaczy w obux y z są stosowane do tego samego pierwszego indeksu. Oznaczałoby to dla mnie wiersz główny, a zatem mnożenie macierzy jest pozostawione asocjacyjne (na przykład zazwyczaj robiszrotate * translate w tej kolejności).

Pierwszy przykład użyłem wielokrotnie w lewym kontekście asocjacyjnym i działał zgodnie z oczekiwaniami. Podczas gdy nie korzystałem z drugiego, autor twierdzi, że jest odpowiedni - skojarzony, ale mam problem z widzeniem różnicy między formatami obu.

questionAnswers(2)

yourAnswerToTheQuestion