Three.js中文网 Three.js中文网
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
首页
免费视频
系统课 (opens new window)
  • Three.js基础课程
  • Vue3+Threejs 3D可视化
  • Threejs进阶课程
  • 展厅3D预览漫游
  • Threejs Shader
  • Blender建模基础
  • Three.js基础课程(旧版本) (opens new window)
  • 文章
WebGPU教程
  • WebGL教程
  • WebGL教程(旧版本) (opens new window)
3D案例
  • 本站部署(打开快) (opens new window)
  • 原英文官网文档 (opens new window)
Web3D系统课程视频
  • 1. 数学几何计算基础

  • 2.位移、速度、加速度(向量)

  • 3.向量点乘、叉乘

  • 4.四元数、欧拉角(角度姿态)

    • 1. 欧拉角Euler
    • 2. 四元数Quaternion
    • 3. 四元数表示物体姿态
    • 4. 四元数乘法运算
    • 5. 四元数表示两个向量旋转
    • 5.矩阵

    • 6.射线

    • 7.包围盒

    • 8.第一、三人称漫游

    • 9.漫游-八叉树碰撞检测

    • 10.CannonJS物理引擎

    • Three.js进阶教程
    • 4.四元数、欧拉角(角度姿态)
    郭隆邦
    2023-06-22
    目录

    5. 四元数表示两个向量旋转

    # 四元数表示两个向量旋转

    3D空间中有两个向量,一个向量向另外一个向量旋转,这个过程可以用一个四元数表示。

    下面给大家介绍一个四元数Quaternion的方法.setFromUnitVectors(a, b),计算参数a到b的旋转。

    # 已知条件

    已知飞行原来的飞行方向是a表示的方向,需要把飞机飞行方向旋转到向量b表示的方向。

    const model = new THREE.Group();
    loader.load("../飞机.glb", function (gltf) {
        const fly = gltf.scene
        model.add(fly);
        fly.position.set(10, 10, 0);//相对世界坐标系坐标原点偏移
        const axesHelper = new THREE.AxesHelper(10);
        fly.add(axesHelper);//用一个坐标轴可视化模型的局部坐标系(本地坐标系)
    
    
        const a = new THREE.Vector3(0, 0, -1);//飞机初始姿态飞行方向
        // 飞机姿态绕自身坐标原点旋转到b指向的方向
        const b = new THREE.Vector3(-1, -1, -1).normalize();
    
    })
    

    # 箭头可视化飞机旋转前后的方向

    // 可视化飞机方向
    const a = new THREE.Vector3(0, 0, -1);//飞机初始姿态飞行方向
    const O = fly.position.clone();//飞机位置坐标箭头起点
    model.add(new THREE.ArrowHelper(a, O, 30, 0xff0000));
    // 飞机姿态绕自身坐标原点旋转到b指向的方向
    const b = new THREE.Vector3(-1, -1, -1).normalize();
    model.add(new THREE.ArrowHelper(b, O, 30, 0x00ff00));
    

    # .setFromUnitVectors(a, b)生成四元数旋转飞机

    四元数Quaternion的方法.setFromUnitVectors(a, b)可以通过两个向量参数a和b,创建一个四元数,表示从向量a表示的方向旋转到向量b表示的方向。(参数a, b是单位向量)

    //飞机初始姿态飞行方向a
    const a = new THREE.Vector3(0, 0, -1);
    // 飞机姿态绕自身坐标原点旋转到b指向的方向
    const b = new THREE.Vector3(-1, -1, -1).normalize();
    // a旋转到b构成的四元数
    const quaternion = new THREE.Quaternion();
    //注意两个参数的顺序
    quaternion.setFromUnitVectors(a, b);
    // quaternion表示的是变化过程,在原来基础上乘以quaternion即可
    fly.quaternion.multiply(quaternion);
    

    # 练习题:人旋转

    已知人原来的正前方是a表示的方向,需要把人正前方旋转到向量b表示的方向。

    这个旋转过程,可通过.setFromUnitVectors(a, b)

    //人正前方从向量a表示方向旋转到向量b表示方向
    const q = new THREE.Quaternion();
    q.setFromUnitVectors(a,b);//a转向b
    person.quaternion.multiply(q);
    
    4. 四元数乘法运算
    1. 数学基础(平移、旋转、缩放矩阵)

    ← 4. 四元数乘法运算 1. 数学基础(平移、旋转、缩放矩阵)→

    Theme by Vdoing | Copyright © 2016-2025 豫ICP备16004767号-2
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式