- 44
 
- 37
 
Так. Страшное слово «кватернион»!
Поехали к тз.
Необходимо реализовать функционал поворота самолета или вертолета влево и вправо (аналогично нажатию клавиш `Q` или `E` в игре). Решение должно быть реализовано без эмуляции нажатия клавиш или отправки клавиши в окно игры.
1. Функция должна работать в свернутом режиме.
2. Поворот должен выполняться только по горизонтали (не затрагивая угол наклона самолета/вертолета).
Попытки решения:
1. Базовая функция поворота через изменение угла объекта
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
**Проблема:** Если самолет наклонен, он становится ровным после вызова функции.
---
2. Использование матрицы объекта для изменения угла поворота
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
**Проблема:** Аналогично первому решению, если самолет наклонен, он становится ровным.
---
3. Синхронизация транспорта
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
**Проблема:** Только после я понял то что ничего не увижу, ибо синхра.
---
4. САМОЕ СТРАШНОЕ СЛОВО
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
**Проблема:** Если getVehicleQuaternion - то все равно нулю. А если getCharQuaternion - то ниче не воркает . Кто там, а, @Vintik 
---
5. Хз что и как но:
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
**Проблема:** такая же как и в попытке первого решения
			
			Поехали к тз.
Необходимо реализовать функционал поворота самолета или вертолета влево и вправо (аналогично нажатию клавиш `Q` или `E` в игре). Решение должно быть реализовано без эмуляции нажатия клавиш или отправки клавиши в окно игры.
1. Функция должна работать в свернутом режиме.
2. Поворот должен выполняться только по горизонтали (не затрагивая угол наклона самолета/вертолета).
Попытки решения:
1. Базовая функция поворота через изменение угла объекта
			
				lua:
			
		
		
		function rotate(left)
    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        local angle = getCarHeading(car)
        setCarHeading(car, angle + (left and 1 or -1) / 3.14)
    end
end
	---
2. Использование матрицы объекта для изменения угла поворота
			
				lua:
			
		
		
		local ffi = require("ffi")
local CPlaceable__GetMatrix = ffi.cast("uintptr_t(__thiscall*)(uintptr_t)", 0x411990)
local CMatrix__SetRotateZOnly = ffi.cast("int(__thiscall*)(uintptr_t, float)", 0x59B020)
function setEntityHeading(p_entity, heading)
    local p_matrix = CPlaceable__GetMatrix(p_entity)
    if p_matrix ~= ffi.NULL then
        CMatrix__SetRotateZOnly(p_matrix, heading)
    end
end
function changeEntityHeading(angleChange)
    local currentHeading = getCharHeading(PLAYER_PED)
    local newHeading = (currentHeading + angleChange) % 360
    if newHeading < 0 then
        newHeading = newHeading + 360
    end
    setEntityHeading(getCarPointer(storeCarCharIsInNoSave(playerPed)), math.rad(newHeading))
end
-- Пример использования
if fin_right == true then
    changeEntityHeading(-0.10)
end
if fin_left == true then
    changeEntityHeading(0.10)
end
	---
3. Синхронизация транспорта
			
				lua:
			
		
		
		[SIZE=5]function samp.onSendVehicleSync(data)
    if left == true then
        data.keysData = data.keysData + 64
    elseif right == true then
        data.keysData = data.keysData + 256
    end
end[/SIZE]
	**Проблема:** Только после я понял то что ничего не увижу, ибо синхра.
---
4. САМОЕ СТРАШНОЕ СЛОВО
			
				lua:
			
		
		
		function rotateVehicle(angle, direction)
    -- angle - градусы (не алкоголь)
    -- direction: 1 для поворота вправо, -1 для поворота влево
    local vehicle = getCarPointer(storeCarCharIsInNoSave(playerPed)) -- Получаем указатель на транспорт игрока
    if not vehicle or vehicle == 0 then
        sampAddChatMessage("Вы не находитесь в транспорте!", -1)
        return
    end
    local qW, qX, qY, qZ = getCharQuaternion(PLAYER_PED) 
    local rotationAngle = math.rad(angle * direction) -- Преобразуем угол в радианы
    local cosA = math.cos(rotationAngle / 2)
    local sinA = math.sin(rotationAngle / 2)
    local qx = 0
    local qy = 0
    local qz = sinA
    local qw = cosA
    local newQW = qW*qw - qX*qx - qY*qy - qZ*qz
    local newQX = qW*qx + qX*qw + qY*qz - qZ*qy
    local newQY = qW*qy - qX*qz + qY*qw + qZ*qx
    local newQZ = qW*qz + qX*qy - qY*qx + qZ*qw
    local length = math.sqrt(newQW*newQW + newQX*newQX + newQY*newQY + newQZ*newQZ)
    if length == 0 then
        sampAddChatMessage("Ошибка при вычислении кватерниона!", -1)
        return
    end
    newQW = newQW / length
    newQX = newQX / length
    newQY = newQY / length
    newQZ = newQZ / length
    -- Применяем новый кватернион к транспорту
    setCharQuaternion(PLAYER_PED, newQW, newQX, newQY, newQZ)
end
	---
5. Хз что и как но:
			
				lua:
			
		
		
		function rotateWithTiltPreservation(left)
    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        local roll, pitch = getCarRoll(car), getCarPitch(car)
       
        local angle = getCarHeading(car)
        
        setCarHeading(car, angle + (left and 1 or -1) / 3.14)
        
        setCarRoll(car, roll)
        --setCarPitch(car, pitch), увы но такого не существует(((
    end
end
	Кто сделает функцию которая будет работать и не будет ресетать положение самолета - получит 1.5к
ОПЛАТА СБЕР ИЛИ ТИНЬКОФФ, КОРОЧЕ, РУ КАРТА
ОПЛАТА СБЕР ИЛИ ТИНЬКОФФ, КОРОЧЕ, РУ КАРТА