local maf	= require 'maf'
local vec3	= maf.vector
local quat	= maf.rotation


-- Порог для поднятия тангажа, используется для корректировки тангажа
local pitchUpThreshold   = -15 -- значение в градусах, извлечено из MonoBehaviour с fileID: 3737572916587997159

-- Угол для тонкой корректировки рулевого управления,
-- определяет, когда следует выполнять корректировки рысканья или крена
local fineSteeringAngle  = 5   -- значение в градусах, извлечено из MonoBehaviour с fileID: 3737572916587997159

-- Фактор для корректировки рысканья, множитель для настройки управления по рысканию
local yawFactor          = 1   -- множитель, используется для масштабирования корректировки рысканья, извлечено из MonoBehaviour с fileID: 3737572916587997159

-- Фактор для корректировки крена, множитель для настройки управления по крену
local rollFactor         = 0.01 -- множитель, используется для масштабирования корректировки крена, извлечено из MonoBehaviour с fileID: 3737572916587997159

-- Скорость рулевого управления, определяет, насколько быстро следует двигаться к целевому вводу
local steeringSpeed      = 5.0 -- единиц в секунду, скорость перемещения к целевым значениям управления, извлечено из MonoBehaviour с fileID: 3737572916587997159

local dir = {
    forward		= vec3(0, 1, 0),	-- вперед
    backward	= vec3(0, -1, 0),	-- назад
    right		= vec3(1, 0, 0),	-- вправо
    left		= vec3(-1, 0, 0),	-- влево
    up			= vec3(0, 0, 1),	-- вверх
    down		= vec3(0, 0, -1)	-- вниз
}

function signedAngle(from, to, axis)
  -- Step 1: Normalize the both vectors
  local fromNormalized = from:clone():normalize()
  local toNormalized = to:clone():normalize()
  
  -- Step 2: Calculate the unsigned angle
  local dotProduct = fromNormalized:dot(toNormalized)
  local angle = math.acos(math.max(-1, math.min(1, dotProduct))) -- Clamp acos input

  -- Step 3: Determine the sign using the cross product and reference axis
  local crossProduct = fromNormalized:cross(toNormalized)
  local sign = crossProduct:dot(axis) < 0 and -1 or 1

  -- Step 4: Return the signed angle
  return angle * sign
end




function CalculateSteeringForPlane(plane ,--[[float]] dt, --[[Vector3]] targetPosition)
    -- Get current position and orientation of the plane
    local planePosition = vec3(getCarCoordinates(plane))
    local planeRotation = quat(getVehicleQuaternion(plane))

    -- Compute error vector transformed into local space
    local error = targetPosition - planePosition;
    error = -planeRotation * error;

    -- Normalize directional errors for pitch, roll, and yaw
    local errorDir = error:normalize();
    local pitchError = vec3(0, error.z, error.y):normalize();
    local rollError = vec3(error.x, 0, error.y):normalize();
    local yawError = vec3(error.x, error.z, 0):normalize();

    -- Initialize target input vector
    local targetInput = vec3();

    -- Compute pitch based on error and thresholds
    local pitch = signedAngle(dir.forward, pitchError, dir.right);
    if (-pitch < pitchUpThreshold) then
        pitch = pitch + 360
    end
    targetInput.x = pitch;

    -- Determine steering adjustments for yaw or roll
    if (vec3.angle(dir.forward, errorDir) < fineSteeringAngle) then
        -- Calculate yaw adjustment
        local yaw = signedAngle(dir.forward, yawError, dir.up);
        targetInput.y = yaw * yawFactor
    else
        -- Calculate roll adjustment
        local roll = signedAngle(dir.up, rollError, dir.forward);
        targetInput.z = roll * rollFactor
    end

    -- Clamp inputs to range [-1, 1]
    -- targetInput.x = math.max(-1, math.min(1, targetInput.x))
    -- targetInput.y = math.max(-1, math.min(1, targetInput.y))
    -- targetInput.z = math.max(-1, math.min(1, targetInput.z))

    -- Smoothly move towards the target input
    -- local input = Vector3.MoveTowards(lastInput, targetInput, steeringSpeed * dt);
    -- lastInput = input;

    return targetInput;
end

function main()
	local plane = storeCarCharIsInNoSave(playerPed)
	
	local planePosition = vec3(getCarCoordinates(plane))
	local planeRotation = quat(getVehicleQuaternion(plane))
	
	local goPos = planePosition + planeRotation * dir.forward
	print(CalculateSteeringForPlane(plane , 10, goPos ))
end

почему этот код возвращает [ML] (script) (^^)tracers.lua: (1.574537, -1.583847, 0.000000)
если должен возвращать нули? (вектор РОВНО вперед относительно самолета)