如何在给定旋转点,旋转角度和旋转轴(n-2子空间)的情况下计算n维旋转矩阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在给定旋转点,旋转角度和旋转轴(n-2子空间)的情况下计算n维旋转矩阵相关的知识,希望对你有一定的参考价值。

我想计算n维空间中的(nxn)旋转矩阵,给出以下内容:

  1. 旋转点。
  2. 一个旋转角度。
  3. 旋转轴(一个(n-2)子空间,它穿过由跨越子空间的(n-2)个单位矢量给出的原点)。
  4. 最后的旋转点。

我认为4号(最终旋转点)是多余的,可以在没有它的情况下计算旋转矩阵。但我拥有它们。

是否有一个已经实现它的matlab函数?我知道有一个n = 3的函数(vrrotvec2mat)。但我没有找到任何一般n的功能。如果没有这样的功能,这里的任何人都可以告诉我如何计算它,以便我可以编写这个函数?

我甚至不确定一般n是否有唯一的旋转矩阵。如果有多个,我不介意使用哪个旋转矩阵。

我将不胜感激任何帮助。

提前致谢!

答案

我有一个部分答案给你。第一个问题的答案是AFAIK,没有用于构造n维旋转矩阵的内置MATLAB函数。

但是,下面的文章中描述了一种有趣的方法:

Aguilera, Antonio, and Ricardo Pérez-Aguila. "General n-dimensional rotations." (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 = MR*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-d旋转

>> 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

有趣的说明从纸上看,主旋转的一般矩阵的定义似乎是错误的(它是转置的)。这可以通过将等式2中的旋转矩阵(其为R_ {1,2})与被转置的一般主轴旋转矩阵的定义进行比较来观察。这个错误在实现算法时带来了一些“乐趣”。


附:可以提供洞察力的非常类似的方法描述于:

Hanson, Andrew J. "4 Rotations for N-Dimensional Graphics." Graphics Gems V. 1995. 55-64.

我还没有仔细阅读这篇文章,但我可能会稍后回来阅读并学习一些东西。

另一答案

如果你有正交向量u和v跨越你的n-2子空间的正交补,或换句话说,如果w(1).. w(n-2)是跨越n-2子空间的向量,如果你有矢量u和v使得两者都与所有w正交,并且彼此正交并且每个长度为1,那么所需矩阵M的构造将是直接的。

定义nx2矩阵P使u为第一列,v为第二列,并且让R为通过角度的通常的2x2旋转矩阵。然后

M = I + P*(R-i)*P'

(这里我是nxn身份,我是2x2身份)

(如果你想我会扩展这个答案,争论为什么那是你需要的(独特的)矩阵)。

如果你没有它们,那么棘手的部分就是抓住向量u和v。

如果你的投影矩阵Q在你的n-2暗淡子空间上,那么yu可以通过找到Q的零空间的(正交)基础来找到u和v。但是这里有一个令人恼火的细节。如果您使用u,v如上所述,您将获得一个'旋转矩阵',而如果您交换它们,您将获得另一个。我将旋转矩阵放在引号中,因为其中一个将具有行列式1,因此是一个旋转,另一个将具有行列式-1。

上面的矩阵将始终具有与R相同的行列式,如使用Sylvester's determinant identity和P'* P = i的事实所见。

然而,它是否代表通过给定角度的旋转是相当模糊的。假设为正交补码选择了不同的基础,因此使用2×n矩阵Q而不是P.因为这些代表相同空间的不同(正交)基数,所以存在2×2正交矩阵S,其中Q = S * P.因此使用Q构造的矩阵是

N = I + P*S'*(R-i)*S*P'

事实上,如果S是一个旋转,一切都很好,N和M将是相同的。但是如果S具有行列式-1,例如

S = ( 0 1 )
    ( 1 0 )

然后

S'*(R-i)*S = R'-i

所以我们扭转了旋转角度!

以上是关于如何在给定旋转点,旋转角度和旋转轴(n-2子空间)的情况下计算n维旋转矩阵的主要内容,如果未能解决你的问题,请参考以下文章

空间两向量之间的旋转角如何求?角度范围在0-360°

在 3D 空间中沿 Y 轴的一个角度在随机点处旋转单位向量

点和椭圆(旋转)位置测试:算法

CDR如何旋转文字标准角度?

如何让一个sprite绕一个点旋转,同时又可以实现指定旋转角度并慢慢停下的效果

arcgis如何以某个点为旋转中心旋转直线