假设三维空间有一个原始矢量oriVec
, 我们需要把它旋转到目标矢量tarVec
,这样可以计算出一个旋转矩阵R,然后就可以用这个旋转矩阵去旋转其他的点。
比如想把一个空间三角形旋转到XOY平面上,原始矢量是三角形的法线,目标矢量是Z轴,这样得到旋转矩阵R,再使用R旋转三角形三个顶点坐标,即可把三角形旋转到与XOY平面平行的平面上,再减掉一个Z坐标即可把三角形平移到XOY平面
clc;clear
oriVec = [0; 1; 1]; % origin Vec
tarVec = [0; -1; -1]; % target Vec
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k = cross(oriVec,tarVec);
Nk = length(find(k==0));
Nzero = length(find(tarVec==0));
if Nk==3 && Nzero==2
II = find(tarVec==0);
tarVec(II(1)) = tarVec(II(1))+1e-10;
k = cross(oriVec,tarVec);
else
[~,II] = max(abs(tarVec));
tarVec(II) = tarVec(II)+1e-10;
k = cross(oriVec,tarVec);
end
k = k/norm(k);
theta = acos(dot(oriVec,tarVec)/norm(oriVec)/norm(tarVec));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x = k(1); y = k(2); z = k(3);
CA = cos(theta); SA = sin(theta); oneCA = 1 - CA;
R = [CA+oneCA*x*x, oneCA*x*y-SA*z, oneCA*x*z+SA*y;
oneCA*y*x+SA*z, CA+oneCA*y*y, oneCA*y*z-SA*x;
oneCA*z*x-SA*y, oneCA*z*y+SA*x, CA+oneCA*z*z];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
targetTest = R*oriVec