Ближайший транспорт по направлению взгляда

vladmany

Известный
Автор темы
117
8
Версия MoonLoader
.026-beta
Нужно получить хэндл транспорта, ближайшего к точке, которая находится впереди взгляда игрока на каком-то расстоянии, пускай оно будет 5. Другими словми, нужно найти ближайший транспорт, только смотреть не от координаты игрока, а от той координаты, которая находится впереди его взгляда. Ниже всё наглядно на скрине показал.

Безымянный 4.png


Хоть и ближайшее к игроку транспортное средство это Feltzer, но так как мы смотрим в сторону NRG-500, его хендл мы должны получить. Надеюсь понятно объяснил.
 
Решение
Почти то что нужно. Но теперь я не так объяснил. Нужно опираться на поворот не камеры, а самого педа, тоесть модельки персонажа.

Quasper

Известный
834
354
Lua:
function getClosestVehInCamera()
    local pX, pY, pZ = getCharCoordinates(playerPed)
    local minDist = 999
    local veh
    for k, v in ipairs(getAllVehicles()) do
        local cX, cY, cZ  = getCarCoordinates(v)
        if isPointOnScreen(cX, cY, cZ, minDist) then
            if minDist <= getDistanceBetweenCoords3d(pX, pY, pZ, cX, cY, cZ) then
                minDist = getDistanceBetweenCoords3d(pX, pY, pZ, cX, cY, cZ)
                veh = v
            end
        end
    end
    return veh
end
Проверь, должно вернуть ближайший кар(хэндл) что находится на экране
 

Rei

Известный
Друг
1,590
1,621
Lua:
function getClosestVehInCamera()
    local pX, pY, pZ = getCharCoordinates(playerPed)
    local minDist = 999
    local veh
    for k, v in ipairs(getAllVehicles()) do
        local cX, cY, cZ  = getCarCoordinates(v)
        if isPointOnScreen(cX, cY, cZ, minDist) then
            if minDist <= getDistanceBetweenCoords3d(pX, pY, pZ, cX, cY, cZ) then
                minDist = getDistanceBetweenCoords3d(pX, pY, pZ, cX, cY, cZ)
                veh = v
            end
        end
    end
    return veh
end
Проверь, должно вернуть ближайший кар(хэндл) что находится на экране
хуита, надо определять центр экрана с экранными коордами тачек и делать сравнения в 2д
 

vladmany

Известный
Автор темы
117
8
Похоже вы не поняли. Мне нужно оперелять ближайший кар не на экране. Нужно получить поворот взгляда, и с помощью него отступить в ту сторону, в которую повернут экран игрока допустим 10 единиц координат, и уже от этой точки найти ближайший кар.
 

Cosmo

Известный
Друг
646
2,604
Возможно накостылил, но это то что тебе нужно как я понял
Функция:
function getNearCarToCenter(maxDist)
    local sx, sy = getScreenResolution()
    local midX, midY = sx / 2, sy / 2
    local t = {}
    for k, car in ipairs(getAllVehicles()) do
        if isCarOnScreen(car) then
            local x, y, z = getCarCoordinates(car)
            local myX, myY, myZ = getCharCoordinates(playerPed)
            local cX, cY = convert3DCoordsToScreen(x, y, z)
            local dist = getDistanceBetweenCoords2d(midX, midY, cX, cY)
            local distBtwCar = getDistanceBetweenCoords3d(x, y, z, myX, myY, myZ)
            if distBtwCar <= tonumber(maxDist) then
                table.insert(t, {dist, car})
            end
        end
    end
    if #t > 0 then
        local minDist = t[1][1]
        for i = 1, #t do
              if t[i][1] < minDist then
                minDist = t[i][1]
                nearestCar = t[i][2]
              end
        end
        return true, nearestCar
    end
    return false
end
Использование:
local res, car = getNearCarToCenter(50) -- 50 это радиус поиска в метрах относительно нас
if res then
    local sampId = select(2, sampGetVehicleIdByCarHandle(car)
    print('ID ближайшей машины в радиусе 50 м. относительно центра экрана: '..sampId)
end
 

vladmany

Известный
Автор темы
117
8
Возможно накостылил, но это то что тебе нужно как я понял
Функция:
function getNearCarToCenter(maxDist)
    local sx, sy = getScreenResolution()
    local midX, midY = sx / 2, sy / 2
    local t = {}
    for k, car in ipairs(getAllVehicles()) do
        if isCarOnScreen(car) then
            local x, y, z = getCarCoordinates(car)
            local myX, myY, myZ = getCharCoordinates(playerPed)
            local cX, cY = convert3DCoordsToScreen(x, y, z)
            local dist = getDistanceBetweenCoords2d(midX, midY, cX, cY)
            local distBtwCar = getDistanceBetweenCoords3d(x, y, z, myX, myY, myZ)
            if distBtwCar <= tonumber(maxDist) then
                table.insert(t, {dist, car})
            end
        end
    end
    if #t > 0 then
        local minDist = t[1][1]
        for i = 1, #t do
              if t[i][1] < minDist then
                minDist = t[i][1]
                nearestCar = t[i][2]
              end
        end
        return true, nearestCar
    end
    return false
end
Использование:
local res, car = getNearCarToCenter(50) -- 50 это радиус поиска в метрах относительно нас
if res then
    local sampId = select(2, sampGetVehicleIdByCarHandle(car)
    print('ID ближайшей машины в радиусе 50 м. относительно центра экрана: '..sampId)
end
Почти то что нужно. Но теперь я не так объяснил. Нужно опираться на поворот не камеры, а самого педа, тоесть модельки персонажа.
 

Вложения

  • Screenshot_3.png
    Screenshot_3.png
    547.9 KB · Просмотры: 90
  • Screenshot_4.png
    Screenshot_4.png
    500.6 KB · Просмотры: 113
  • Screenshot_5.png
    Screenshot_5.png
    505.7 KB · Просмотры: 91
  • Screenshot_28.png
    Screenshot_28.png
    508.5 KB · Просмотры: 91

Rei

Известный
Друг
1,590
1,621
Почти то что нужно. Но теперь я не так объяснил. Нужно опираться на поворот не камеры, а самого педа, тоесть модельки персонажа.
 
  • Нравится
Реакции: vladmany