diff --git a/src/api/l_vectors.c b/src/api/l_vectors.c index e34df050..1a013eec 100644 --- a/src/api/l_vectors.c +++ b/src/api/l_vectors.c @@ -1640,7 +1640,7 @@ static int l_lovrMat4LookAt(lua_State* L) { mat4 m = luax_checkvector(L, 1, V_MAT4, NULL); vec3 from = luax_checkvector(L, 2, V_VEC3, NULL); vec3 to = luax_checkvector(L, 3, V_VEC3, NULL); - vec3 up = lua_isnoneornil(L, 4) ? (float[4]) { 0.f, 1.f, 0.f } : luax_checkvector(L, 3, V_VEC3, NULL); + vec3 up = lua_isnoneornil(L, 4) ? (float[4]) { 0.f, 1.f, 0.f } : luax_checkvector(L, 4, V_VEC3, NULL); mat4_lookAt(m, from, to, up); lua_settop(L, 1); return 1; diff --git a/src/core/maf.h b/src/core/maf.h index 7c89c5fe..5d89b67b 100644 --- a/src/core/maf.h +++ b/src/core/maf.h @@ -611,27 +611,27 @@ MAF mat4 mat4_fov(mat4 m, float left, float right, float up, float down, float c } MAF mat4 mat4_lookAt(mat4 m, vec3 from, vec3 to, vec3 up) { - float z[4]; float x[4]; float y[4]; - vec3_sub(vec3_init(z, to), from); + float z[4]; + vec3_normalize(vec3_sub(vec3_init(z, from), to)); vec3_normalize(vec3_cross(vec3_init(x, up), z)); vec3_cross(vec3_init(y, z), x); m[0] = x[0]; - m[1] = y[0]; - m[2] = z[0]; + m[1] = x[1]; + m[2] = x[2]; m[3] = 0.f; - m[4] = x[1]; + m[4] = y[0]; m[5] = y[1]; - m[6] = z[1]; + m[6] = y[2]; m[7] = 0.f; - m[8] = x[2]; - m[9] = y[2]; + m[8] = z[0]; + m[9] = z[1]; m[10] = z[2]; m[11] = 0.f; - m[12] = 0.f; - m[13] = 0.f; - m[14] = 0.f; + m[12] = from[0]; + m[13] = from[1]; + m[14] = from[2]; m[15] = 1.f; return m; }