Посмотрим, правильно ли я понял. Речь идет об ориентации твердого тела в трехмерном пространстве, как самолет во время полета. Носовая часть самолета указывает на вектор направления.
D=(XD,YD,ZD) .
В сторону крыши - вектор вверх.
U=(XU,YU,ZU) .
Тогда заголовок H
будет вектором направления D
, спроецированным на поверхность земли:
H=(XD,YD,0) ,
с соответствующим углом
angle_H=atan2(YD,XD) .
Шаг P будет углом носа вверх / вниз по отношению к горизонту, если вектор направления D
нормализован, вы получите его из
ZD=sin(angle_P)
в результате чего
angle_P=asin(ZD) .
Наконец, для угла крена мы рассматриваем направление крыльев, предполагая, что крылья перпендикулярны телу. Если самолет летит прямо в сторону D
, крылья будут указывать перпендикулярно D
и параллельно поверхности земли:
W0 = ( -YD, XD, 0 )
Это будет угол крена 0. Ожидаемый вектор вверх будет перпендикулярен W0
и перпендикулярен D
.
U0 = W0 × D
где ×
обозначает перекрестное произведение. U
равняется U0
, если угол крена равен нулю, в противном случае угол между U
и U0
является углом крена angle_B
, который можно рассчитать из
cos(angle_B) = Dot(U0,U) / abs(U0) / abs(U)
sin(angle_B) = Dot(W0,U) / abs(W0) / abs(U) .
Здесь abs вычисляет длину вектора. Отсюда вы получаете угол крена как
angle_B = atan2( Dot(W0,U) / abs(W0), Dot(U0,U) / abs(U0) ) .
Коэффициенты нормализации компенсируют друг друга, если U
и D
нормализованы.
person
pentadecagon
schedule
07.02.2014