Формулы drag-а в Rigidbody

Общие вопросы о Unity3D

Формулы drag-а в Rigidbody

Сообщение VBProgr 28 мар 2012, 17:21

Кто-нибудь знает, как именно Drag влияет на скорость? Я хочу иметь возможность предсказывать скорость объекта через несколько секунд.

В документации юнити сказано только то, что в сабже используется обратная пропорция.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Формулы drag-а в Rigidbody

Сообщение VBProgr 28 мар 2012, 20:56

Я провел несколько тестов. В последних скобках - magnitude.

При 0.1 скорость умножается на 0.9. Вроде бы - вот оно решение. Но с увеличением drag правило перестает работать. В любом случае соотношение предыдущего результата к следующему в каждом примере - константа.

Скрытый текст:
Drag: 0
Second: 0, velocity: (1.0, 1.0, 1.0)(1.732051)
Second: 1, velocity: (1.0, 1.0, 1.0)(1.732051)

UnityEngine.Debug:Log(Object)
Test:OnDestroy() (at Assets/Test.cs:34)

Drag: 0.1
Second: 0, velocity: (1.0, 1.0, 1.0)(1.732051)
Second: 1, velocity: (0.9, 0.9, 0.9)(1.567068)
Second: 2, velocity: (0.8, 0.8, 0.8)(1.4178)
Second: 3, velocity: (0.7, 0.7, 0.7)(1.28275)
Second: 4, velocity: (0.7, 0.7, 0.7)(1.160564)
Second: 5, velocity: (0.6, 0.6, 0.6)(1.050016)
Second: 6, velocity: (0.5, 0.5, 0.5)(0.949999)
Second: 7, velocity: (0.5, 0.5, 0.5)(0.8595083)
Second: 8, velocity: (0.4, 0.4, 0.4)(0.7776374)
Second: 9, velocity: (0.4, 0.4, 0.4)(0.7035649)
Second: 10, velocity: (0.4, 0.4, 0.4)(0.6365483)
Second: 11, velocity: (0.3, 0.3, 0.3)(0.575915)
Second: 12, velocity: (0.3, 0.3, 0.3)(0.5210574)
Second: 13, velocity: (0.3, 0.3, 0.3)(0.4714249)
Second: 14, velocity: (0.2, 0.2, 0.2)(0.4265202)
Second: 15, velocity: (0.2, 0.2, 0.2)(0.3858928)
Second: 16, velocity: (0.2, 0.2, 0.2)(0.3491353)
Second: 17, velocity: (0.2, 0.2, 0.2)(0.315879)
Second: 18, velocity: (0.2, 0.2, 0.2)(0.2857905)
Second: 19, velocity: (0.1, 0.1, 0.1)(0.258568)
Second: 20, velocity: (0.1, 0.1, 0.1)(0.2339386)
Second: 21, velocity: (0.1, 0.1, 0.1)(0.2116552)
Second: 22, velocity: (0.1, 0.1, 0.1)(0.1914943)

UnityEngine.Debug:Log(Object)
Test:OnDestroy() (at Assets/Test.cs:34)

Drag: 0.5
Second: 0, velocity: (1.0, 1.0, 1.0)(1.732051)
Second: 1, velocity: (0.6, 0.6, 0.6)(1.047901)
Second: 2, velocity: (0.4, 0.4, 0.4)(0.6339865)
Second: 3, velocity: (0.2, 0.2, 0.2)(0.3835658)
Second: 4, velocity: (0.1, 0.1, 0.1)(0.2320596)
Second: 5, velocity: (0.1, 0.1, 0.1)(0.1403974)
Second: 6, velocity: (0.0, 0.0, 0.0)(0.08494128)
Second: 7, velocity: (0.0, 0.0, 0.0)(0.05138998)

UnityEngine.Debug:Log(Object)
Test:OnDestroy() (at Assets/Test.cs:34)


Drag: 1
Second: 0, velocity: (1.0, 1.0, 1.0)(1.732051)
Second: 1, velocity: (0.4, 0.4, 0.4)(0.6307606)
Second: 2, velocity: (0.1, 0.1, 0.1)(0.2297038)
Second: 3, velocity: (0.0, 0.0, 0.0)(0.08365119)
Second: 4, velocity: (0.0, 0.0, 0.0)(0.03046323)
Second: 5, velocity: (0.0, 0.0, 0.0)(0.01109379)
Second: 6, velocity: (0.0, 0.0, 0.0)(0)

UnityEngine.Debug:Log(Object)
Test:OnDestroy() (at Assets/Test.cs:34)

Drag: 2
Second: 0, velocity: (1.0, 1.0, 1.0)(1.732051)
Second: 1, velocity: (0.1, 0.1, 0.1)(0.2249688)
Second: 2, velocity: (0.0, 0.0, 0.0)(0.02922025)
Second: 3, velocity: (0.0, 0.0, 0.0)(0)

UnityEngine.Debug:Log(Object)
Test:OnDestroy() (at Assets/Test.cs:34)


Drag: 10
Second: 0, velocity: (1.0, 1.0, 1.0)(1.732051)
Second: 1, velocity: (0.0, 0.0, 0.0)(0)

UnityEngine.Debug:Log(Object)
Test:OnDestroy() (at Assets/Test.cs:34)
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Формулы drag-а в Rigidbody

Сообщение VBProgr 28 мар 2012, 21:20

Неужели никто не знает?

Если округлить...
параметр t = 0.1, аргумент x = 1.732051, результат 1.567068
вроде бы y = x(1-t)
НО
Параметр t = 0.5, аргумент x = 1.732051, результат 1.047901
т.е. x умножается на 0.6 - формула выше не верна.

