PDA

Просмотр полной версии : [Вопрос] Получение точных координат дверей определенного автомобиля



SteveStage
15.09.2020, 22:57
Существуют такие функции, как GetCoordBootVehicle и GetCoordBonnetVehicle, и они получают точные координаты багажника и капота автомобиля соответственно. Существует ли функция, которая способна получать координаты дверей автомобиля?

DeimoS
15.09.2020, 23:01
Так же, как работают эти функции - через GetVehicleModelInfo и тригонометрию? Правда, не получится одной формулой для всех моделей высчитать позицию из-за того, что у некоторых моделей расположение дверей отличается, но для тех моделей можно составить отдельную формулу.

SteveStage
15.09.2020, 23:07
Так же, как работают эти функции - через GetVehicleModelInfo и тригонометрию? Правда, не получится одной формулой для всех моделей высчитать позицию из-за того, что у некоторых моделей расположение дверей отличается, но для тех моделей можно составить отдельную формулу.

Ну тут 2 варианта: 4-дверная, 2-дверная и грузовик.

UPD: чуть чуть пошевелив своей тупой головой, я написал сие творение для двух дверей (пока что только для 2-дверных авто):

stock GetCoordDoorRightVehicle(vehicleid, &Float:x, &Float:y, &Float:z)
{
new Float:angle, Float:distance;
GetVehicleModelInfo(GetVehicleModel(vehicleid), 1, distance, y, z);
distance = (distance/2.0) + 1.0;
GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, angle);
x += (distance * floatsin(-angle+270.0, degrees));
y += (distance * floatcos(-angle+270.0, degrees));
return true;
}
stock GetCoordDoorLeftVehicle(vehicleid, &Float:x, &Float:y, &Float:z)
{
new Float:angle, Float:distance;
GetVehicleModelInfo(GetVehicleModel(vehicleid), 1, distance, y, z);
distance = (distance/2.0) + 1.0;
GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, angle);
x -= (distance * floatsin(-angle+270.0, degrees));
y -= (distance * floatcos(-angle+270.0, degrees));
return true;
}

Кто желает - можете улучшить алгоритм.

DeimoS
16.09.2020, 00:48
Эмм, а зачем ты используешь размер автомобиля в качестве точки отсчёта в GetVehicleModelInfo? Может всё же откроешь описание функции на wiki и прочтёшь описание параметров?

SteveStage
16.09.2020, 17:37
Эмм, а зачем ты используешь размер автомобиля в качестве точки отсчёта в GetVehicleModelInfo? Может всё же откроешь описание функции на wiki и прочтёшь описание параметров?

