Возьмем в самолет шар массой 30 кг. Я хочу, чтобы мяч подпрыгнул. Гравитация установлена на -10 в Unity или -1000 в Unreal.
В Unity я использую эту строку, чтобы мяч подпрыгивал: AddForce(Vector3.up * 9 * 30, ForceMode.Impulse)
. Мяч при прыжке поднимается на 4 метра.
В Unreal вместо этого я использую это: AddImpulse(FVector::UpVector * 900 * 30)
. Мяч при прыжке поднимается на 18 см.
В настоящее время я перехожу от Unity к Unreal, и мне хотелось бы знать, почему существует такая большая разница, даже если значения Unreal были умножены на 100, потому что Unreal указан в см.
Согласно моему тесту, мне нужно вызвать AddImpulse(FVector::UpVector * 4200 * 30)
, чтобы добиться такого же результата, то есть примерно в 4,5 раза больше силы.
Почему поведение не одинаково, даже если ценности одинаковы? Физические формулы не меняются и универсальны, не так ли? Я хочу знать, откуда такая разница.
Обратите внимание, что физические системы в игровых движках просто «имитируют» реальный мир. В большинстве случаев они допускают множество упрощений. Хотя обычно они стараются быть ближе к реальному миру. Хотя просто приведу два противоположных примера: в Unity «перетаскивание» — это всего лишь линейный фактор, на который не влияет CV или область атаки. Кроме того, Unity не сохраняет угловой момент, а только угловую скорость. Так что это не отражает того, как ведет себя реальный мир. Вы никогда не получите эффект теоремы о средней оси в Unity. Не могу говорить за Unreal.
Я никогда не использовал Unreal, поэтому не знаю, с какими модулями они на самом деле работают. Unity старается максимально приблизиться к реальному миру. Сила использует Ньютоны (кгм/с²), импульс использует кгм/с. Когда вы применяете импульсную силу в Unity, вы фактически просто добавляете определенное количество скорости (здесь я объяснил 4 различных режима силы в Unity).
Быстрый поиск в Google подтвердил, что Unreal обычно использует сантиметр в качестве базовой единицы, но, похоже, это не всегда так, поскольку в их собственных играх (Unreal Tournament) используется 2 см/единица. Поэтому я не знаю, как в Unreal работают единицы измерения, их преобразования и соглашения.
Предполагая упомянутые вами значения, в Unity, когда гравитация установлена на 10m/s²
, а вы, по сути, устанавливаете начальную скорость на 9m/s
(в результате вашей импульсной силы), мы получим время 0.9s
, пока не достигнем вершины. Пройденное расстояние будет 1/2*a*t²
, то есть 1/2 * 10m/s² * (0.9s)²
, что дает нам высоту 4.05m
. Таким образом, это кажется правильным, когда не применяется трение или сопротивление.
Как я уже сказал, я не знаком с Unreal, поэтому понятия не имею, как у вас получилось 18 см. Может быть, в Unreal применяется что-то вроде перетаскивания?
Вы можете добавить перетаскивание, но я установил его на своем шаре в Unreal равным 0. Так что да, это имеет смысл в Unity, но не имеет смысла в Unreal.
Я наконец нашел проблему. В Unreal общая масса актера — это сумма масс каждого компонента этого актера.
Поскольку на моем шаре были коллайдер и сетка, масса сферического коллайдера была установлена на 30, а масса сетки была рассчитана автоматически, поскольку я не переопределил это значение. Установив массу сетки равной 0, я теперь имею одинаковое поведение с обоими движками.
ОК, вы обнаружили, что вам нужны разные цифры... в чем здесь собственно вопрос?