Учитывая начальную точку, углы в каждой оси вращения и направление, вычислить конечную точку
У меня есть начальная точка в трехмерных координатах, например (0,0,0).
У меня есть направление, на которое я указываю, представленное тремя углами - по одному для каждого угла поворота (поворот в X, поворот в Y, поворот в Z) (для примера предположим, что я одна из тех старых черепах с логотипом с ручкой) и расстояние, которое я пройду в направлении, на которое я указываю.Как я буду вычислять координаты конечной точки?
Я знаю, что для 2D-системы это было бы просто:
new_x = old_x + cos(angle) * distance
new_y = old_y + sin(angle) * distance
Но я не могу понять, как применить это к 3 измерениям
Я полагаю, что другой способ думать об этом-попытаться найти точку на поверхности сферы, зная направление, в котором вы указываете, и радиус сферы.3 ответа:
Основываясь на трех углах, вы должны построить матрицу вращения 3x3. Тогда каждый столбец матрицы представляет собой локальные направления x, y и Z. Если у вас есть локальное направление, по которому вы хотите двигаться, то умножьте вращение 3x3 с вектором направления, чтобы получить результат в глобальных координатах.
Я сделал небольшое вступление к 3D-преобразованиям координат, которое, я думаю, ответит на ваш вопрос.
3D координаты
Во-первых, для позиционирования точки в 3D вам нужно только два угла (так же, как вам нужен только один в 2D)
Во-вторых, по разным причинам (медленный cos&sin, карданный замок, ...) возможно, вы захотите сохранить направление в качестве вектора в первую очередь и избегать углов вместе.
В любом случае, предполагая, что направление первоначально выровнено по z, затем вращается вокруг оси x, а затем вращается вокруг оси Y.
X=x0 + расстояние * cos (angleZ) * sin (angleY)
Y=y0 + расстояние * sin (Anglez)
Z=z0 + расстояние * cos (angleZ) * cos (angleY)
Во-первых, странно иметь три угла для представления направления-двух было бы достаточно. Во-вторых, результат зависит от того, в каком порядке вы поворачиваетесь вокруг соответствующих осей. Вращения вокруг разных осей не коммутируют.
Возможно, вы просто ищете преобразование между сферическими и Декартовыми координатами.