PDA

Просмотр полной версии : [Вопрос] Геометрия



Pro_Coder
20.11.2020, 22:40
Есть у меня позиции камеры, вычитал от позиции транспорта результат, записал в массив


new Float:CameraPos[][] = {
{-4.7698, 2.5694, 1.1252},
//...
};

new Float:CameraLookAt[][] = {
{-3.8702, 2.1644, 0.9622},
//...
};

Но позицию z не составило труда настроить, но не могу сделать X и Y, пробовал куча вариантов, не могу найти общую формулу

new
Float:x, Float:y, Float:z,
Float:a;

GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, a);

new
Float:sin, Float:cos;

sin = x + floatmul(6.0, floatsin(-a, degrees)));
cos = y + floatmul(6.0, floatcos(-a, degrees)));
SetPlayerCameraPos(playerid, sin, cos, z + CameraPos[0][2]);

sin = x + floatmul(6.0, floatsin(-a, degrees)));
cos = y + floatmul(6.0, floatcos(-a, degrees)));
SetPlayerCameraLookAt(playerid, sin, cos, z + CameraLookAt[0][2]);

tnc
20.11.2020, 23:09
Что ты пытаешься сделать?

Pro_Coder
20.11.2020, 23:17
Тюнинг, я не хочу так сказать фризить, или еще какие-то палки совать, для того чтобы транспорт был на месте. А транспорт может находиться в любом месте, под разным углом. Но так вот, я перебрал координаты спойлер/нитро/колес и т.д. Нужно сделать так, чтобы камера направлялась строго что ты выбрал

Pro_Coder
21.11.2020, 16:13
Актуально

Seviel
21.11.2020, 16:18
SetPlayerCameraPos - Это координаты где находится камера.
SetPlayerCameraLookAt - Это куда камера будет смотреть.

Логично предположить что SetPlayerCameraLookAt должно быть на машине или как минимум ближе к машине, но у тебя выходит что точка где стоит и куда смотри одна и та же, разница только в высоте.


new
Float:x, Float:y, Float:z,
Float:a;

GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, a);

new
Float:sin, Float:cos;

sin = x + floatmul(6.0, floatsin(-a, degrees)));
cos = y + floatmul(6.0, floatcos(-a, degrees)));
SetPlayerCameraPos(playerid, sin, cos, z + CameraPos[0][2]);

sin = x + floatmul(2.0, floatsin(-a, degrees)));
cos = y + floatmul(2.0, floatcos(-a, degrees)));
SetPlayerCameraLookAt(playerid, sin, cos, z + CameraLookAt[0][2]);


Быть может так лучше будет.

Pro_Coder
21.11.2020, 18:18
Ну, у меня есть массив, там либо + либо -, этого массива. И камера должна смотреть на колеса

new Float:CameraPos[][] = {
{-4.7698, 2.5694, 1.1252},
{0.6505, -3.3885, 1.4342},
{-4.0018, 0.2082, 1.5372},
{-3.8669, 0.5210, 1.2432},
{-1.8699, -2.5420, -0.2812},
{-4.9251, 0.2344, 0.3112},
{5.0598, -0.0140, 2.0302},
{4.3737, -1.6269, -0.4192},
{-3.0984, -2.5757, -0.6432},
{-4.7698, 2.5694, 1.1252},
{-4.7698, 2.5694, 1.1252},
{-5.9244, 0.5147, 0.7882},
{3.9429, -1.4952, -0.3412},
{-4.0018, 0.2082, 1.5372},
{-4.0018, 0.2082, 1.5372}
};

new Float:CameraLookAt[][] = {
{-3.8702, 2.1644, 0.9622},
{0.9439, -2.4900, 1.1082},
{-3.1307, 0.2046, 1.0462},
{-2.8896, 0.4686, 1.0382},
{-1.2975, -1.7426, -0.4632},
{-3.9700, 0.3695, 0.0472},
{4.2290, -0.0175, 1.4732},
{3.5108, -1.1304, -0.3252},
{-2.5562, -1.7382, -0.5762},
{-3.8702, 2.1644, 0.9622},
{-3.8702, 2.1644, 0.9622},
{-4.9338, 0.4929, 0.6532},
{3.0538, -1.0500, -0.4462},
{-3.1307, 0.2046, 1.0462},
{-3.1307, 0.2046, 1.0462}
};

Вот весь массив компонентов, колеса, спойлер и т.д. Нужно так. если ты по индексу колес обращаешься, то камера соответственно смотрит на колесса. Этим я делаю динамическую так сказать камеру

Pro_Coder
22.11.2020, 14:00
Не вздумайте кидать тему в архив, еще актуально

