Agoni 发表于 2016-5-13 09:54

三维空间下的坐标旋转问题

下列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=.';%起始坐标值
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)*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 选择取线上任一点, 将直接平移至原点(如果该一定通过原点,则该步可约去), 平移矩阵为A1.2 将直线绕Z轴回转至XZ或者YZ(任选一)平面内, 旋转矩阵为B1.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, 平移逆变换最终可得结果.具体公式:左手坐标系下,一点绕任意轴旋转θ角的右乘矩阵:其中C为cosθ,S为sinθ,A为单位化的旋转轴转自:http://blog.sina.com.cn/s/blog_82b526270101r0m3.html
页: [1]
查看完整版本: 三维空间下的坐标旋转问题