- 992
- 354
- Версия MoonLoader
- Другое
нужно получить поворот игрока по оси Z (аналог функции getCharHeading), используя кватернион который приходит в синхре
За это не могу сказать, но в moonloader они считываются как uint16, в раксампе считываются как int16.А чего не флоат же? Это же флоат кватернион а не целое число
local cwNeg, cxNeg, cyNeg, czNeg = bs:readBool(), bs:readBool(), bs:readBool(), bs:readBool()
local x = cx / 65535
local y = cy / 65535
local z = cz / 65535
if cxNeg then x = -x end
if cyNeg then y = -y end
if czNeg then z = -z end
local diff = 1 - x * x - y * y - z * z
if diff < 0 then diff = 0 end
local w = math.sqrt(diff)
if cwNeg then w = -w end
return {w, x, y, z}
local matrix = require("matrix3x3")
local samp = require("samp.events")
function samp.onSendPlayerSync(data)
local m = matrix(convertQuaternionToMatrix(data.quaternion[3], data.quaternion[0], data.quaternion[1], data.quaternion[2]))
local heading = (math.pi * 2 - (math.atan2(m.front.y, m.up.y) + math.pi / 2)) % (math.pi * 2)
-- math.deg(heading) == getCharHeading(PLAYER_PED)
end
возвращает постоянно 180Lua:local matrix = require("matrix3x3") local samp = require("samp.events") function samp.onSendPlayerSync(data) local m = matrix(convertQuaternionToMatrix(data.quaternion[3], data.quaternion[0], data.quaternion[1], data.quaternion[2])) local heading = (math.pi * 2 - (math.atan2(m.front.y, m.up.y) + math.pi / 2)) % (math.pi * 2) -- math.deg(heading) == getCharHeading(PLAYER_PED) end
дай норм функу convertQuaternionToMatrix
local function convertQuaternionToMatrix(w, x, y, z)
return 1 - 2 * (y^2 + z^2), 2 * (x * y - z * w), 2 * (x * z + y * w),
2 * (x * y + z * w), 1 - 2 * (x^2 + z^2), 2 * (y * z - x * w),
2 * (x * z - y * w), 2 * (y * z + x * w), 1 - 2 * (x^2 + y^2)
end
херню какую то показывает, юзаю в onPlayerSyncLua:local function convertQuaternionToMatrix(w, x, y, z) return 1 - 2 * (y^2 + z^2), 2 * (x * y - z * w), 2 * (x * z + y * w), 2 * (x * y + z * w), 1 - 2 * (x^2 + z^2), 2 * (y * z - x * w), 2 * (x * z - y * w), 2 * (y * z + x * w), 1 - 2 * (x^2 + y^2) end
local m = matrix(convertQuaternionToMatrix(data.quaternion[4], data.quaternion[1], data.quaternion[2], data.quaternion[3]))
массивы с 0 индексируются, это не луа таблицахерню какую то показывает, юзаю в onPlayerSync
вот так
Код:local m = matrix(convertQuaternionToMatrix(data.quaternion[4], data.quaternion[1], data.quaternion[2], data.quaternion[3]))
0 не объявлен, это модиф самп луа для раксампамассивы с 0 индексируются, это не луа таблица
это модиф самп луа для раксампа
function samp.onPlayerSync(id, data)
if id == 21 then -- ид одного и того же игрока в обоих случаях, он стоит на месте
print(("%.2f %.2f %.2f %.2f"):format(data.quaternion[1], data.quaternion[2], data.quaternion[3], data.quaternion[4]))
-- raksamp 0.95 0.00 0.00 -0.32
-- moon 0.73 0.00 0.00 0.68
end
end
Это круто, я это знал, поэтому и написал сюда)там изменены только обработчики событий, структуры те же самые
Всё-таки там таблица, но есть нюанс. Я проверил кватернионы в onPlayerSync в муне и в раксампе и они разные при одинаковых условиях:
Lua:function samp.onPlayerSync(id, data) if id == 21 then -- ид одного и того же игрока в обоих случаях, он стоит на месте print(("%.2f %.2f %.2f %.2f"):format(data.quaternion[1], data.quaternion[2], data.quaternion[3], data.quaternion[4])) -- raksamp 0.95 0.00 0.00 -0.32 -- moon 0.73 0.00 0.00 0.68 end end
неправильные типы в либе раксампаБлять ну действительно че за херня, разные кватернионы
-- \libs\samp\events\bitstream_io.lua, метод mod.normQuat.read
-- изменить
local cx, cy, cz = bs:readInt16(), bs:readInt16(), bs:readInt16()
-- на
local cx, cy, cz = bs:readUInt16(), bs:readUInt16(), bs:readUInt16()
А чего не флоат же? Это же флоат кватернион а не целое числонеправильные типы в либе раксампа
Lua:-- \libs\samp\events\bitstream_io.lua, метод mod.normQuat.read -- изменить local cx, cy, cz = bs:readInt16(), bs:readInt16(), bs:readInt16() -- на local cx, cy, cz = bs:readUInt16(), bs:readUInt16(), bs:readUInt16()
За это не могу сказать, но в moonloader они считываются как uint16, в раксампе считываются как int16.А чего не флоат же? Это же флоат кватернион а не целое число
local cwNeg, cxNeg, cyNeg, czNeg = bs:readBool(), bs:readBool(), bs:readBool(), bs:readBool()
local x = cx / 65535
local y = cy / 65535
local z = cz / 65535
if cxNeg then x = -x end
if cyNeg then y = -y end
if czNeg then z = -z end
local diff = 1 - x * x - y * y - z * z
if diff < 0 then diff = 0 end
local w = math.sqrt(diff)
if cwNeg then w = -w end
return {w, x, y, z}
function quat2angle(qZ, qW)
return (2.0 * math.atan2(qZ, qW) * 180.0 / math.pi) % 360.0
end
function sampev.onPlayerSync(playerId, data)
if playerId == 228 then
local angle = quat2angle(-data.quaternion[4], data.quaternion[1])
print(angle)
end
end
Кват сжимается, чтобы занимать меньше байт при передаче синхрыА чего не флоат же? Это же флоат кватернион а не целое число