Единство: поворот машины реалистично с заданной целью и направлением - PullRequest
0 голосов
/ 27 июня 2018

У меня есть CSV, который дает мне x,z координаты автомобиля с id в данный момент времени t в секундах. Ниже приведены данные для автомобиля с id=1 и его координатами в течение нескольких секунд. Первые три секунды машина останавливается. Затем он поворачивается влево и продолжается прямо еще несколько секунд.

В данный момент я рассчитываю направление на основе следующей позиции и поворачиваю машину, чтобы повернуть лицом к этому, но нет поворота к повороту, он просто движется прямо к следующей позиции:

Vector3 direction = (nextPosition - car.transform.position).normalized;
if(direction != Vector3.zero)
{
    Quaternion lookRotation = Quaternion.LookRotation(direction);
    float step = speed * Time.deltaTime;
    car.transform.rotation = Quaternion.Slerp(car.transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
}

Учитывая только эти точки, а именно две точки в 958 и 959, где происходит разворот, есть ли способ более реалистично выполнить разворот? Я знаю, что стандартный актив Unity CarController.cs имеет рулевое управление , но я не уверен, что смогу использовать это в своих интересах.

t,id,x,z
956,1,-1.50,232.39
957,1,-1.50,232.39
958,1,-1.50,232.39
959,1,-4.50,209.72
960,1,-4.50,193.05
961,1,-4.50,176.39

1 Ответ

0 голосов
/ 27 июня 2018

Как я отметил в своем ответе на предыдущий вопрос, хорошим первым приближением является вычисление средней скорости «в промежутке» между измерениями, наведение автомобиля в направлении средней скорости, и все готово.

Это не приводит к реалистичному движению, потому что, конечно, автомобили не мгновенно изменяют скорость. Скорее всего, к машине прикладывается сил , а силы ускоряют автомобиля в определенном направлении. (Обратите внимание, что замедление - это ускорение ; я не делаю различий между ускорением и замедлением.)

У вас есть позиция в каждую секунду, и вы знаете, как вычислять среднюю скорость в каждую секунду из предыдущего вопроса. Теперь вычислите среднее ускорение таким же образом. Мы знаем, что F = m a, поэтому, если масса автомобиля остается неизменной, то чистая сила, действующая на автомобиль, пропорциональна ускорению.

То, что вы можете сделать, это каждую секунду задавать себе вопрос: «Какое ускорение мне нужно было бы иметь в этот точный момент, чтобы добраться до следующей известной точки с известными положением и скоростью?» То есть: если бы я плавно ускорился по вектору ускорения, начиная с момента времени t, какой бы это вектор привел меня к моей известной позиции и средней скорости в момент времени t + 1?

Как только вы это узнаете, вы можете выполнить интерполяцию векторов скорости между секундами, и вы обнаружите, что кривые намного более плавные. Затем вы выполняете интерполяцию позиций таким же образом.

Они все еще не будут идеально гладкими из-за рывка ; то есть мгновенное изменение ускорения , которое люди воспринимают как резкое движение. Например, когда кто-то врезается в машину или вдруг поворачивается.

Чтобы сделать движение действительно плавным, вам нужно сделать еще один шаг вперед и проделать тот же трюк с ускорением . Выясните , какой рывок мне нужен каждую секунду, чтобы в следующую секунду достичь моей целевой позиции, скорости и ускорения .

Затем вы можете интерполировать положение, скорость и ускорение между секундами и получить хорошее плавное движение.

Это не единственный способ получить плавное движение от ряда точек, но это построение персонажа для этого. Можете ли вы придумать какие-либо другие методы для решения этой проблемы ?

(Кроме того, я отмечаю, что проблема не является значительно более сложной в любом количестве измерений. Вы можете сначала рассмотреть решение проблемы для одномерного движения, а затем расширить свое решение до двумерного движения.)

Давайте посмотрим на некоторые числа, и мы рассмотрим только цифру х.

Мы знаем, что в первые пару секунд позиция равна -1,5, а затем в следующую секунду она равна -4,5. Таким образом, средняя скорость и ускорение некоторое время были равны нулю, а затем средняя скорость составляла -3 за секунду. Поэтому ускорение было от нуля до -3, это разница -3, поэтому мы разгонялись на -3 метра в секунду в секунду.

Теперь давайте немного подумаем об этом.

Предположим, вы остановились и постоянно применяете силу, которая ускоряет вас на -3 метра в секунду в секунду. Просто через секунду вы будете идти -3 метра в секунду. Но где ты будешь ? Если вы мгновенно перешли с нуля на -3 м / с, то через секунду вы будете на расстоянии -3 метра, но мы больше не будем моделировать скорости как мгновенные! Вы будете на расстоянии -1,5 от начальной позиции, а не на -3.

Фактическое среднее необходимое вам ускорение -6. Среднее ускорение -6 за секунду увеличивает вашу скорость до -6 через одну секунду, но вы начали с нуля , и поэтому средняя скорость за эту секунду, как мы хочу -3. И это дает вам от -1,5 до -4,5 за одну секунду, что вам и нужно.

Итак: каковы тогда положение и скорость в момент времени 958,5 при постоянном ускорении -6 м / с / с, начиная с нулевой скорости? Как мы и ожидали, скорость равна -3, среднее значение должно быть примерно на полпути. И смена позиции - a Δt 2 / 2 (понимаете, почему?) Так что это -6 * 0,5 * 0,5 / 2, что составляет -0,75, четверть от -3, что мы собираюсь идти в эту секунду. Опять же, это должно иметь смысл: мы движемся медленнее в первой половине секунды, чем во второй половине секунды, поэтому мы должны быть на меньше половины пути к первой половине секунды.

Теперь сделайте то же самое, но для рывка. Если вы сделаете это, то обнаружите, что ваши движения действительно очень плавные.

Надеюсь, все это имеет смысл. Хороший вводный физический текст, вероятно, очень поможет здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...