在matlab中通过任意轴旋转立方体并将其反褶积回原始x、y和z轴

在matlab中通过任意轴旋转立方体并将其反褶积回原始x、y和z轴,matlab,graphics,3d,matlab-figure,Matlab,Graphics,3d,Matlab Figure,我有一个应用程序,我必须使用Matlab将立方体绕任意轴旋转θ角。我正在使用它来实现这一点。请注意,我只对围绕立方体中心旋转感兴趣,因此我指定的轴将通过该中心 以下是我执行此操作的代码: %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

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

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

%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
%cube旋转
xc=0;yc=0;zc=0;%中心坐标
L=1;%立方体大小(边的长度)
α=0.2;
%透明度(最大值=1=不透明)
Xmag=1;%指定要旋转的轴向量和角度
Ymag=1;
Zmag=1;
角度=30;
X=[0 0 0 1;1 0 1 1 1;1 0 1 1 1;0 0 0 0 1];%定义立方体坐标
Y=[0 0 0 1 0;0 1 0 1 1;0 1 1 1 1;0 0 1 1 1 0];
Z=[0 0 1 0 0;0 0 1 0 0;1 1 1 0 1 1;1 1 1 0 1 1];
C=[0.50.10.1 0.1 0.1 0.1 0.1 0.1];
X=L*(X-0.5)+xc;%平移立方体,使其中心位于原点
Y=L*(Y-0.5)+yc;
Z=L*(Z-0.5)+zc;
mag=sqrt(Xmag*Xmag+Ymag*Ymag+Zmag*Zmag);%找到与轴向量对应的单位向量
x=Xmag/mag;
y=Ymag/mag;
z=Zmag/mag;
th=0;
对于计数=1:0.01:角度
cla;
如果(th1.)在3D中,从一个方向到另一个方向的旋转量是无限的。
2.)克服这一问题的一种方法是商定一组标准角度,例如。
3.)描述了如何找到欧拉角-例如-。
4)鉴于你的立方体可能已经关于<代码> x,<代码> y,<代码> z < /代码>,你应该考虑两次计算角度:一次用于初始位置,一次用于结果位置。三角洲的角度将是你所寻找的

编辑
从Wikipedia关于Euler angles的条目中:

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


这一点在中有更详细的解释。

这里有一个想法:@Schorsch:你能把它说清楚一点吗?谢谢@肖尔什:谢谢!我将尝试这种方法。这个问题似乎离题了,因为它是关于数学的。我今天遇到了另一个问题。现在,如果我解欧拉角的旋转矩阵,我会得到多组解。我怎么知道从中选择什么解决方案?@AnanthSaran:请看我的编辑。你必须考虑角度的范围。