繞任意軸旋轉


繞任意軸旋轉

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;
}   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM