У меня есть частичный ответ для вас.Ответ на первый вопрос заключается в том, что в AFAIK нет встроенной функции MATLAB для построения n-мерной матрицы вращения.
Однако есть интересный подход, описанный в следующей статье:
Агилера, Антонио и Рикардо Перес-Агила.«Общие n-мерные повороты».(2004).
По сути, с учетом набора базисных векторов они описывают построение матрицы вращения путем вычисления последовательности вращений, которая выравнивает базисные векторы подпространства с подпространством, охватываемымсначала n-2 оси стандартного базиса, затем они применяют желаемое вращение и отменяют стандартное вращение выравнивания базиса, чтобы получить конечную матрицу вращения.
Я реализовал псевдокод, описанный в статье, слегка изменив его, чтобы удалитьнеобязательный компонент перевода и однородные координаты (в любом случае не уверен, почему это будет частью матрицы вращения!).Я также изменил его, чтобы построить матрицу предварительного умножения, а не матрицу постумножения.т.е. мы вращаем вектор-столбец x
, используя y = R*x
.Это соответствует соглашению, используемому vrrotvec2mat
для трехмерного вращения.
- Основа подпространства задается как
v
, что является n
-by- n-2
матрица. - Угол поворота относительно подпространства задается как
theta
в радианах.
% Implementation of the Aguilera-Perez Algorithm.
% Aguilera, Antonio, and Ricardo Pérez-Aguila. "General n-dimensional rotations." (2004).
function M = rotmnd(v,theta)
n = size(v,1);
M = eye(n);
for c = 1:(n-2)
for r = n:-1:(c+1)
t = atan2(v(r,c),v(r-1,c));
R = eye(n);
R([r r-1],[r r-1]) = [cos(t) -sin(t); sin(t) cos(t)];
v = R*v;
M = R*M;
end
end
R = eye(n);
R([n-1 n],[n-1 n]) = [cos(theta) -sin(theta); sin(theta) cos(theta)];
M = M\R*M;
Это не полностью отвечает на ваш вопрос, как я считаюЕсть два направления, чтобы вращаться вокруг подпространства (или, может быть, больше? Я даже не знаю, как думать о вращении в пространстве более высокого измерения).В вашем вопросе неясно, что направление базисных векторов описывает направление вращения.
Почти наверняка есть элегантный способ определить, какой знак использовать для theta
, но я думаю, что вы могли бы просто вычислитьматрицу вращения с theta
и -theta
, затем определите, какой из них правильно идет от точки, которую вы хотите повернуть, к конечной точке поворота.
Примеры использования
эквивалент vrrotvec2mat
>> R1 = rotmnd([1; 2; 3], pi/4)
R1 =
0.7280 -0.5251 0.4407
0.6088 0.7908 -0.0635
-0.3152 0.3145 0.8954
>> R2 = vrrotvec2mat([1; 2; 3; pi/4])
R2 =
0.7280 -0.5251 0.4407
0.6088 0.7908 -0.0635
-0.3152 0.3145 0.8954
4-й поворот
>> v = [1 0;
0 1;
1 0;
0 1];
>> R = rotmnd(v, pi/4)
R =
0.8536 -0.3536 0.1464 0.3536
0.3536 0.8536 -0.3536 0.1464
0.1464 0.3536 0.8536 -0.3536
-0.3536 0.1464 0.3536 0.8536
>> x = [0; 0; 0; 1];
>> y = R*x
y =
0.3536
0.1464
-0.3536
0.8536
Интересное примечание Из статьи, по-видимому, допущена ошибка в определении общей матрицы для основных вращений (она транспонирована).Это можно наблюдать, сравнивая матрицу вращения в уравнении (которая R_ {1,2}) с определением общей матрицы вращения главной оси, которая транспонируется.Эта ошибка привела к некоторому «веселью» при реализации алгоритма.
PS Очень похожий подход, который может обеспечить понимание, описан в:
Хансон, Эндрю Дж. «4 вращения для N-мерной графики».Graphics Gems V. 1995. 55-64.
Мне еще предстоит прочитать это внимательно, но я могу вернуться позже, чтобы прочитать это и кое-что узнать.