diff --git a/doc/ru/scripting/builtins/libquat.md b/doc/ru/scripting/builtins/libquat.md index 5a6495658..e991de252 100644 --- a/doc/ru/scripting/builtins/libquat.md +++ b/doc/ru/scripting/builtins/libquat.md @@ -2,22 +2,34 @@ Библиотека для работы с кватернионами. -## Кватернион из матрицы - *mat4.from_quat(...)* +## Кватернион из матрицы - *quat.from_mat4(...)* ```lua --- создает кватернион на основе матрицы вращения +-- создаёт кватернион на основе матрицы вращения quat.from_mat4(m: matrix) -> quat -- записывает кватернион по матрице вращения в dst quat.from_mat4(m: matrix, dst: quat) ``` +## Кватернион из углов Эйлера - *quat.from_euler(...)* + +```lua +-- создаёт кватернион на основе вектора, содержащего углы Эйлера в порядке XYZ (pitch, yaw, roll) +-- (значения углов строго в градусах) +quat.from_euler(euler: vec3) -> quat + +-- записывает кватернион в dst на основе вектора, содержащего углы Эйлера в порядке XYZ (pitch, yaw, roll) +-- (значения углов строго в градусах) +quat.from_euler(euler: vec3, dst: quat) +``` + ## Сферическая линейная интерполяция - *quat.slerp(...)* Интерполяция всегда выполняется по короткому пути, а вращение выполняется с постоянной скоростью. ```lua --- создает кватернион как интерполяцию между a и b, +-- создаёт кватернион как интерполяцию между a и b, -- где t - фактор интерполяции quat.slerp(a: quat, b: quat, t: number) -> quat @@ -29,6 +41,6 @@ quat.slerp(a: quat, b: quat, t: number, dst: quat) ## Перевод в строку - *quat.tostring(...)* ```lua --- возвращает строку представляющую содержимое кватерниона +-- возвращает строку, представляющую содержимое кватерниона quat.tostring(q: quat) -> string ``` diff --git a/src/logic/EngineController.hpp b/src/logic/EngineController.hpp index a46973cf3..baba7ba9e 100644 --- a/src/logic/EngineController.hpp +++ b/src/logic/EngineController.hpp @@ -3,6 +3,7 @@ #include #include #include +#include class Engine; class World; diff --git a/src/logic/scripting/lua/libs/libquat.cpp b/src/logic/scripting/lua/libs/libquat.cpp index 2316360a1..53757cb36 100644 --- a/src/logic/scripting/lua/libs/libquat.cpp +++ b/src/logic/scripting/lua/libs/libquat.cpp @@ -44,8 +44,17 @@ static int l_tostring(lua::State* L) { return lua::pushstring(L, ss.str()); } +static int l_from_euler(lua::State *L) { + uint argc = lua::check_argc(L, 1, 2); + glm::vec3 euler = glm::radians(lua::tovec3(L, 1)); + + if (argc == 2) return lua::setquat(L, 2, glm::quat(euler)); + return lua::pushquat(L, glm::quat(euler)); +} + const luaL_Reg quatlib[] = { {"from_mat4", lua::wrap}, + {"from_euler", lua::wrap}, {"slerp", lua::wrap}, {"tostring", lua::wrap}, {nullptr, nullptr}