Неактуально Системы координат

Tema05

Известный
Автор темы
1,474
439
Версия MoonLoader
.026-beta
Lua:
local x, y, z, w = getVehicleQuaternion(storeCarCharIsInNoSave(playerPed))
local matrix = {convertQuaternionToMatrix(w, x, y, z)}
matrix[1] = -matrix[1]
matrix[2] = -matrix[2]
matrix[4] = -matrix[4]
matrix[5] = -matrix[5]
matrix[7] = -matrix[7]
matrix[8] = -matrix[8]
local w, x, y, z = convertMatrixToQuaternion(matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], matrix[6], matrix[7], matrix[8], matrix[9])
setVehicleQuaternion(storeCarCharIsInNoSave(playerPed), x, y, z, w)
Вот есть код. Он как я понял разворачивает машина на 180 в всех 3 координатах. Может кто-нибудь объяснить что такое Quaternion координаты и почему их 4, а не 3.
И также почему convertQuaternionToMatrix возвращает 9 значений, а не 3 значения X Y Z. Для чего каждой координате 3 числа. Это что вообще значит.
У меня конечная цель превратить угол поворота (по горизонтали) из градуса в Quaternion координаты
 

MrDorlik

Известный
957
385
для машины есть отдельные функции getCarPitch(), getCarRoll(), getCarHeading()
вот перевод кватернионов в углы эйлера, который я писал человечку для перевода кватернионов для объектов, потому что у объектов нет функции для получения pitch и roll, есть только heading, но для машины как я написал выше есть отдельные функции
Lua:
local rx, ry, rz, rw = getVehicleQuaternion(veh)

local t0 = 2 * (rw * rx + ry * rz)
local t1 = 1 - 2 * (rx^2 + ry^2)
local t2 = - 2 * (rw * ry - rz * rx)
local t3 = 2 * (rw * rz + rx * ry)
local t4 = 1 - 2 * (rz^2 + ry^2)

local rxx = math.deg(math.atan2(t0, t1)) -- pitch
local ryy = math.deg(math.asin(t2)) -- roll
local rzz = math.deg(math.atan2(t3, t4)) -- heading
а, я только щас увидел что тебе наоборот из градусов надо перевести в кватернионы, ну я думаю ты напишешь обратную функцию
 

WellMay

Известный
913
287
для машины есть отдельные функции getCarPitch(), getCarRoll(), getCarHeading()
вот перевод кватернионов в углы эйлера, который я писал человечку для перевода кватернионов для объектов, потому что у объектов нет функции для получения pitch и roll, есть только heading, но для машины как я написал выше есть отдельные функции
Lua:
local rx, ry, rz, rw = getVehicleQuaternion(veh)

local t0 = 2 * (rw * rx + ry * rz)
local t1 = 1 - 2 * (rx^2 + ry^2)
local t2 = - 2 * (rw * ry - rz * rx)
local t3 = 2 * (rw * rz + rx * ry)
local t4 = 1 - 2 * (rz^2 + ry^2)

local rxx = math.deg(math.atan2(t0, t1)) -- pitch
local ryy = math.deg(math.asin(t2)) -- roll
local rzz = math.deg(math.atan2(t3, t4)) -- heading
а, я только щас увидел что тебе наоборот из градусов надо перевести в кватернионы, ну я думаю ты напишешь обратную функцию
Что такое блять квантерионы?
 

VanoKLR

Известный
879
488
Что такое блять квантерионы?
Кватернионы - обобщение комплексных чисел. Комплексные числа состоят как бы из двух связанных, но не взаимозаменяемых частей, кватернионы - из четырех. Область применимости кватернионов, правда, значительно меньше, но они все же очень полезны, так как с их помощью отлично описываются движения в трехмерном пространстве. Кстати, дальнейшим обобщением кватернионов в том же направлении являются октавы, у которых еще меньше практических применений. Для кватернионов, как и для действительных и комплексных чисел, существуют синусы, логарифмы и прочая тригонометрия, производные, интегралы и тому так далее.

Физика короче...
 

Tema05

Известный
Автор темы
1,474
439
для машины есть отдельные функции getCarPitch(), getCarRoll(), getCarHeading()
вот перевод кватернионов в углы эйлера, который я писал человечку для перевода кватернионов для объектов, потому что у объектов нет функции для получения pitch и roll, есть только heading, но для машины как я написал выше есть отдельные функции
Lua:
local rx, ry, rz, rw = getVehicleQuaternion(veh)

local t0 = 2 * (rw * rx + ry * rz)
local t1 = 1 - 2 * (rx^2 + ry^2)
local t2 = - 2 * (rw * ry - rz * rx)
local t3 = 2 * (rw * rz + rx * ry)
local t4 = 1 - 2 * (rz^2 + ry^2)

local rxx = math.deg(math.atan2(t0, t1)) -- pitch
local ryy = math.deg(math.asin(t2)) -- roll
local rzz = math.deg(math.atan2(t3, t4)) -- heading
а, я только щас увидел что тебе наоборот из градусов надо перевести в кватернионы, ну я думаю ты напишешь обратную функци
Решение всё это время было. Нужно было гуглить квартенионы по русски https://www.blast.hk/threads/143608/#post-1106144