绕任意轴旋转

绕任意轴旋转

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;
}   
posted @ 2020-11-12 17:01  pluscat  阅读(988)  评论(0编辑  收藏  举报