Stefan_Lang
Во-первых, ваша ось y должна указывать на экран, иначе у вас не будет правой системы координат, и это может испортить ваши формулы при адаптации заданного алгоритма, такого как тот, который связан с решением 1.
Во-вторых, вашей информации недостаточно для определения угла крена: он может быть любым.
В-третьих, алгоритм в псевдокоде выглядит примерно так:
Перемещение из одной точки в другую дает вам направление. он определяется вектором V
вы получаете, вычитая две точки.
V := (v1, v2, v3) = (x2, y2, z2) - (x1, y1, z1) = (x2-x1, y2- y1, z2- z1)
Угол рыскания - это угол, который этот вектор охватывает с проекцией VP того же вектора с горизонтальной плоскостью. Вы можете получить этот вектор, просто установив z-координату в 0.
VP := (v1, v2, 0)
Чтобы вычислить угол рыскания, воспользуйтесь тем фактом, что скалярное произведение двух векторов приравнивает произведение их соответствующих длин и косинус заключенного угла, в данном случае:
V*VP = |V|*|VP|*cos(yaw)
Исходя из этого, вы получаете:
yaw := acos ( V*VP/(|V|*|VP|) )
Тангаж-это угол, который VP охватывает плоскостью y-Z. Вы можете получить его таким же образом, сначала проецируя
VP
в плоскость y-Z...
VPP := (0, v2, 0)
... а затем вычислите угол, заключенный между
VPP
и
VP
:
pitch = acos( VP*VPP / (|VP|*|VPP|) )
Что вам остается сделать, так это поместить это в код C/C++ и реализовать функции для вычисления скалярного произведения
v1*v2
из двух векторов
v1
и
v2
, и длина
|v|
заданного вектора
v
.