Так что это может быть за функция?
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Формулы drag-а в Rigidbody

Сообщение Syberex 29 мар 2012, 09:24

Ну если написано, что пропорция - наверно должна быть пропорция :-?

Может так:

Синтаксис:
Используется javascript
скорость          расстояние
----------   =   --------------
 drag               время


Собственно говоря, просто в формулу 3го класса добавляем корректирующий коэффициет drag ... сопротивление воздуха вроде как?
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Формулы drag-а в Rigidbody

Сообщение VBProgr 29 мар 2012, 15:57

Решение для расчета новой скорости через секунду, полученное методом перебора: newVelocity = (1/(drag^1.2904+0.8787)-0.17060) * oldVelocity

Погрешность 0.0039.

Чтобы получить для 100 мс извлекаем из (1/(drag^1.2904+0.8787)-0.17060) корень десятой степени.

Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public Program()
        {
            float m = -2;
            while (m <= 2)
            {
                float n = -2;
                while (n <= 2)
                {
                    float p = -2;
                    while (p <= 2)
                    {
                        p += 0.01f;
                        check(m,n,p);
                    }
                    n += 0.01f;
                }
                m += 0.01f;
            }
        }

        void check(float m, float n, float p)
        {
            /*x=0.1 y=0.9
            x=0.5 y=0.6
            x=1 y=0,36
            x=2 y=0.129*/

            if (approx(1 / (Math.Pow(0.1, m) + n) + p, 0.904))
            {
                if (approx(1 / (Math.Pow(0.5, m) + n) + p, 0.6050))
                {
                    if (approx(1 / (Math.Pow(1, m) + n) + p, 0.3641))
                    {
                        if (approx(1 / (Math.Pow(2, m) + n) + p, 0.1298))
                        {
                            Console.WriteLine(m + " " + n + " " + p);
                        }
                    }
                }
            }
        }

        bool approx(double a, double b)
        {
            return (Math.Abs(a - b) < 0.005);
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Processing");
            new Program();
            Console.ReadLine();
        }
    }
}
 
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Формулы drag-а в Rigidbody

Сообщение Syberex 29 мар 2012, 23:30

VBProgr писал(а):Решение для расчета новой скорости через секунду, полученное методом перебора: newVelocity = (1/(drag^1.2904+0.8787)-0.17060) * oldVelocity

Получается новая скорость зависит только от старой скорости?
А как же ускорение?
В исследуемом случае скорость только уменьшается?
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Формулы drag-а в Rigidbody

Сообщение VBProgr 30 мар 2012, 15:44

Да, только от старой скорости. И не зависит от массы.

Под ускорением Вы подразумеваете ForceMode.Acceleration? Если нет, то все просто - добавляете к новой скорости ваше ускорение. Новую скорость придется пересчитывать каждый раз, когда Вы добавляете ускорение.

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

Или Вы имеете в виду ускорение свободного падения? Тогда, если, к примеру, ускорение добавляется 10 раз в секунду, делим 9,8 на 10 и каждые 100 мс пересчитываем новую скорость с учетом драга + прибавляем ускорение.

Отдельного параметра "ускорение" в rigidbody нет. Гравитация реализуется теми же функциями AddForce и т.п., т.е. изменением скорости.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: Формулы drag-а в Rigidbody

Сообщение Syberex 31 мар 2012, 08:16

VBProgr писал(а):Под ускорением Вы подразумеваете ForceMode.Acceleration? Если нет, то все просто - добавляете к новой скорости ваше ускорение. Новую скорость придется пересчитывать каждый раз, когда Вы добавляете ускорение.

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

Примерно это, спасибо :ymapplause:
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Формулы drag-а в Rigidbody

Сообщение Nialit 14 мар 2013, 01:22

После долгих стараний в поту лица, вывел формулу для определения зависимости: 1.Предельной скорости Rigidbody от приложенной силы(Force) и drag
2.Обратная зависимость Force и Drag от предельной скорости rigidbody
3.Формула расчета ускорения rigidbody в зависимости от текущей скорости(rigidbody.velocity), прикладываемой силы (Force) и drag.

Текущая скорость = rigidbody.velocity
Предельная скорость rigidbody = maxspeed
Прикладываемая сила = move_force
Лобовое сопротивление(drag) = drag
time.deltatime = 0.01
1. maxspeed = move_force*(1-time.deltatime*drag)/drag
30*(1-0.98)/2 = 14.7 При приложении силы в 30 м/с^2(по сути - ускорение) и drag =2 получим макс. развиваемую скорость 14.7 м/с
2. (drag*maxspeed)/(1-time.deltatime*drag) = move_force
2*14.7/(1-0.98) =30
Для движение со скоростью 14.7 м/с при drag = 2 нужно прикладывать силу 30...
3. (maxspeed-rigidbody.velocity)*maxspeed/move_force*time.deltatime= ускорение(delta изменения скорости в текущий кадр)
(14,7-10)/14,7)*14,7/30*0,01 = 0,001566 Ускорение движения тела с прилагаемой силой 30, макс. скоростью движений 14.7 , текущей скоростью движения 10, дельтой кадра 0.01 и drag = 2 равно 0,001566; Т.е разница скоростей текущего кадра и предыдущего равна 0,001566.

Был очень удивлен, что нигде(ни здесь, ни на англ. коммьюнити, ни в документации) не нашел этих формул, хотя мне они оказались необходимыми.
Успехов!
Nialit
UNец
 
Сообщения: 25
Зарегистрирован: 21 янв 2013, 04:11


Вернуться в Общие вопросы

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

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