Godot 3.2.1 - 3D-наведение ракет с ограничениями угловой скорости

Кто-нибудь знает, как сделать что-то вроде 3D-наведения ракеты в Godot 3.2, которое позволяет ограничивать угловую скорость? Все, что я нашел в Интернете, использует что-то вроде global_transform = global_transform.look_at(aTarget.global_transform.origin). Однако это мгновенно поворачивает преобразование, что очень нереально. Я также видел несколько упоминаний об использовании класса Quat, где вы затем используете aQuatFrom.slerp(aQuatTo,aAmount); однако у меня это тоже не сработало (хотя, может, я просто что-то не понимаю?).

Давайте просто скажем, ради этого разговора, что существует Missile.gd файл, который содержит по крайней мере следующие элементы данных, которые инициализируются при создании экземпляра:

extends KinematicBody
var _velocity : Vector3
var _speed : float
var _max_angle_rate : float
var _target : Object

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

На данный момент большая часть борьбы состоит только в том, как изменить данные, которые мне нужно изменить. Я могу заниматься векторной математикой, но не могу получить нужные мне данные из Godot. Я не совсем знаком с Quaternions, так что, возможно, там есть решение, которое мне не хватает, я не уверен. Тем не менее, я думаю, что на данный момент достаточно решения для чистого наведения на преследование (то есть просто наведения на цель). Как только я получу это, я смогу работать над реализацией других алгоритмов наведения.

Спасибо за любую / всю помощь!


person sn8ze    schedule 30.07.2020    source источник


Ответы (1)


Кватернионы действительно полезны для такой работы.

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


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

person LaGoutte    schedule 05.11.2020