Что вообще возвращает VEHICLE_MODEL_INFO_FRONTSEAT? И как мне это (https://wiki.sa-mp.com/wiki/GetVehicleModelInfo) поможет вычислить положение дверей?

tnc
16.09.2020, 18:15
Что вообще возвращает VEHICLE_MODEL_INFO_FRONTSEAT?
https://wiki.sa-mp.com/wiki/Vehicle_information_types

P.S: есть VehiclePartPosition (https://github.com/Ino-Bagaric/VehiclePartPosition/blob/master/VehiclePartPosition.inc)

DeimoS
17.09.2020, 04:38
И как мне это (https://wiki.sa-mp.com/wiki/GetVehicleModelInfo) поможет вычислить положение дверей?

То есть, ты совсем не изучал работу тех двух твоих функций, которые ты скинул выше?) Или не заметил, что вся их работа основывается на информации, которую возвращает GetVehicleModelInfo?

- - - Добавлено - - -


P.S: есть VehiclePartPosition (https://github.com/Ino-Bagaric/VehiclePartPosition/blob/master/VehiclePartPosition.inc)

Тогда уж я бы советовал от того же автора инклуд 3DTryg (https://github.com/AbyssMorgan/3DTryg), который, помимо информации о частях машин, имеет кучу полезных функций, как ни странно, связанных с тригонометрией.
В теме на sa-mp.com (https://forum.sa-mp.com/showthread.php?t=591010) есть больше инфы на его счёт.

tnc
17.09.2020, 14:02
Тогда уж я бы советовал от того же автора инклуд 3DTryg (https://github.com/AbyssMorgan/3DTryg), который, помимо информации о частях машин, имеет кучу полезных функций, как ни странно, связанных с тригонометрией.
В теме на sa-mp.com (https://forum.sa-mp.com/showthread.php?t=591010) есть больше инфы на его счёт.

Я знал о 3DTryg, но он слишком жирный

DeimoS
17.09.2020, 15:56
Я знал о 3DTryg, но он слишком жирный

Я не сомневаюсь, что ты знал :) А "жирность" компенсируется полезностью. Многие функции из инклуда используются в среднестатистическом моде жанра RP.

SteveStage
17.09.2020, 17:43
То есть, ты совсем не изучал работу тех двух твоих функций, которые ты скинул выше?) Или не заметил, что вся их работа основывается на информации, которую возвращает GetVehicleModelInfo?

В тригонометрии я не просто не силен, а очень и очень слаб.

DeimoS
18.09.2020, 03:57
В тригонометрии я не просто не силен, а очень и очень слаб.

Ну, во-первых,там и не нужно знать тригонометрию, чтоб увидеть откуда и какая информация внутри функции берётся :) По тем же названиям переменных.
А, во-вторых, тебе стоит основательно тригонометрию подтянуть, ибо она может много где пригодиться.

SteveStage
18.09.2020, 17:41
Ну, во-первых,там и не нужно знать тригонометрию, чтоб увидеть откуда и какая информация внутри функции берётся :) По тем же названиям переменных.
А, во-вторых, тебе стоит основательно тригонометрию подтянуть, ибо она может много где пригодиться.

Гадаю: если я скажу, что мы не проходили тригонометрию, то ты ответишь, что нужно изучать вне школьной системы и самообучаться)

DeimoS
18.09.2020, 17:53
Гадаю: если я скажу, что мы не проходили тригонометрию, то ты ответишь, что нужно изучать вне школьной системы и самообучаться)

Эмм, нет. Я отвечу, что когда начнёте проходить - постарайся хорошенько вникнуть в эту тему, ибо она действительно пригодится :grin:
Ответ на вопрос, как я понимаю, получен?

SteveStage
20.09.2020, 02:39
Эмм, нет. Я отвечу, что когда начнёте проходить - постарайся хорошенько вникнуть в эту тему, ибо она действительно пригодится :grin:
Ответ на вопрос, как я понимаю, получен?

Не получен. VEHICLE_MODEL_INFO_FRONT_SEAT - координаты расстояния между двумя передними дверями или только водительского?

DeimoS
20.09.2020, 08:08
Получи через GetVehicleModelInfo координаты VEHICLE_MODEL_INFO_FRONT_SEAT и создай на том месте 3D текст. Увидишь какую именно точку функция возвращает.

SteveStage
20.09.2020, 11:48
Получи через GetVehicleModelInfo координаты VEHICLE_MODEL_INFO_FRONT_SEAT и создай на том месте 3D текст. Увидишь какую именно точку функция возвращает.

Front seat - переднее пассажирское, rear seat - заднее, и оба справа относительно авто. Как получить позицию переднего водительского и пассажирского за водительским - непонятно.

DeimoS
20.09.2020, 12:27
Три - пара-пара-па-па - го - пара-пара-па-па - но - пара-пара-па-па - мет - пара-пара-па-па - ри - пара-пара-па-па - я :music:

В общем, давай погуглю за тебя. Держи - https://forum.sa-mp.com/showthread.php?p=3185602#post3185602

SteveStage
20.09.2020, 15:40
Три - пара-пара-па-па - го - пара-пара-па-па - но - пара-пара-па-па - мет - пара-пара-па-па - ри - пара-пара-па-па - я :music:

В общем, давай погуглю за тебя. Держи - https://forum.sa-mp.com/showthread.php?p=3185602#post3185602

Там-то известны координаты между двумя передними или задними колесами, а тут?

DeimoS
20.09.2020, 18:22
Там-то известны координаты между двумя передними или задними колесами, а тут?

Где "там" и где "тут"?

И ты сейчас задаёшь такие вопросы, ответы на которые можно получить гораздо быстрее, если просто взять код и поиграться со значениями в формулах, смотря в игре результаты изменений. Не говоря уже о том, что можно взять гугл и нагуглить всё, что душе угодно.

SteveStage
20.09.2020, 20:15
Где "там" и где "тут"?

И ты сейчас задаёшь такие вопросы, ответы на которые можно получить гораздо быстрее, если просто взять код и поиграться со значениями в формулах, смотря в игре результаты изменений. Не говоря уже о том, что можно взять гугл и нагуглить всё, что душе угодно.

Там - по ссылке, тут - в данном топике.

А смысл играться со значениями формул, если нужно просто сделать координаты посередине относительно длины автомобиля? Но я не понимаю, как это сделать.

DeimoS
21.09.2020, 05:15
Я до сих пор не понимаю в чём сложность просто взять и протестировать работу функции GetVehicleModelInfo и работу тех твоих функций, а после скомпилировать из них то, что тебе нужно. Это не требует совершенно никаких знаний тригонометрии. Просто уделить пол часа тестам и методом тыка понять какие значения за какой отступ (на сколько и в какую сторону) отвечают.

Хотя если не хочется ни в чём разбираться и пытаться понять как всё работает - можно просто загуглить. Гуглим "GetVehicleModelInfo VEHICLE_MODEL_INFO_FRONTSEAT" и в одной из первых ссылок видим "GetVehicleParamsCarDoors fix (beta) (https://gist.github.com/ziggi/a378063a2da2bdbf4425)" от Ziggi. Там в OnPlayerUpdate есть готовые проверки, определяющие рядом с каким местом сидит игрок. Немного переделываем проверки, убирая то, что нам не нужно, и получаем следующее:

stock GetVehicleSeatPos(vehicleid, seatid, &Float:x, &Float:y, &Float:z)
{
switch(seatid)
{
case 0:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 1:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 2:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 3:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
}
return 0;
}

Пишем простенький скрипт, который покажет какие координаты возвращает функция, беря все дополнительные массивы и функции так же из интернета:
new const MaxVehicleSeats[212] =
{
4, 2, 2, 2, 4, 4, 1, 2, 2, 4, 2, 2, 2, 4, 2, 2, 4, 2, 4, 2, 4, 4, 2, 2, 2,
1, 4, 4, 4, 2, 1, 2, 1, 2, 2, 0, 2, 2, 4, 2, 4, 1, 2, 2, 2, 4, 1,
2, 1, 2, 0, 2, 1, 1, 1, 2, 2, 2, 4, 4, 2, 2, 1, 2, 1, 2, 4, 4, 2, 2, 4, 2, 1,
1, 2, 2, 1, 2, 2, 4, 2, 1, 4, 3, 1, 1, 1, 4, 4, 2, 4, 2, 4, 1, 2, 2, 2, 4, 4,
2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 1, 1, 2, 1, 1, 2, 2, 4, 2, 2, 1, 1, 2, 2, 2, 2,
2, 2, 2, 2, 4, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 4, 2, 2, 2, 2, 2, 4, 4, 2, 2, 4,
4, 2, 1, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 1, 2, 4, 4, 1, 0, 0, 1, 1, 2,
1, 2, 2, 4, 2, 4, 4, 2, 4, 1, 0, 4, 2, 2, 2, 2, 0, 0, 2, 2, 1, 1,
4, 4, 4, 2, 2, 2, 2, 2, 4, 2, 0, 0, 0, 4, 0, 0
};



const MAX_VEHICLE_SEATS = 4;
CMD:get(playerid, params[])
{
new Float:x, Float:y, Float:z;
new Float:veh_x = 2137.2124, Float:veh_y = -2493.8198, Float:veh_z = 13.5469;
for(new vehicleid, i, vehicletype = 400; vehicletype < 612; vehicletype++)
{
vehicleid = CreateVehicle(vehicletype,
veh_x, veh_y, veh_z, 0.0, -1, -1, 100000);

veh_x -= 5.0;

for(i = 0; i < MAX_VEHICLE_SEATS; i++)
{
if(i >= MaxVehicleSeats[vehicletype-400])
continue;

GetVehicleSeatPos(vehicleid, i, x, y, z);

static const seat_name[][] =
{
"Водительское",
"Перед. пасс.",
"Зад. лев. пасс.",
"Зад. прав. пасс."
};

CreateDynamic3DTextLabel(seat_name[i], -1, x, y, z, 5.0);
}
}

SetPlayerPos(playerid, 2137.2124, -2493.8198-10.0, 13.5469);
return 1;
}

stock GetVehicleSeatPos(vehicleid, seatid, &Float:x, &Float:y, &Float:z)
{
switch(seatid)
{
case 0:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 1:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_FRONTSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 2:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x+seat_x/2.0-v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
case 3:
{
new Float:veh_pos_x;
new Float:veh_pos_y;
new Float:veh_pos_z;
GetVehiclePos(vehicleid, veh_pos_x, veh_pos_y, veh_pos_z);

new Float:v_wide;
new Float:buff;
new model = GetVehicleModel(vehicleid);
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_SIZE, v_wide, buff, buff);

new Float:seat_x;
new Float:seat_y;
new Float:seat_z;
GetVehicleModelInfo(model, VEHICLE_MODEL_INFO_REARSEAT, seat_x, seat_y, seat_z);

x = veh_pos_x-seat_x/2.0+v_wide/2.0;
y = veh_pos_y + seat_y;
z = veh_pos_z + seat_z;
return 1;
}
}
return 0;
}

