Имитация гравитации в 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 шт):
у нас есть:
- Ускорение свободного падения (обозначим G) т.е векторная величина равная (0; 9.81; 0).
- Текущая скорость, которая в моем случаем равна начальной т.е (0; 0; 0).
- Дельта времени, ее для краткости будем называть 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
Вот и ответ