Как работает Mathf.SmoothDamp?

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

Как работает Mathf.SmoothDamp?

Сообщение kaleka 12 окт 2017, 15:07

В общем такая проблема: требуется чтобы значение X изменялось от 0 до 5 в течение 3 секунд. По идее для этого я должен воспользоваться Mathf.SmoothDamp и если посмотреть мануал, то все очевидно. Но задав начальное значение, конечное значение и время за которое должен осуществиться переход я получаю совершено непредсказуемый результат, который не понятно как вообще получается (видео по ссылке). Может кто-нибудь объяснить по какому закону меняется значение ref currentVelocity? Можно ли сделать скорость постоянной?

Скрипт используемый в тесте:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {

        public float x;
        public float velocity;
        public float smoothTime;
        public float y;

        void Start () {

        }
       
        void Update () {
                x = Mathf.SmoothDamp (x, y, ref velocity, smoothTime);
        }
}



Ссылка на видео (изменение параметров отражено в инспекторе):
https://yadi.sk/i/p41946oD3Nh4Fy
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29

Re: Как работает Mathf.SmoothDamp?

Сообщение Tolking 12 окт 2017, 15:27

x = Mathf.SmoothDamp (x, y, ref velocity, smoothTime);

это не от 0 до 5 это от x до y... :)
ведет себя так же как lerp в аналогичной ситуации. Хотя написано все верно...

Попробуй вызывать с дельтатайм вариант (полный)

P.S. Или используй Lerp - он понятнее, хоть и немного менее удобный...
P.S. Постоянную скорость за кадр - прибавляй каждый кадр скорость за кадр. Постоянную скорость за секунду - прибавляй каждый кадр скорость за секунду умноженную на время кадра (Time.deltaTime)
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 1912
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как работает Mathf.SmoothDamp?

Сообщение kaleka 12 окт 2017, 16:36

Tolking писал(а):x = Mathf.SmoothDamp (x, y, ref velocity, smoothTime);

это не от 0 до 5 это от x до y... :)
ведет себя так же как lerp в аналогичной ситуации. Хотя написано все верно...

Попробуй вызывать с дельтатайм вариант (полный)

P.S. Или используй Lerp - он понятнее, хоть и немного менее удобный...
P.S. Постоянную скорость за кадр - прибавляй каждый кадр скорость за кадр. Постоянную скорость за секунду - прибавляй каждый кадр скорость за секунду умноженную на время кадра (Time.deltaTime)


Там на видео параметры в инспекторе заданы) x = 0, y = 5

Вопрос тогда как помощью Lerp осуществить задуманное, он вроде среднее значение считает между max и min?
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29

Re: Как работает Mathf.SmoothDamp?

Сообщение seaman 12 окт 2017, 17:03

среднее значение считает между max и min

Не среднее,а промежуточное.
как помощью Lerp осуществить задуманное

Читаем:
https://poqxert.ru/blog/unity/tutorials ... rpolyaczii
seaman
Адепт
 
Сообщения: 6943
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Мурманск

Re: Как работает Mathf.SmoothDamp?

Сообщение kaleka 12 окт 2017, 17:06

seaman писал(а):
среднее значение считает между max и min

Не среднее,а промежуточное.
как помощью Lerp осуществить задуманное

Читаем:
https://poqxert.ru/blog/unity/tutorials ... rpolyaczii


Я так понял что если мы задаем третий аргумент как Time.time (как в строчке ниже) то можно получить плавное изменение?
float _z = Mathf.Lerp(_startPos, _endPos, Time.time);
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29

Re: Как работает Mathf.SmoothDamp?

Сообщение Tolking 12 окт 2017, 17:09

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

        public float x;
        public float smoothTime;
        public float minX;
        public float maxX;

float t=0;
        void Start () {

        }
       
        void Update () {
t+=Time.deltaTime;
                x = Mathf.Lerp (MinX, MaxX, t/smoothTime);
        }
}

 


void Update () {
x = Mathf.Lerp (x, MaxX, Time.deltaTime+smoothTime);
}
- будет почти как твоем примере...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 1912
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как работает Mathf.SmoothDamp?

Сообщение kaleka 12 окт 2017, 17:11

Tolking писал(а):
Синтаксис:
Используется csharp
public class Test : MonoBehaviour {

        public float x;
        public float smoothTime;
        public float minX;
        public float maxX;

float t=0;
        void Start () {

        }
       
        void Update () {
t+=Time.deltaTime;
                x = Mathf.Lerp (MinX, MaxX, t/smoothTime);
        }
}

 


void Update () {
x = Mathf.Lerp (x, MaxX, Time.deltaTime+smoothTime);
}
- будет почти как твоем примере...

Просто все равно получается, что скорость изменения не постоянная, а вначале высокая а к приближению к таргету уменьшается. Думаю может тогда лучше MoveToward попробовать
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29


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

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

Сейчас этот форум просматривают: Google [Bot] и гости: 6