Перемещение объекта по кривой при вращении

11

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

Представьте себе самолет, летящий к месту назначения. У него есть свой путь, которому он должен следовать, плюс он полностью регулирует свою скорость и ориентацию (курс, пробка, банк).

Могу ли я попросить информацию для запуска о следующем:

  • Какие кривые использовать для плавной интерполяции объекта
  • Какие формулы использовать для надежной интерполяции, где я мог бы контролировать скорость перемещения объекта, а переход между узлами кривой был бы плавным
  • Какую информацию следует экспортировать из приложения для создания 3D
  • Должен ли я использовать кватернионы slerp () для этого?

Если вы знаете о книге , которая охватывает эту тему эффективно , что бы hlep больше всего. Спасибо.

Bunkai.Satori
источник

Ответы:

7

Для кривой движения я бы предложил использовать кривые Эрмита. Вы просто задаете начальную точку / скорость и конечную точку / скорость, и это создает приятную и плавную кривую между этими двумя. Используйте конечную точку / скорость первой пары точек в качестве начальной точки / скорости следующей пары точек, и у вас получится хорошая длинная и извилистая кривая, которая является плавной.

Это отлично справляется с требованием управления скоростью: вы даете список точек во времени с выбранными вами скоростями, и это дает вам легко интерполированные значения положения и скорости. Если вы хотите пойти с этим, все, что вам нужно извлечь из приложения 3D-авторинга, это точки и скорости на желаемом пути. Вы также можете генерировать их во время выполнения, возможно, на основе пользовательского ввода.

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

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

Если вам нужны пользовательские ориентации, которые не имеют никакого отношения к пути, вы, конечно, можете предоставить для этого список кватернионов ориентации. Тогда ваши точки становятся (точка, скорость, кватернион). Затем вы можете использовать slerp между двумя последовательными кватернионами, чтобы установить свою ориентацию на этом пути. Не забывайте, что slerp - это метод линейной интерполяции. Тем не менее, это обычно должно быть хорошо. Если вы обнаружите, что повороты не достаточно гладкие в швах, вы можете попробовать интерполировать список кватернионов с кривой Безье, как описано здесь в разделе 7.

Вот некоторый исходный код, который может помочь вам начать. Он имеет ряд методов плавной интерполяции для списка кватернионов (отряд, Безье и т. Д.).

Дайте знать, если у вас появятся вопросы!

Газихан Аланкус
источник
+1 - Спасибо, ваш ответ в основном охватывает все. Он отвечает на все вопросы, которые я задавал, а также предоставляет дополнительные материалы для изучения. Теперь у меня достаточно материала для начала. Поэтому я не вижу причин, чтобы пометить это как принятый ответ .
Bunkai.Satori
@ Bunkai.Satori спасибо, рад помочь :) Я хотел бы увидеть, что вы создаете в конце.
Газихан Аланкус