Seviel
22.11.2020, 21:15
Ну, у меня есть массив, там либо + либо -, этого массива. И камера должна смотреть на колеса

new Float:CameraPos[][] = {
{-4.7698, 2.5694, 1.1252},
{0.6505, -3.3885, 1.4342},
{-4.0018, 0.2082, 1.5372},
{-3.8669, 0.5210, 1.2432},
{-1.8699, -2.5420, -0.2812},
{-4.9251, 0.2344, 0.3112},
{5.0598, -0.0140, 2.0302},
{4.3737, -1.6269, -0.4192},
{-3.0984, -2.5757, -0.6432},
{-4.7698, 2.5694, 1.1252},
{-4.7698, 2.5694, 1.1252},
{-5.9244, 0.5147, 0.7882},
{3.9429, -1.4952, -0.3412},
{-4.0018, 0.2082, 1.5372},
{-4.0018, 0.2082, 1.5372}
};

new Float:CameraLookAt[][] = {
{-3.8702, 2.1644, 0.9622},
{0.9439, -2.4900, 1.1082},
{-3.1307, 0.2046, 1.0462},
{-2.8896, 0.4686, 1.0382},
{-1.2975, -1.7426, -0.4632},
{-3.9700, 0.3695, 0.0472},
{4.2290, -0.0175, 1.4732},
{3.5108, -1.1304, -0.3252},
{-2.5562, -1.7382, -0.5762},
{-3.8702, 2.1644, 0.9622},
{-3.8702, 2.1644, 0.9622},
{-4.9338, 0.4929, 0.6532},
{3.0538, -1.0500, -0.4462},
{-3.1307, 0.2046, 1.0462},
{-3.1307, 0.2046, 1.0462}
};

Вот весь массив компонентов, колеса, спойлер и т.д. Нужно так. если ты по индексу колес обращаешься, то камера соответственно смотрит на колесса. Этим я делаю динамическую так сказать камеру

Это массив со смещением?

Так ты хочешь чтобы в "любом" месте можно было настроить камеру относительно т/с? Тогда тебе нужно шесть чисел:
1. Угол поворота для камеры(не для самой камеры, а для того чтобы относительно тс можно было бы получить точку где должна быть камера)
2. На каком расстоянии должна быть камера.
3. Относительная высота камеры
4. Угол поворота для того места на которое должна смотреть камера.
5. На каком расстоянии должна быть точка на которую смотрит камера.
6. Относительная высота точки куда смотрит камера


enum CAM_INFO
{
Float:CAM_POS_ANGLE,
Float:CAM_POS_DISTANCE,
Float:CAM_POS_HEIGHT,
Float:CAM_LOOK_AT_ANGLE,
Float:CAM_LOOK_AT_DISTANCE,
Float:CAM_LOOK_AT_HEIGHT
}
new CamInfo[40][CAM_INFO] = {
{90.0, 5.0, 1.0, 90.0, 1.0, 0.0}
};

ShowPlayerDialog(playerid, 37, DIALOG_STYLE_LIST, "Test", "Вид с боку", "Выбрать", "Закрыть");

if(dialogid == 37)
{
new
Float:x, Float:y, Float:z,
Float:a;

GetVehiclePos(vehicleid, x, y, z);
GetVehicleZAngle(vehicleid, a);

new
Float:sin, Float:cos;

sin = x + floatmul(CamInfo[listitem][CAM_POS_DISTANCE], floatsin(CamInfo[listitem][CAM_POS_ANGLE] + a, degrees)));
cos = y + floatmul(CamInfo[listitem][CAM_POS_DISTANCE], floatcos(CamInfo[listitem][CAM_POS_ANGLE] + a, degrees)));
SetPlayerCameraPos(playerid, sin, cos, z + CamInfo[listitem][CAM_POS_HEIGHT]);

sin = x + floatmul(CamInfo[listitem][CAM_LOOK_AT_DISTANCE], floatsin(CamInfo[listitem][CAM_LOOK_AT_ANGLE]+ a, degrees)));
cos = y + floatmul(CamInfo[listitem][CAM_LOOK_AT_DISTANCE], floatcos(CamInfo[listitem][CAM_LOOK_AT_ANGLE]+ a, degrees)));
SetPlayerCameraLookAt(playerid, sin, cos, z + CamInfo[listitem][CAM_POS_HEIGHT]);
}


Если же ты в том массиве хранишь относительные координаты, то они будут некоректные для разных уголов поворота машины.

Pro_Coder
23.11.2020, 02:13
Решил, расставил индивидуально углы. Тему можно закрыть