Для кривой движения я бы предложил использовать кривые Эрмита. Вы просто задаете начальную точку / скорость и конечную точку / скорость, и это создает приятную и плавную кривую между этими двумя. Используйте конечную точку / скорость первой пары точек в качестве начальной точки / скорости следующей пары точек, и у вас получится хорошая длинная и извилистая кривая, которая является плавной.
Это отлично справляется с требованием управления скоростью: вы даете список точек во времени с выбранными вами скоростями, и это дает вам легко интерполированные значения положения и скорости. Если вы хотите пойти с этим, все, что вам нужно извлечь из приложения 3D-авторинга, это точки и скорости на желаемом пути. Вы также можете генерировать их во время выполнения, возможно, на основе пользовательского ввода.
Чтобы настроить ориентацию, у вас есть несколько вариантов. Если самолет всегда будет указывать туда, куда он летит (что имеет смысл), вы можете использовать интерполированный вектор скорости от кривой Эрмита, чтобы определить, куда должен направить ваш корабль. Если вам известен вектор вверх (он движется в плоскости, или вы знаете, какое направление должно быть вверх), вы можете рассчитать третью ось по кресту (спереди, вверх) и там у вас есть ориентация.
Если вы хотите как-то «шаткую» ориентацию, чтобы плоскость иногда отклонялась от переднего направления на траектории, вы можете использовать переднее направление в качестве желаемого направления и последовательно выполнить одностадийный шаг между текущей ориентацией и желаемой ориентацией.
Если вам нужны пользовательские ориентации, которые не имеют никакого отношения к пути, вы, конечно, можете предоставить для этого список кватернионов ориентации. Тогда ваши точки становятся (точка, скорость, кватернион). Затем вы можете использовать slerp между двумя последовательными кватернионами, чтобы установить свою ориентацию на этом пути. Не забывайте, что slerp - это метод линейной интерполяции. Тем не менее, это обычно должно быть хорошо. Если вы обнаружите, что повороты не достаточно гладкие в швах, вы можете попробовать интерполировать список кватернионов с кривой Безье, как описано здесь в разделе 7.
Вот некоторый исходный код, который может помочь вам начать. Он имеет ряд методов плавной интерполяции для списка кватернионов (отряд, Безье и т. Д.).
Дайте знать, если у вас появятся вопросы!