Tak wiem że w GMS1 był ten substytut prawdziwych macierzy ale no GMS2 ma już w pełni funkcjonalne.
Anyway udało mi się ale to jest bez sortowania depth spritów więc nachodzą na siebie brzydko:
Taki sobie o ludzik bez rąk. Ma tylko 2 nogi które się kręcą jak koła no i ma głowę. Gify są z animacją nóg i bez a kod wygląda tak:
yaw += 4;
legAnim -= 28;
// root body
var center = matrix_build(x, y, z, 0, 0, yaw, 1, 1, 1);
var posArray = matrix_transform_vertex(center, 0, 0, 0);
draw_circle_color(posArray[0], posArray[1]+posArray[2], 4, c_red, c_red, 0); // ROOT position
// leg center
var legCenter = matrix_build(0, 0, 0, legAnim, 0, 90, 1, 1, 1);
var vLegCenter = matrix_multiply(legCenter, center);
var posArrayLegCenter = matrix_transform_vertex(vLegCenter, 0, 0, 0);
// leg right
var legR = matrix_build(-16, 0, 16, 0, 0, 0, 1, 1, 1);
// leg left
var legL = matrix_build(16, 0, 16, 0, 0, 0, 1, 1, 1);
// draw legs
var vL = matrix_multiply(legL,vLegCenter);
var vR = matrix_multiply(legR, vLegCenter);
var posArrayL = matrix_transform_vertex(vL, 0, 0, 0);
var posArrayR = matrix_transform_vertex(vR, 0, 0, 0);
draw_sprite(sPoint, 0, posArrayL[0], posArrayL[1]+posArrayL[2]);
draw_sprite(sPoint, 0, posArrayR[0], posArrayR[1]+posArrayR[2]);
draw_line(posArrayLegCenter[0], posArrayLegCenter[1]+posArrayLegCenter[2], posArrayL[0], posArrayL[1]+posArrayL[2] );
draw_line(posArrayLegCenter[0], posArrayLegCenter[1]+posArrayLegCenter[2], posArrayR[0], posArrayR[1]+posArrayR[2] );
// face
var height = 24;
var face = matrix_build(24, 0, -height, 0, 0, 0, 1, 1, 1);
var vFace = matrix_multiply(face, center);
var posArrayFace = matrix_transform_vertex(vFace, 0, 0, 0);
draw_sprite(sPoint, 0, posArrayFace[0], posArrayFace[1]+posArrayFace[2]);
draw_line_color(posArray[0], posArray[1]+posArray[2], posArrayFace[0], posArrayFace[1]+posArrayFace[2], c_red, c_red);
var posArrayH = matrix_transform_vertex(center, 0, 0, -height);
draw_line_color(posArray[0], posArray[1]+posArray[2], posArrayH[0], posArrayH[1]+posArrayH[2], c_red, c_red);
draw_line_color(posArrayFace[0], posArrayFace[1]+posArrayFace[2], posArrayH[0], posArrayH[1]+posArrayH[2], c_red, c_red);
Edit:
Fajnie teraz można płynnie przechodzić z widoku izometrycznego w top-down spłaszczając skalę Z roota:
var center = matrix_build(x, y, z, 0, 0, yaw, 1, 1, (1+sin(current_time*0.001))/2);