Как вы находите 3 угла эйлеров между двумя 3D-векторами? Когда у меня есть один Вектор, и я хочу получить его вращение, эта ссылка обычно может использоваться: Calculate rotations to look at a 3D point?
Но как это сделать при расчете их друг относительно друга?Угол Эйлера между двумя векторами 3d
ответ
Как уже указывалось другими, ваш вопрос следует пересмотреть. Назовем ваши векторы a
и b
. Я предполагаю, что length(a)==length(b) > 0
, иначе я не могу ответить на вопрос.
Вычислить cross product ваших векторов v = a x b
; v
указывает ось вращения. Вычислив dot product, вы можете получить косинус угла, вы должны вращаться с cos(angle)=dot(a,b)/(length(a)length(b))
, а с acos
вы можете однозначно определить угол (@Archie спасибо за указание моей более ранней ошибки). В этот момент у вас есть ось углового представления вашего вращения.
Остальная работа заключается в преобразовании этого представления в представление, которое вы ищете: углы Эйлера. Conversion Axis-Angle to Euler - это способ сделать это, как вы его нашли. Вы должны обрабатывать вырожденный случай, когда v = [ 0, 0, 0]
, то есть когда угол равен 0 или 180 градусов.
Я лично не люблю углы Эйлера, они ввернуть стабильность вашего приложения, и они не подходят для интерполяции, см также
Недостаточно перекрестного производства - он не будет различать углы 0 и 180 градусов. Вы должны вычислить как: cross, чтобы получить синус и скаляр, чтобы получить косинус, а затем использовать оба из них для вычисления угла (например, через функцию atan2() в C математической библиотеке). – Archie
Что вы думаете об этом методе: http: //www.euclideanspace.com/maths/geometry/rotations/conversions/angleToEuler/index.htm – tomyake
@Archie Да, правильно, исправлено. На самом деле достаточно точечного продукта и 'acos'. – Ali
Сначала вы должны были бы su btract вектор один из вектора два, чтобы получить вектор два относительно векторного. С помощью этих значений вы можете рассчитать углы Эйлера.
Чтобы понять расчет от вектора к Эйлеру интуитивно, представим сферу с радиусом 1 и началом в ее центре. Вектор представляет собой точку на ее поверхности в трехмерных координатах. Эта точка также может быть определена сферическими 2D-координатами: широта и долгота, шаг и рыскание соответственно.
Для «рулет < - шаг < - рыскание» Расчет может быть сделано следующим образом:
Для расчета рыскания вы вычислить тангенс двух плоских осей (х и г) с учетом квадранта.
yaw = atan2(x, z) *180.0/PI;
Шаг ровный, но поскольку его плоскость вращается вместе с рысканием, «смежный» находится на двух осях. Чтобы найти его длину, нам придется использовать теорему Пифагора.
float padj = sqrt(pow(x, 2) + pow(z, 2));
pitch = atan2(padj, y) *180.0/PI;
Примечание:
- Ролл не может быть вычислено как вектор не имеет вращения вокруг своей оси. Обычно я устанавливаю его на 0.
- Длина вашего вектора потеряна и не может быть преобразована обратно.
- В Эйлере порядок ваших осей имеет значение, смешивайте их, и вы получите разные результаты.
Получение матрицы вращения в MATLAB очень просто например.
A = [1.353553385, 0.200000003, 0.35]
B = [1 2 3]
[q] = vrrotvec(A,B)
Rot_mat = vrrotvec2mat(q)
Неверный ваш вопрос. Вам нужно три угла, если вы хотите выровнять два ** опорных кадра **. Если вам нужно только выровнять два вектора, тогда нужны только два угла. – 6502
Как вы вычисляете два угла? И как получилось, что формат файла BVH (http://davedub.co.uk/bvhacker/) имеет 3 угла для перемещения костей? – tomyake