stock GetNearestVehicleID(playerid, Float:radius = FLOAT_INFINITY)
{
new vehicleid = INVALID_VEHICLE_ID;

new Float: dist;
new Float: pos_x, Float: pos_y, Float: pos_z;

GetPlayerPos(playerid, pos_x, pos_y, pos_z);
for(new idx; idx < MAX_VEHICLES; idx ++)
{
if(!IsValidVehicle(idx)) continue;
if(!IsVehicleStreamedIn(idx, playerid)) continue;

dist = GetVehicleDistanceFromPoint(idx, pos_x, pos_y, pos_z);
if(dist < radius)
{
radius = dist,
vehicleid = idx;
}
}
return vehicleid;
}

В итоге на всё у меня ушло не больше 10 минут и знаний по тригонометрии я, при этом, применил ровно 0.

Единственное, что потребуется - это, скорее всего, написать отдельные формулы (точнее, продублировать и подредактировать текущие) для всякого специфического транспорта, по типу автобусов или самолётов (у одного из автобусов GetVehicleModelInfo либо не возвращает правильно координаты пассажирской двери, либо возвращает их под вторым или третьим ID, а написанный мной скрипт выведет только первые две. Так же с самолётами - GetVehicleModelInfo у некоторых самолётов вернёт позицию у начала крыльев, а не у дверей).

