Имитация гравитации в Unity 3d

Хотел сделать собственную гравитацию и по идее надо ускоренние свободного падения умножить на дельта тайм чтобы получить дельта ускорение и применить к позиции обьекта и вроде правильно так как за 1 секунду скорость равна ускорению через 2 сек в два раза больше и т.д, но почему-то обьект улетает с очень высокой скорости по сравнению с гравитаций RigidBody (сопротивление воздуха установлено на 0) и это проблема решается повторным умножением на дельту времени и "искусственная" гравитация работает так же как и у Rigidbody. Почему надо умножать 2 раза на дельта тайм я не могу понять.

"Неправильный" код в методе FixedUpdate:

velocity += Physics.gravity * Time.deltaTime;
Rigidbody.MovePosition(transform.position + velocity);

"Правильный" код в методе FixedUpdate:

velocity += Physics.gravity * Time.deltaTime * Time.deltaTime;
Rigidbody.MovePosition(transform.position + velocity);

(На форуме впервые поэтому сильно не бейте пж)


Ответы (1 шт):

Автор решения: KadiWhite01

у нас есть:

  1. Ускорение свободного падения (обозначим G) т.е векторная величина равная (0; 9.81; 0).
  2. Текущая скорость, которая в моем случаем равна начальной т.е (0; 0; 0).
  3. Дельта времени, ее для краткости будем называть dT (deltaTime), равная времени прошедшему с предыдущего вызова Update (Можно так же сказать кадра, думаю сейчас это не критично).

Формула получения скорости при равноускоренном движении.

V(текущая) = V(начальная) + G * t

G равна 9.81 м/c^2 т.е. наша скорость изменяется на -9.81 м/c по y за 1 секунду, так как dT как правило очень редко равна ровно 1 сек надо G * dT что бы получить дельта ускорение (dG) в данный момент времени.

V(текущая) = V(начальная) + dG * t

В моем случаем начальная скорость равна нулю по всем осям, значит

V(текущая) = dG * t

И чтобы получить скорость надо умножить dG на t, а t у нас равна dT значит можно записать формулу так

V(текущая) = G * dT * dT = G * dT^2

Вот и ответ

→ Ссылка