最近做的一个小项目需要根据给定的一个任意运动轴(起点(x,y,z),方向(u,v,w))以及旋转角度theta,求解绕该轴的旋转矩阵。查了很多资料但是基本都没有给实现,所以这里总结一下推导以及实现。
推导
这部分内容有很多大佬已经进行过相关的推导,不做赘述。如果感兴趣,笔者推荐两个不错的博客:
代码实现
代码主要参考以上两篇博客的推导以及大佬的Java实现。
因为项目需求,只做了Javascript的实现,其他语言稍微改下语法也很好实现。
1. 右乘矩阵
在Three.js中旋转模型使用的是这个。
function getRotationMatrix(start, axis, theta) {
// start, axis: THREE.Vector3
// Theta: float
var x = start.x;
var y = start.y;
var z = start.z;
var uUn = axis.x;
var vUn = axis.y;
var wUn = axis.z;
var l = Math.sqrt(uUn*uUn + vUn*vUn + wUn*wUn);
// In this instance we normalize the direction vector.
var u = uUn / l;
var v = vUn / l;
var w = wUn / l;
// Set some intermediate values.
var u2 = u * u;
var v2 = v * v;
var w2 = w * w;
var cosT = Math.cos(theta);
var oneMinusCosT = 1 - cosT;
var sinT = Math.sin(theta);
var rotationMatrix = new Array(16<