Наведение камеры.

Программирование на Юнити.

Наведение камеры.

Сообщение Октав 14 авг 2023, 17:44

Задача следующего характера.
Рис1.
Есть игрок, который выпускает луч из точки P. Луч сталкивается с препятствием. Получаем точку A.
Так же есть камера, которая висит где то над игроком в позиции C. Камера наводится на точку столкновения луча с поверхностями.
На рисунке она наведена на точку А.

Рис2.
Игрок ели смещает свой луч вверх, луч пролетает над препятствием и сталкивается с новым. Получаем новую точку B.
Камера фокусируется на новой точке B.

Рис3.
Проблема в том что при наведении камеры на новую точку. Происходит резкий смена угла камеры.
Что приводит к страшным рывкам.
Необходимо чтобы камера переноводилась на новую точку плавно разгоняясь и плавно останавливаясь(по типу Vector3.SmoothDamp), независимо от расстояния на котором находится новая точка

Я пробовал решить задачу разными способами. Но пока чёт безуспешно. Или я тупил в четыре часа ночи или хз.
1)
Я пробовал интерполировать лерпом позицию фокуса в 3д пространстве.
2)
Из мыслей о том, что скорость перенаведения фокуса не должна зависеть от дистанции между А и B. Но скорость должна зависеть от дистанции проекций А и B на камеру
- пытался спроецировать точки на экран(рис4), потом их Vector2.SmoothDamp, потом пытался из полученной Vector2 точки сделать пространственную... Почти успех. но кривой, лагучий и дерганный, так что провал.
3)
Кватарнионы пока не трогал, но вроде там нет аналога SmoothDamp.

Чета я не попробовал сам Vector3.SmoothDamp применить к пространственным позициям, щас пока пишу вопрос понял...но хз получится или нет, что-то с него... хотя, по моему не то будет. Походу надо через экранные проекции интерполировать.


Какие у вас могут быть предложения?

Изображение
Последний раз редактировалось Октав 14 авг 2023, 18:00, всего редактировалось 1 раз.
Аватара пользователя
Октав
UNIверсал
 
Сообщения: 380
Зарегистрирован: 19 янв 2012, 22:02
Откуда: Красноярский край

Re: Наведение камеры.

Сообщение 1max1 14 авг 2023, 17:57

Расписал тут целое полотно, просто лерпай, да и все.

Синтаксис:
Используется csharp
public class ExampleClass : MonoBehaviour
{
    public Transform target;

    void Update()
    {
        Vector3 dir = target.position - transform.position;

        Quaternion end = Quaternion.LookRotation(dir, Vector3.up);

        transform.rotation = Quaternion.Lerp(transform.rotation, end, 3.0f * Time.deltaTime);
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Наведение камеры.

Сообщение Октав 14 авг 2023, 18:05

1max1 писал(а):Расписал тут целое полотно, просто лерпай, да и все.

Синтаксис:
Используется csharp
public class ExampleClass : MonoBehaviour
{
    public Transform target;

    void Update()
    {
        Vector3 dir = target.position - transform.position;

        Quaternion end = Quaternion.LookRotation(dir, Vector3.up);

        transform.rotation = Quaternion.Lerp(transform.rotation, end, 3.0f * Time.deltaTime);
    }
}


К сожалению ваш вариант приведет к рывкам. нет плавного разгона и плавного торможения. Я пробовал лерпать позицию фокуса. Думаю аналогично получится, если лерпать угол. Вернее у вас будет плавное торможение только. которое довольно сложно контролировать в сравнении со "смувдампом".
Я потому и расписал полотно.
Таргету порой приходится перескакивать по стопятсот раз по препятствиям. от "тут перед игроком" до "там на другом конце карты". без плавного разгона никак.
Я бы видео записал какой там дерганный расколбас получается если тупо лерпать. :D
Аватара пользователя
Октав
UNIверсал
 
Сообщения: 380
Зарегистрирован: 19 янв 2012, 22:02
Откуда: Красноярский край

Re: Наведение камеры.

Сообщение 1max1 14 авг 2023, 19:52

Попробуй это https://gist.github.com/maxattack/4c7b4 ... til-cs-L38
Но я думаю тут надо все же что-то свое лепить в зависимости от угла и текущей скорости.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Наведение камеры.

Сообщение Октав 14 авг 2023, 21:58

1max1 писал(а):Попробуй это https://gist.github.com/maxattack/4c7b4 ... til-cs-L38
Но я думаю тут надо все же что-то свое лепить в зависимости от угла и текущей скорости.


Спасибо большое. Я и не надеялся найти что-то подобное. Обязательно попробую.
Аватара пользователя
Октав
UNIверсал
 
Сообщения: 380
Зарегистрирован: 19 янв 2012, 22:02
Откуда: Красноярский край


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10