Угол поворота автомобиля

Armya

Участник
Автор темы
32
13
Версия MoonLoader
.026-beta
Какие путем можно определить угол поворота автомобиля относительно его движения?
Например в игре RDS — The Official Drift Videogame есть такая система:

oj0pB1N.png
 
  • Вау
Реакции: why ega
Решение
Lua:
-- тут просто для примера используем машину где сидит человек
local veh = storeCarCharIsInNoSave(PLAYER_PED)

-- Угол движения машины будет неверным, если машина стоит на месте
-- Так что проверяем
if getCarSpeed(veh) > 0 then
  -- Нас волнует только ось Z (вертикальная)
  local vx, vy = getCarSpeedVector(veh)

  -- получаем угол движения по оси Z в радианах
  local va = math.atan2(vy, vx)

  -- немного математики что бы преобразовать в градусы
  -- и придать формат, как у угла поворота
  va = math.deg(va) - 90
  while va < 0 do
    va = va + 360
  end
  while va > 360 do
    va = va - 360
  end

  -- получаем угол поворота машины
  local ca = getCarHeading(veh)

  -- сравниваем их
  local diff = ca - va

  -- выводим...

RedHolms

Известный
Проверенный
617
360
Lua:
-- тут просто для примера используем машину где сидит человек
local veh = storeCarCharIsInNoSave(PLAYER_PED)

-- Угол движения машины будет неверным, если машина стоит на месте
-- Так что проверяем
if getCarSpeed(veh) > 0 then
  -- Нас волнует только ось Z (вертикальная)
  local vx, vy = getCarSpeedVector(veh)

  -- получаем угол движения по оси Z в радианах
  local va = math.atan2(vy, vx)

  -- немного математики что бы преобразовать в градусы
  -- и придать формат, как у угла поворота
  va = math.deg(va) - 90
  while va < 0 do
    va = va + 360
  end
  while va > 360 do
    va = va - 360
  end

  -- получаем угол поворота машины
  local ca = getCarHeading(veh)

  -- сравниваем их
  local diff = ca - va

  -- выводим
  printStringNow(("%f"):format(diff), 1)
end
 

Armya

Участник
Автор темы
32
13
Lua:
-- тут просто для примера используем машину где сидит человек
local veh = storeCarCharIsInNoSave(PLAYER_PED)

-- Угол движения машины будет неверным, если машина стоит на месте
-- Так что проверяем
if getCarSpeed(veh) > 0 then
  -- Нас волнует только ось Z (вертикальная)
  local vx, vy = getCarSpeedVector(veh)

  -- получаем угол движения по оси Z в радианах
  local va = math.atan2(vy, vx)

  -- немного математики что бы преобразовать в градусы
  -- и придать формат, как у угла поворота
  va = math.deg(va) - 90
  while va < 0 do
    va = va + 360
  end
  while va > 360 do
    va = va - 360
  end

  -- получаем угол поворота машины
  local ca = getCarHeading(veh)

  -- сравниваем их
  local diff = ca - va

  -- выводим
  printStringNow(("%f"):format(diff), 1)
end
Немного преобразовал твой код, получил такой скрипт:
Lua:
require "lib.moonloader"

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    while true do
        wait(0)
        
        local veh = storeCarCharIsInNoSave(PLAYER_PED)
        
        if getCarSpeed(veh) > 0 then
            local vx, vy = getCarSpeedVector(veh)
            local va = math.atan2(vy, vx)
            va = math.deg(va) -90
            
            while va < 0 do
                va = va + 360
            end
            
            while va > 360 do
                va = va - 360
            end
            
            local diff = getCarHeading(veh) - va
            local diff = math.floor(diff)
            
            if diff < 0 then
                diff = diff * -1
            end
            printStringNow(math.floor(diff), 0)
        end
    end
end
Что в оригинальном коде(в твоем), что в моем присутствует баг - когда авто направленно в определенную сторону, показатель diff может улететь в космос (до максимального значения, равному 360). Может быть, у тебя есть идеи как это пофиксить? Я попытался - не вышло