クォータニオンによる回転ではq⊗r⊗q*で回転を表現する。
qを回転行列Rのようにとらえれば、位置ベクトルの「前に」qを置くのは自然に思える。
ところで、なぜ回転を表すqとその共役q*で挟み込むのか、というのが納得できていない。
クォータニオンの積q⊗r⊗q*では、
ステップ1:tmp = q⊗r
という計算に続いて、
ステップ2:tmp⊗q*
という演算が行われている。
ステップ1の計算でオーバーランした分をステップ2で戻しているのかと思い、以下のコードで調べてみた。
clear; close all; x=1; y=1; z=1; P = [x;y;z]; O = [0;0;0]; vec = [O,P]; plot3(vec(1,:),vec(2,:),vec(3,:),'magenta','LineWidth',3); hold on; Xaxis = [1,0,0]'; Yaxis = [0,1,0]'; Zaxis = [0,0,1]'; OX = [O,Xaxis]; OY = [O,Yaxis]; OZ = [O,Zaxis]; plot3(OX(1,:),OX(2,:),OX(3,:),'r'); plot3(OY(1,:),OY(2,:),OY(3,:),'g'); plot3(OZ(1,:),OZ(2,:),OZ(3,:),'b'); xlim([-2,2]); ylim([-2,2]); zlim([-2,2]); view(180,0); for theta=linspace(0,2*pi*2,10) if (theta==0) || (theta==4*pi) continue end a = [0,1,0]'; n = a/norm(a); x = P(1); y = P(2); z = P(3); nx = n(1); ny = n(2); nz = n(3); q1 = [0,x,y,z]'; q2 = [cos(theta/2),nx*sin(theta/2),ny*sin(theta/2),nz*sin(theta/2)]'; q3 = [cos(theta/2),-nx*sin(theta/2),-ny*sin(theta/2),-nz*sin(theta/2)]'; q_tmp = MultQuat(q2,q1); P2_tmp = q_tmp(2:4); vec2_tmp = [O,P2_tmp]; plot3(vec2_tmp(1,:),vec2_tmp(2,:),vec2_tmp(3,:),'b--'); big; drawnow; pause(0.3); q = MultQuat(q_tmp,q3); P2 = q(2:4); vec2 = [O,P2]; plot3(vec2(1,:),vec2(2,:),vec2(3,:),'k--'); big; drawnow; pause(0.3); end function q = MultQuat(q1,q2) pw = q1(1); px = q1(2); py = q1(3); pz = q1(4); qw = q2(1); qx = q2(2); qy = q2(3); qz = q2(4); q = [pw*qw-px*qx-py*qy-pz*qz; pw*qx+px*qw+py*qz-pz*qy; pw*qy-px*qz+py*qw+pz*qx; pw*qz+px*qy-py*qx+pz*qw]; end
青がステップ1の計算結果、黒がステップ2の計算結果である。
回転軸に垂直な平面でみると黒が青をカバーする事がわかる。
実際には黒と青は一致しているわけではなく、青線は3次元的に配置されている。
カンでは
青線(ステップ1の計算結果)がどういう物理的な意味を持っているのか、調べる必要がある。