0

我有一个应用程序,我必须使用 Matlab 将立方体围绕任意轴旋转角度 theta。我正在使用罗德里格斯旋转公式来实现这一点。请注意,我只对围绕立方体中心的旋转感兴趣,因此我指定的轴将通过中心。

以下是我执行此操作的代码:

%cube rotation
xc=0; yc=0; zc=0;    % coordinates of the center
L=1;                 % cube size (length of an edge)
alpha=0.2;
% transparency (max=1=opaque)

Xmag=1;%specify the axis vector and the angle to rotate by
Ymag=1;
Zmag=1;
angle=30;

X = [0 0 0 0 0 1; 1 0 1 1 1 1; 1 0 1 1 1 1; 0 0 0 0 0 1];% define the cube coordinates
Y = [0 0 0 0 1 0; 0 1 0 0 1 1; 0 1 1 1 1 1; 0 0 1 1 1 0];
Z = [0 0 1 0 0 0; 0 0 1 0 0 0; 1 1 1 0 1 1; 1 1 1 0 1 1];                                              
C=  [0.5 0.1 0.1 0.1 0.1 0.1];

X = L*(X-0.5) + xc;% translate cube so that its center is at the origin
Y = L*(Y-0.5) + yc;
Z = L*(Z-0.5) + zc;


mag=sqrt(Xmag*Xmag+Ymag*Ymag+Zmag*Zmag);%find the unit vector correspoding to the axis vector
x=Xmag/mag;
y=Ymag/mag;
z=Zmag/mag;

th=0;

for count=1:0.01:angle
cla;
if(th<angle)
     th=th+0.01;
end 

c=cos(th); %rodrigues formula
s=sin(th);
t=1-cos(th);

for i=1:1:4
    for j=1:1:6
        Xnew_th(i,j)=X(i,j)*(t*x*x+c)+Y(i,j)*(t*x*y-s*z)+Z(i,j)*(t*x*y+s*y);
        Ynew_th(i,j)=X(i,j)*(t*x*y+s*z)+Y(i,j)*(t*y*y+c)+Z(i,j)*(t*y*z-s*x);
        Znew_th(i,j)=X(i,j)*(t*x*z-s*y)+Y(i,j)*(t*y*z+s*x)+Z(i,j)*(t*z*z+c);
    end 
end 

fill3(Xnew_th,Ynew_th,Znew_th,C,'FaceAlpha',alpha); % draw cube
axis([-1 1 -1 1 -1 1]);
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
%grid on;
view(3);% orientation of the axes
pause(0.02);
end

现在,我需要将这个关于任意轴的旋转反卷积到关于x-axisy-axis和 的角度z-axis。也就是说,我需要找到立方体必须围绕和轴转动的角度x,以达到与使用罗德里格斯公式相同的最终状态。yz

关于如何做到这一点的任何想法?或者,在构造旋转矩阵时,是否有任何其他公式而不是罗德里格斯公式考虑了围绕 x、y 和 z 轴的旋转角度?

谢谢!

4

1 回答 1

1

1.) 从一个方向到另一个方向有无限量的 3D 旋转。
2.) 克服这个问题的一种方法是就一组标准角度达成一致,例如欧拉角
3.)如何找到欧拉角在此处进行了描述-例如-here
4.) 鉴于您的立方体可能已经相对于x,旋转了yz您应该考虑计算两次角度:一次用于初始位置,一次用于结果位置。角度的增量将是您正在寻找的。


从关于欧拉角的维基百科条目 编辑:

有趣的是,反余弦函数会为参数产生两个可能的值。在这个几何描述中,只有一个解是有效的。当欧拉角被定义为一系列旋转时,所有解都可以是有效的,但在角度范围内只有一个。这是因为如果范围之前没有定义,那么到达目标帧的旋转顺序不是唯一的。

本文对此进行了更详细的解释。

于 2013-06-18T15:01:12.693 回答