绕任意轴旋转
绕任意轴旋转
1. 向量F为旋转轴
2. 向量AC'为旋转后的向量
3. 向量AC为旋转前的向量
1. 求出向量AB
向量AB = (向量AC dot 向量AF) x 向量AF
2. 求出向量BC'
向量BC' = 向量BZ'sin theta + 向量BC cos theta
向量BZ' = 向量AF x 向量BC = 向量AF x 向量AC
向量BC = 向量AC - 向量AB
3. 求出向量AC'
向量AC' = 向量AB + 向量BC'
4. 将各项结果代入
向量AC' = (向量AC dot 向量AF) x 向量AF + (向量AF x 向量AC)sin theta + (向量AC - (向量AC dot 向量AF) x 向量AF)cos theta
5. 假设旋转轴向量表示为
向量AF = (Rx,Ry,Rz)
最终结果
其中(Rx,Ry,Rz)代表任意旋转轴:
function axisRotation(axis, angle, target){
var x = axis.x;
var y = axis.y;
var z = axis.z;
var l = Math.sqrt(x * x + y * y + z * z);
x = x / l;
y = y/ l;
z = z /l;
var xx = x * x;
var yy = y * y;
var zz = z * z;
var cos = Math.cos(angle);
var sin = Math.sin(angle);
var oneMCos = 1 - cos;
target = target || new Float32Array(16);
target[0] = xx + (1 - xx) * cos;
target[1] = x * y * oneMCos + z * sin;
target[2] = x * z * oneMcos - y * sin;
target[3] = 0;
target[4] = x * y * oneMCos - z * sin;
target[5] = yy + (1 - yy) * cos;
target[6] = y * z * oneMCos + x * sin;
target[7] = 0;
target[8] = x * z * oneMCos + y * sin;
target[9] = y * z * oneMCos - x * sin;
target[10] = zz + (1 - zz) * cos;
target[11] = 0;
target[12] = 0;
target[13] = 0;
target[14] = 0;
target[15] = 1;
return target;
}