zoukankan      html  css  js  c++  java
  • 绕任意轴旋转

    绕任意轴旋转

    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;
    }   
    
  • 相关阅读:
    iOS开发之窗口和视图
    GCD
    禁止非法用户登录综合设置
    大数减法(C++实现)
    大数加法(C++实现)
    迷宫问题 (BFS ➕输出路径)
    Pots (BFS ➕ 输出路径)
    Shuffle'm Up (map ➕ BFS)
    Prime Path (BFS)
    速算24点
  • 原文地址:https://www.cnblogs.com/pluslius/p/13964880.html
Copyright © 2011-2022 走看看