diff --git a/doc/ru/scripting/builtins/libmat4.md b/doc/ru/scripting/builtins/libmat4.md index 1531798a4..1b44df1ee 100644 --- a/doc/ru/scripting/builtins/libmat4.md +++ b/doc/ru/scripting/builtins/libmat4.md @@ -114,15 +114,29 @@ mat4.decompose(m: matrix) } или nil ``` -## Отслеживание точки *mat4.look_at(...)* +## Отслеживание точки - *mat4.look_at(...)* ```lua --- cоздает матрицу вида с точки 'eye' на точку 'center', где вектор 'up' определяет верх. +-- cоздаёт матрицу вида с точки 'eye' на точку 'center', где вектор 'up' определяет верх. mat4.look_at(eye: vec3, center: vec3, up: vec3) -- записывает матрицу вида в dst mat4.look_at(eye: vec3, center: vec3, up: vec3, dst: matrix) ``` +## Расчёт матрицы перспективы - *mat4.perspective* + +```lua +-- возвращает расчитанную матрицу перспективы. +-- параметр fov принимает значение вертикального поля зрения в градусах. +-- параметр ratio задаёт отношение сторон (сторона X к стороне Y, пример: для монитора 800:600 отношение сторон равно 4 к 3, или 4 / 3). +-- параметр near задаёт расстояние от камеры до плоскости Near. +-- параметр far задаёт расстояние от камеры до плоскости Far. +mat4.perspective(fov: number, ratio: number, near: number, far: number) -> mat4 + +-- расчитывает матрицу перспективы на основе переданных значений и записывает её в переменную dst. +mat4.perspective(fov: number, ratio: number, near: number, far: number, dst: mat4) -> nil +``` + ## Перевод в строку - *mat4.tostring(...)* ```lua diff --git a/src/logic/scripting/lua/libs/libmat4.cpp b/src/logic/scripting/lua/libs/libmat4.cpp index 081d99b5e..59f15e661 100644 --- a/src/logic/scripting/lua/libs/libmat4.cpp +++ b/src/logic/scripting/lua/libs/libmat4.cpp @@ -229,6 +229,20 @@ static int l_look_at(lua::State* L) { } } +static int l_perspective(lua::State *L) { + uint argc = lua::check_argc(L, 4, 5); + + double fov = glm::radians(lua::tonumber(L, 1)); + double ratio = lua::tonumber(L, 2); + double near = lua::tonumber(L, 3); + double far = lua::tonumber(L, 4); + + glm::mat4 mat = glm::perspective(fov, ratio, near, far); + + if (argc == 5) return lua::setmat4(L, 5, mat); + else return lua::pushmat4(L, mat); +} + static int l_from_quat(lua::State* L) { uint argc = lua::check_argc(L, 1, 2); auto quat = lua::toquat(L, 1); @@ -280,6 +294,7 @@ const luaL_Reg mat4lib[] = { {"determinant", lua::wrap}, {"decompose", lua::wrap}, {"look_at", lua::wrap}, + {"perspective", lua::wrap}, {"from_quat", lua::wrap}, {"tostring", lua::wrap}, {nullptr, nullptr}