声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2848|回复: 0

[编程技巧] 三维空间下的坐标旋转问题

[复制链接]
发表于 2016-5-13 09:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
下列matlab代码实现的是任一向量绕x,y,z旋转的问题:
syms a b c;%a,b,c分别代表绕x,y,z轴旋转地角度
A=[ 1 0 0 ; 0 cos(a) -sin(a) ; 0 sin(a) cos(a) ];
B=[ cos(b) 0 sin(b) ; 0 1 0 ; -sin(b) 0 cos(b) ];
C=[ cos(c) -sin(c) 0 ; sin(c) cos(c) 0 ; 0 0 1 ];
x0=[1,1,1].';%起始坐标值
x=A*B*C*x0;
C=subs(C,c,-c);A=subs(A,a,-a);B=subs(B,b,-b);%逆旋转应该得到原来的向量
x1=C*B*A*x;
simplify(x1);%化简结果,否则结果很长
注意旋转的顺序不同的得到的结果是不同的,即若先绕y轴旋转再绕x轴旋转,最后绕z轴旋转,则应该是这样的结果:
x1=C*A*B*x0;也就是说如果给定了旋转后的结果x和初始位置x0,我们不可能得到三个旋转角度a,b,c
例如A*B*C的结果为:
[                        cos(b)*cos(c),                        cos(b)*sin(c),       -sin(b)]
[ cos(c)*sin(a)*sin(b) - cos(a)*sin(c), cos(a)*cos(c) + sin(a)*sin(b)*sin(c), cos(b)*sin(a)]
[ sin(a)*sin(c) + cos(a)*cos(c)*sin(b), cos(a)*sin(b)*sin(c) - cos(c)*sin(a), cos(a)*cos(b)]
而C*B*A的结果为:

[  cos(b)*cos(c), cos(a)*sin(c) + cos(c)*sin(a)*sin(b), sin(a)*sin(c) - cos(a)*cos(c)*sin(b)]
[ -cos(b)*sin(c), cos(a)*cos(c) - sin(a)*sin(b)*sin(c), cos(c)*sin(a) + cos(a)*sin(b)*sin(c)]
[         sin(b),                       -cos(b)*sin(a),                        cos(a)*cos(b)]
每给定一种旋转方式,即即存在有一组a,b,c。
以上仅仅是简单的绕三个轴依次旋转的情况,在实际的摇摆问题中,比如说测量船体的三维变形,往往其旋转轴不是三个坐标轴是瞬时完成的而且旋转轴也是时刻在变化的。
绕单个轴的旋转问题:但是对于绕任意轴旋转就比较复杂了, 主要分为以下步骤,
步一, 将直线旋转成为一个坐标轴重合
1.1 选择取线上任一点, 将直接平移至原点(如果该一定通过原点,则该步可约去), 平移矩阵为A
1.2 将直线绕Z轴回转至XZ或者YZ(任选一)平面内, 旋转矩阵为B
1.3 将直线绕Y(如果1.2直线在XZ)或者X(1.2直线在YZ)旋转至X轴或Y轴, 旋转矩阵为C
步二, 绕步一重合的坐标轴进行旋转
步三, 执行步一的逆变换
3.1 求C的逆变换矩阵c1, 依据1.3绕的那个轴转逆变换
3.2 求B的逆变换矩阵b1, 绕Z进行逆变换
3.3 求A的逆变换矩阵a1, 平移逆变换
最终可得结果.
具体公式:
左手坐标系下,一点绕任意轴旋转θ角的右乘矩阵:
AxisRotMatrix.jpg
其中C为cosθ,S为sinθ,A为单位化的旋转轴

回复
分享到:

使用道具 举报

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-26 00:19 , Processed in 0.086188 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表