Ответ 1
Посмотрим, правильно ли я понимаю. Речь идет о ориентации твердого тела в трехмерном пространстве, подобно воздушной плоскости во время полета. Нос этого самолета указывает на вектор направления
D=(XD,YD,ZD) .
К крышу расположен вектор вверх
U=(XU,YU,ZU) .
Тогда заголовок H
будет вектором направления D
, проецируемым на поверхность земли:
H=(XD,YD,0) ,
с соответствующим углом
angle_H=atan2(YD,XD) .
Pitch P будет угол вверх/вниз носа относительно горизонта, если вектор направления D
нормализован, вы получите его от
ZD=sin(angle_P)
в результате чего
angle_P=asin(ZD) .
Наконец, для угла банка мы рассматриваем направление крыльев, полагая, что крылья перпендикулярны телу. Если плоскость летит прямо к D
, точки крыльев перпендикулярны к D
и параллельны земной поверхности:
W0 = ( -YD, XD, 0 )
Это будет угол в банке 0. Ожидаемый Up Vector будет перпендикулярен к 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) .
Из этого вы получите угол банка как
angle_B = atan2( Dot(W0,U) / Dot(U0,U) / abs(W0) * abs(U0) ) .
Нормирующие коэффициенты отменяют друг друга, если U
и D
нормированы.