PDA

Просмотр полной версии : [Вопрос] Полет камеры к актеру.



Skipter
07.12.2016, 19:12
Представим ситуацию. Я подошел к актеру, нажал на F(это пример) и камера сдвинулась так, что бы видно было только лицо и руки актера. Натолкните, пожалуйста, на решения проблемы.

DeimoS
08.12.2016, 00:55
Проверка расстояния до актёра + InterpolateCameraPos/InterpolateCameraLookAt?
Если актёры всегда на месте стоят и знания тригонометрии не позволяют, можно координаты вручную подобрать легко.

Skipter
08.12.2016, 15:30
Проверка расстояния до актёра + InterpolateCameraPos/InterpolateCameraLookAt?
Если актёры всегда на месте стоят и знания тригонометрии не позволяют, можно координаты вручную подобрать легко.

Актер стоит. Знания тригонометрии на нуле(именно в программировании, в жизни вроде нормально). C подбором координат надо будет день убить...

DeimoS
08.12.2016, 18:39
Актер стоит. Знания тригонометрии на нуле(именно в программировании, в жизни вроде нормально). C подбором координат надо будет день убить...

А тригонометрия в программировании как-то отличается от тригонометрии в жизни?
Ну так узнавай в каком направлении смотрит актёр через GetPlayerCameraFrontVector и выссчитывай положение для камеры

Skipter
08.12.2016, 18:58
А тригонометрия в программировании как-то отличается от тригонометрии в жизни?
Ну так узнавай в каком направлении смотрит актёр через GetPlayerCameraFrontVector и выссчитывай положение для камеры
Может будет проще через GetActorPos/GetPlayerPos? Камера смотрит в центр актера и чуть вперед актера даже если я поставлю -10, -20, -30.

GetActorPos(Actor[1], a_x, a_y, a_z);
GetPlayerPos(playerid, p_x, p_y, p_z);
InterpolateCameraPos(playerid, p_x, p_y, p_z, a_x, a_y, a_z, 1000);
InterpolateCameraLookAt(playerid, p_x, p_y, p_z, a_x, a_y-50, a_z, 1000);

DeimoS
08.12.2016, 19:48
Может будет проще через GetActorPos/GetPlayerPos? Камера смотрит в центр актера и чуть вперед актера даже если я поставлю -10, -20, -30.

GetActorPos(Actor[1], a_x, a_y, a_z);
GetPlayerPos(playerid, p_x, p_y, p_z);
InterpolateCameraPos(playerid, p_x, p_y, p_z, a_x, a_y, a_z, 1000);
InterpolateCameraLookAt(playerid, p_x, p_y, p_z, a_x, a_y-50, a_z, 1000);

z координату нужно менять.

Skipter
09.12.2016, 15:09
http://imgur.com/RFbuGU5
Поменял..

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

a_y-180, a_z+10
не поставлю y - смотрит влево.

DeimoS
09.12.2016, 15:25
Ну так подбери правильные смещения для координат и будет тебе счастье.

CMD:cam(playerid, params[])
{
new
Float:cam_pos_x,
Float:cam_pos_y,
Float:cam_pos_z;
sscanf(params, "p<,>F(0.0)F(0.0)F(0.0)", cam_pos_x, cam_pos_y, cam_pos_z);
GetActorPos(Actor[1], a_x, a_y, a_z);
GetPlayerPos(playerid, p_x, p_y, p_z);
InterpolateCameraPos(playerid, p_x, p_y, p_z, a_x, a_y, a_z, 1000);
InterpolateCameraLookAt(playerid, p_x, p_y, p_z, a_x+cam_pos_x, a_y+cam_pos_y, a_z+cam_pos_z, 1000);
}
И прямо в игре играйся с координатами

Skipter
09.12.2016, 15:34
Попробуем поиграться.

UPD:не добился нужного результата

Skipter
09.12.2016, 18:29
Есть еще варианты?

stock CameraToActor
(playerid, Float:px, Float:py, Float:pz, Float:ax, Float:ay, Float:az, Float:angle,time = 1000)
{
new
Float:fy,
Float:fz;

fy = ay - floatsin(angle, degrees);
fz = az + floatcos(angle, degrees);

InterpolateCameraPos(playerid, px, py, pz, ax, ay, az, time);
InterpolateCameraLookAt(playerid, px, py, pz, ax, ay-fy, az+fz, time);

return true;
}
Что не так сделал? Help...

Skipter
10.12.2016, 15:19
Вверх.

Nexius_Tailer
10.12.2016, 16:04
Есть еще варианты?

stock CameraToActor
(playerid, Float:px, Float:py, Float:pz, Float:ax, Float:ay, Float:az, Float:angle,time = 1000)
{
new
Float:fy,
Float:fz;

fy = ay - floatsin(angle, degrees);
fz = az + floatcos(angle, degrees);

InterpolateCameraPos(playerid, px, py, pz, ax, ay, az, time);
InterpolateCameraLookAt(playerid, px, py, pz, ax, ay-fy, az+fz, time);

return true;
}
Что не так сделал? Help...
Попробуй вот так:

stock CameraToActor(playerid, Float:px, Float:py, Float:pz, Float:ax, Float:ay, Float:az, Float:angle, time = 1000)
{
new Float:fx, Float:fy;

fx = ax - (2.0 * floatsin(-angle, degrees)); //2.0 - расстояние камеры от актёра, скорее всего с ним стоит поиграться
fy = ay - (2.0 * floatcos(-angle, degrees)); //Тоже самое

InterpolateCameraPos(playerid, px, py, pz, fx, fy, az, time);
InterpolateCameraLookAt(playerid, px, py, pz, ax, ay, az, time);

return 1;
}
Не проверял

Skipter
10.12.2016, 18:19
Работает! Практически так как надо.
http://imgur.com/a/mUvq3
1 скрин - твой скрипт + координата z;
2 скрин - как бы хотелось, возможно так реализовать?
Вчера пробовал вариант с cameditor'ом, что бы с помощью его вычесть конечную координату камеры, но почему то в виртуальном не работает.

Nexius_Tailer
10.12.2016, 18:59
Работает! Практически так как надо.
http://imgur.com/a/mUvq3
1 скрин - твой скрипт + координата z;
2 скрин - как бы хотелось, возможно так реализовать?
Вчера пробовал вариант с cameditor'ом, что бы с помощью его вычесть конечную координату камеры, но почему то в виртуальном не работает.
Ты скорее всего не ту координату z меняешь.

Пробуй вот так:

stock CameraToActor(playerid, Float:px, Float:py, Float:pz, Float:ax, Float:ay, Float:az, Float:angle, time = 1000)
{
new Float:fx, Float:fy;

fx = ax - (2.0 * floatsin(-angle, degrees)); //2.0 - расстояние камеры от актёра, скорее всего с ним стоит поиграться
fy = ay - (2.0 * floatcos(-angle, degrees)); //Тоже самое

InterpolateCameraPos(playerid, px, py, pz, fx, fy, az + 0.5, time); //То место, (!)откуда(!) игрок будет смотреть
InterpolateCameraLookAt(playerid, px, py, pz, ax, ay, az, time); //То место, (!)куда(!) игрок будет смотреть

return 1;
}

Там, где стоит 0.5, попробуй также немного изменять если что

Skipter
10.12.2016, 19:08
Камера смотрит вниз.

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

Nexius_Tailer
10.12.2016, 19:15
Ну так я ж говорю, поизменяй значение 0.5, например, на 0.3 или 0.1, или вовсе увеличь. Траектория, насколько видно, правильная, дело за малым.

Skipter
10.12.2016, 19:40
Всем спасибо. Проблема решена.