Если вы хотите понять функцию vrrotvec2mat
, вам необходимо знать, как работают осевые углы вращения, прежде чем мы углубимся в эту функцию. В частности, вы понимаете значение Rodrigues Rotation formula, которое также называется формулой с поворотным углом поворота. Я объясню это вам с некоторым введением.
В линейной алгебре, наиболее стандартным способом, чтобы повернуть точку, будь то 2D или 3D является использование rotation matrix где вы предварительно многократно (т.е. y = A*x
где x
ваша точка представлена в вектор-столбец) 2D-или 3D координаты с этой матрицей вращения. Это вращает точку вокруг начала координат. Вы можете также думать об этом как о повороте вектора v
, где хвост находится в начале координат, а голова находится в точке в 2D или 3D пространстве.
Однако, еще один способ сделать это - предоставить то, что известно как ось-угол, действительное только в трехмерном пространстве. Ось описывается единичным вектором k
, который описывает ось вращения, вокруг которой вектор v
вращается на угол вокруг этой оси на right-hand rule.
Вот наглядный пример, который я получил из Википедии:
Источник: Rodrigues' Rotation formula
Вектора k
в нашем случае направлен прямо вверх, а вектор v
указует на 45 степень угол северо-запад. Мы хотим повернуть этот вектор на угол 180 градусов вокруг оси, определяемой вектором k
, и поэтому, если вы сделаете это, vrot
будет результирующим вектором. v||
и v_|_
- это параллельные и перпендикулярные выступы v
относительно вектора k
. Показано, что они приводят формулу Родригеса, которую я не буду здесь проходить. Я напишу вам статью, если вы хотите получить полный вывод.
Причина, почему формула вращения Rodrigues была предложена повернуть вещи, потому что очень часто, есть приложения, где вы вращающиеся вокруг оси, которая не с центром в начале координат, ни вы вращающиеся по стандарту x
, y
и z
ось.
Фактически, если вы посмотрите статью в Википедии, вам не нужно преобразовывать ее в матричную форму, чтобы повернуть вещи. Вы можете использовать единичный вектор и угол поворота непосредственно вращать вектор, который приводит нас к его вращения формуле:
Источник: Rodrigues' Rotation formula
Причина vrrotvec2mat
существует потому, что вы можете преобразуется между представлением осевого угла поворота вектора и матрицы вращения с поворотом относительно начала в линейной алгебре. Затем вы можете применить ту же линейную алгебраическую теорию для поворота вектора/точки в трехмерном пространстве с учетом этой матрицы вращения. Вы можете конвертировать назад и вперед между нормальной матрицей вращения и представлением формулы Родригеса, используя vrrotvec2mat
и vrrotmat2vec
соответственно.
Представление оси угла, по существу, вектор 4 элемента, где первые три элемента являются компонентами единичного вектора k
, который определяет ось вращения и последний элемент в x
, y
и z
угол theta
вращения, который вращается ваш вектор относительно этой оси. vrrotvec2mat
здесь не отличается и требует 4-элементного вектора в том порядке, о котором я только что говорил. Однако, быстро взглянув на источник, theta
- , определенный в радианах.
Если вы хотите получить конкретный пример этой работы, воспользуйтесь приведенной выше диаграммой в качестве примера. Единичный вектор k
направлен вверх на ось z
, поэтому первые три компонента составляют (0,0,1)
. Мы хотим повернуть на 180 градусов, поэтому четвертый аргумент - pi
...и так:
>> M = vrrotvec2mat([0 0 1 pi])
M =
-1.0000 -0.0000 0
0.0000 -1.0000 0
0 0 1.0000
Это точно определяет поворот на 180 градусов вокруг z
оси Оу, если вы посмотрите на стандартную матрицу вращения в декартовой пространстве вокруг z
оси. Если вспомнить матрицу вращения для этого, это:
Если вы заменяете theta = pi
в приведенной выше матрице, вы получите то же самое, M
, как показано в функции vrrot2vec2mat
. Однако игнорируйте знак первой строки, второй столбец, поскольку это связано с числовой точностью ... что приводит нас ко второму параметру options
. В принципе, при вычислении значений матрицы вращения с использованием формулы Rotrigues Rotation будут времена, когда значения в матрице будут довольно малы. Структура options
имеет поле epsilon
, где вы можете указать что-либо меньшее, чем этот порог, считается нулевым после вычисления матрицы. По умолчанию 1e-12
вполне подходит ИМХО.
Если вы хотите изменить значение по умолчанию epsilon
, просто создать структуру, которая имеет один элемент epsilon
, который изменяет этот порог и вызвать функцию с этим дополнительным вторым аргументом ... так что-то вроде:
>> options.epsilon = 1e-15;
>> M = vrrotvec2mat([0 0 1 pi], options);
в любом случае, возвращаясь к тому, что мы говорим о, скажем, наш заданный вектор v
является относительно рисунке выше, и что он на северо-запад, указывая - в частности, на (x,y,z) = (1,0,1)
. Если мы используем эту матрицу поворота и повернуть эту точку, мы должны получить его, чтобы быть параллельна xz
плоскости и направлен в противоположном направлении, и поэтому мы должны получить (x,y,z) = (-1,0,1)
:
>> M*[1;0;1]
ans =
-1.0000
0.0000
1.0000
Вы также можете получить тот же самый результат, используя формулу Родригиш вращения:
>> v = [1;0;1];
>> k = [0;0;1];
>> theta = pi;
>> vrot = v*cos(theta) + cross(k,v)*sin(theta) + k*(k.'*v)*(1-cos(theta))
vrot =
-1.0000
0.0000
1.0000
в общем, это просто еще один способ вращения вектора вокруг произвольной оси, а не только ограничивает до стандарта x
, y
или z
.
Как я вижу, это '' vrrotvec' (http://mathworks.com/help/sl3d/vrrotvec.html) должно дать вам 'r' необходимо – Adriaan