Найти координаты точки перед машиной учитывая угол наклона

z1qqurat

Участник
Автор темы
60
13
Версия MoonLoader
.026-beta
В общем, Я хочу нарисовать линию, которая будет идти от машины к той точке, куда она смотрит на неком расстоянии(условно 200). Тоесть если машина стоит ровно - линия будет идти прямо перед ней. Если машина направлена капотом в землю - линия идет вниз в землю. Так же в небо и тд зависимо от наклона. Нашел как посчитать Х и Y, а вот Z не могу нарыть

Lua:
local angX, angY, angZ = getCarCoordinates(handle)
local angle = getCarHeading(handle)
local distance = 200
angX = angX + (distance * math.sin(math.rad(-angle)))
angY = angY + (distance * math.cos(math.rad(-angle)))
angZ = ?
 

wojciech?

Известный
220
132
300px-Spherical_with_grid.svg.png


1690652114689.png
 
Последнее редактирование:

Anti...

Активный
262
26

z1qqurat

Участник
Автор темы
60
13
А можно пожалуйста как-то расписать чтоб я понял как это на луа настрочить? мне чисто для Z, как я сказал выше X и Y мой код норм считает

Возможно тебе нужно использовать библиотеку ffi.
Вот нашёл тему, но там указывает направление, куда смотрит игрок, мб пригодится.
не помогло, потому что там показывает всех кроме собственно моего персонажа
 
Последнее редактирование:

wojciech?

Известный
220
132
как я сказал выше X и Y мой код норм считает
Как показывают формулы, что я кинул, оно считает не норм) Ты считаешь в двухмерном пространстве, а хочешь использовать трехмерное и, как следствие, твои формулы становятся неактуальными для решения этой задачи

Тебе нужно найти зенитный и азимутальный углы (далее тета и фи соответственно). То есть наклон машины относительно вертикали и горизонтали. Но дефолтной функции в API я не нашел. Можно получить кватернион и конвертировать его в нормальные значения)

Потом просто подставить эти значения в формулы:
Lua:
local x, y, z = getCarCoordinates(vehicleHandle) -- изначальная позиция машины
local radius = 200

-- здесь каким-то образом надо получить углы
local teta, phi = 0, 0

-- конвертировать их в радианы
teta, phi = math.rad(teta), math.rad(phi)

-- и получить позицию
local vector3 = {
    x = x + radius * math.sin(teta) * math.cos(phi),
    y = y + radius * math.sin(teta) * math.sin(phi),
    z = z + radius * math.cos(teta)
}
 
  • Вау
  • Нравится
Реакции: qdIbp и z1qqurat

z1qqurat

Участник
Автор темы
60
13
Вообще, это азимутный. Он показывает угол вращения по горизонтали, относительно плоскости, образованной осями X и Y
Судя по формуле что я нашел азимутный угол считается так:
2 * math.acos(w)
a getCarHeading возвращает совсем другое значение если сравнить с тем что дает w с getVehicleQuaternion в формуле выше
 

wojciech?

Известный
220
132
a getCarHeading возвращает совсем другое значение если сравнить с тем что дает w с getVehicleQuaternion в формуле выше
ты когда сравнивал угол с кватернионом на что надеялся, что они совпадут?)
 

z1qqurat

Участник
Автор темы
60
13
ты когда сравнивал угол с кватернионом на что надеялся, что они совпадут?)
Lua:
    local angle = getCarHeading(handle) -- получаем угол поворота персонажа по его handle

    local qx, qy, qz, qw = getVehicleQuaternion(handle)
    local zet = 2 * math.acos(qw)
    sampAddChatMessage("zet: "..zet.." azimut: "..angle, -1)
output:
zet: 3.9481703162751 azimut: 226.55751037598

так я сравниваю начение зgetCarHeading(который по твоим словам является азимутным углом) к тому, что я вручную по формуле посчитал исходя из кватериона.