为什么我的 3 轴系统坐标方向会随着 y 值改变 x?
Why does my 3 axes system coordinate orientation change x with y values?
我正在使用 Matlab 和欧拉角来重新定向 3 轴坐标系。具体来说,
Rz = [cos(ψ) sin(ψ) 0;-sin(ψ) cos(ψ) 0;0 0 1];
Ry = [cos(φ) 0 -sin(φ);0 1 0;sin(φ) 0 cos(φ)];
Rx = [1 0 0;0 cos(θ) -sin(θ);0 sin(θ) cos(θ)];
Rtotal = Rz*Ry*Rz
然后我遍历我的旧系统坐标 (x,y,z) 并制作一个矢量 coord_old。然后我用 (xn,yn,zn)
得到重新定向的系统
for i=1:size(num,1)
coord_old = [x(i,1);y(i,1);z(i,1)];
coord_new = Rtotal*coord_old;
xn(i,1) = coord_new(1,1);
yn(i,1) = coord_new(2,1);
zn(i,1) = coord_new(3,1);
end
我的问题是当 θ,φ,ψ≃0 那么 x->-y 和 y->x 以及什么时候θ,φ≃0且ψ=90则x和y不会旋转!这意味着当 x,y 应该旋转时它们不会旋转,当它们不应该旋转时它们保持原样!
--编辑--
例如,当 ψ=20.0871、φ=0.0580 和 θ=0.0088 时,我得到这些结果
看到 x->-y 和 y->x 而 z 根本没有改变!
有什么想法吗?
当我使用您的代码并为所有角度插入 0 时,我得到 Rtotal:
Rtotal =
1 0 0
0 1 0
0 0 1
这是单位矩阵,不会改变您的值。
你的矩阵乘法有误。我认为你应该乘以:Rtotal*coord_old
。我认为您错过了 _old
。根据您的 coord
变量,这可能是错误。
当我运行:
for i=1:size(1,1)
coord_old = [1;2;3];
coord_new = Rtotal*coord_old;
xn(i,1) = coord_new(1,1);
yn(i,1) = coord_new(2,1);
zn(i,1) = coord_new(3,1);
end
我得到正确的结果:
coord_new =
1
2
3
好的,我看到这里有两个主要问题:
Rtotal = Rz*Ry*Rz
可能不是您想要的,因为 Rz
被乘以两次。我想你的意思是 Rtotal = Rz*Ry*Rx
.
- 您的旋转矩阵似乎不正确。检查 this Wikipedia artice 以获得正确的符号。
这里是修正后的旋转矩阵:
Rz = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0; 0 0 1];
Ry = [cos(phi) 0 sin(phi); 0 1 0; -sin(phi) 0 cos(phi)];
Rx = [1 0 0; 0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)];
Rtotal = Rz*Ry*Rx;
使用这个矩阵我得到了正确的结果:
x=1; y=2; z=3;
psi=0; phi=0; theta=0;
[xn,yn,zn] >> 1 2 3
x=1; y=2; z=3;
psi=90/180*pi; phi=0; theta=0;
[xn,yn,zn] >> -2 1 3
这里是 3d 立方体的完整图形示例-space:
% Create cube (not in origin)
DVert = [0 0 0; 0 1 0; 1 1 0; 1 0 0 ; ...
0 0 1; 0 1 1; 1 1 1; 1 0 1];
DSide = [1 2 3 4; 2 6 7 3; 4 3 7 8; ...
1 5 8 4; 1 2 6 5; 5 6 7 8];
DCol = [0 0 1; 0 0.33 1; 0 0.66 1; ...
0 1 0.33; 0 1 0.66; 0 1 1];
% Rotation angles
psi = 20 /180*pi; % Z
phi = 45 /180*pi; % Y
theta = 0 /180*pi; % X
% Rotation matrix
Rz = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0; 0 0 1];
Ry = [cos(phi) 0 sin(phi); 0 1 0; -sin(phi) 0 cos(phi)];
Rx = [1 0 0; 0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)];
Rtotal = Rz*Ry*Rz;
% Apply rotation
DVertNew = Rtotal * DVert';
% Plot cubes
figure;
patch('Faces',DSide,'Vertices',DVert,'FaceColor','flat','FaceVertexCData',DCol);
patch('Faces',DSide,'Vertices',DVertNew','FaceColor','flat','FaceVertexCData',DCol);
% Customize view
grid on;
axis equal;
view(30,30);
谢谢@Steffen 和@Matt。不幸的是,我的声誉不够高,无法投票给你的答案!
正如@Matt 正确指出的那样,问题不在于 Rtotal
。应该是 Rz*Ry*Rx
。然而,你的两个想法都帮助我用简单的例子(5 组坐标和右手法则)测试了我的代码,并意识到我的(业余)错误在哪里。
我忘了我已经删除了我用度数表示角度的部分代码...我应该使用 sind & cosd
而不是 sin and cos
。
我正在使用 Matlab 和欧拉角来重新定向 3 轴坐标系。具体来说,
Rz = [cos(ψ) sin(ψ) 0;-sin(ψ) cos(ψ) 0;0 0 1];
Ry = [cos(φ) 0 -sin(φ);0 1 0;sin(φ) 0 cos(φ)];
Rx = [1 0 0;0 cos(θ) -sin(θ);0 sin(θ) cos(θ)];
Rtotal = Rz*Ry*Rz
然后我遍历我的旧系统坐标 (x,y,z) 并制作一个矢量 coord_old。然后我用 (xn,yn,zn)
得到重新定向的系统for i=1:size(num,1)
coord_old = [x(i,1);y(i,1);z(i,1)];
coord_new = Rtotal*coord_old;
xn(i,1) = coord_new(1,1);
yn(i,1) = coord_new(2,1);
zn(i,1) = coord_new(3,1);
end
我的问题是当 θ,φ,ψ≃0 那么 x->-y 和 y->x 以及什么时候θ,φ≃0且ψ=90则x和y不会旋转!这意味着当 x,y 应该旋转时它们不会旋转,当它们不应该旋转时它们保持原样!
--编辑-- 例如,当 ψ=20.0871、φ=0.0580 和 θ=0.0088 时,我得到这些结果
看到 x->-y 和 y->x 而 z 根本没有改变! 有什么想法吗?
当我使用您的代码并为所有角度插入 0 时,我得到 Rtotal:
Rtotal =
1 0 0
0 1 0
0 0 1
这是单位矩阵,不会改变您的值。
你的矩阵乘法有误。我认为你应该乘以:Rtotal*coord_old
。我认为您错过了 _old
。根据您的 coord
变量,这可能是错误。
当我运行:
for i=1:size(1,1)
coord_old = [1;2;3];
coord_new = Rtotal*coord_old;
xn(i,1) = coord_new(1,1);
yn(i,1) = coord_new(2,1);
zn(i,1) = coord_new(3,1);
end
我得到正确的结果:
coord_new =
1
2
3
好的,我看到这里有两个主要问题:
Rtotal = Rz*Ry*Rz
可能不是您想要的,因为Rz
被乘以两次。我想你的意思是Rtotal = Rz*Ry*Rx
.- 您的旋转矩阵似乎不正确。检查 this Wikipedia artice 以获得正确的符号。
这里是修正后的旋转矩阵:
Rz = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0; 0 0 1];
Ry = [cos(phi) 0 sin(phi); 0 1 0; -sin(phi) 0 cos(phi)];
Rx = [1 0 0; 0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)];
Rtotal = Rz*Ry*Rx;
使用这个矩阵我得到了正确的结果:
x=1; y=2; z=3;
psi=0; phi=0; theta=0;
[xn,yn,zn] >> 1 2 3
x=1; y=2; z=3;
psi=90/180*pi; phi=0; theta=0;
[xn,yn,zn] >> -2 1 3
这里是 3d 立方体的完整图形示例-space:
% Create cube (not in origin)
DVert = [0 0 0; 0 1 0; 1 1 0; 1 0 0 ; ...
0 0 1; 0 1 1; 1 1 1; 1 0 1];
DSide = [1 2 3 4; 2 6 7 3; 4 3 7 8; ...
1 5 8 4; 1 2 6 5; 5 6 7 8];
DCol = [0 0 1; 0 0.33 1; 0 0.66 1; ...
0 1 0.33; 0 1 0.66; 0 1 1];
% Rotation angles
psi = 20 /180*pi; % Z
phi = 45 /180*pi; % Y
theta = 0 /180*pi; % X
% Rotation matrix
Rz = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0; 0 0 1];
Ry = [cos(phi) 0 sin(phi); 0 1 0; -sin(phi) 0 cos(phi)];
Rx = [1 0 0; 0 cos(theta) -sin(theta); 0 sin(theta) cos(theta)];
Rtotal = Rz*Ry*Rz;
% Apply rotation
DVertNew = Rtotal * DVert';
% Plot cubes
figure;
patch('Faces',DSide,'Vertices',DVert,'FaceColor','flat','FaceVertexCData',DCol);
patch('Faces',DSide,'Vertices',DVertNew','FaceColor','flat','FaceVertexCData',DCol);
% Customize view
grid on;
axis equal;
view(30,30);
谢谢@Steffen 和@Matt。不幸的是,我的声誉不够高,无法投票给你的答案!
正如@Matt 正确指出的那样,问题不在于 Rtotal
。应该是 Rz*Ry*Rx
。然而,你的两个想法都帮助我用简单的例子(5 组坐标和右手法则)测试了我的代码,并意识到我的(业余)错误在哪里。
我忘了我已经删除了我用度数表示角度的部分代码...我应该使用 sind & cosd
而不是 sin and cos
。