SteveStage
21.09.2020, 21:02
Я до сих пор не понимаю в чём сложность просто взять и протестировать работу функции GetVehicleModelInfo и работу тех твоих функций, а после скомпилировать из них то, что тебе нужно. Это не требует совершенно никаких знаний тригонометрии. Просто уделить пол часа тестам и методом тыка понять какие значения за какой отступ (на сколько и в какую сторону) отвечают.

Я хотел получить координаты конкретной двери, но такое возможно только при использовании тригонометрии.

DeimoS
22.09.2020, 04:21
Я хотел получить координаты конкретной двери, но такое возможно только при использовании тригонометрии.

Так код выше именно это и делает. Если даже у какого-то транспорта он не точно определяет положение - заводишь массив на 212 ячеек и расписываешь в нём для каждой конкретной модели отступы и приписываешь этот массив к формуле.

Повторюсь: то, что ты не знаешь тригонометрии, не значит, что нельзя обычным методом тыка понять какие числа за что отвечают в формуле. На это нужно просто пол часа-час выделить, если уж совсем представления не имеешь.
Не говоря уже о том, что, при желании, можно даже в тригонометрии разобраться самостоятельно.

SteveStage
24.09.2020, 03:05
Спасибо за разъяснение, ответ получен. Тему не закрывайте - будет время, сделаю исключения в формулах, о которых ты говорил (автобусы и самолеты), или кто-то успеет это сделать раньше меня - тогда он сюда выложит.