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.四元数、欧拉角(角度姿态)

  • 5.矩阵

  • 6.射线

  • 7.包围盒

  • 8.第一、三人称漫游

    • 1. 键盘WASD按键状态记录
    • 2. W键控制角色模型运动
    • 3. 加速度(按键给玩家加速)
    • 4. 阻尼(玩家角色逐渐减速停止)
    • 5. 按键S退后运动
    • 6. 相机跟着玩家走(第三人称漫游)
    • 7. 鼠标左右拖动改变玩家视角
    • 8. 获取玩家(相机)正前方方向
      • 9. 鼠标上下移动只改变相机视角
      • 10. 玩家角色左右运动(叉乘)
      • 11. 鼠标滑动改变视角(指针锁定模式)
      • 12. 快捷键切换第一、第三人称
      • 13. 骨骼动画与运动状态关联
    • 9.漫游-八叉树碰撞检测

    • 10.CannonJS物理引擎

    • Three.js进阶教程
    • 8.第一、三人称漫游
    郭隆邦
    2023-09-03
    目录

    8. 获取玩家(相机)正前方方向

    # 获取玩家(相机)正前方方向

    实际开发,玩家角色的视角或者说相机的视角,会随着鼠标左右移动变化的,不过前面几节课,为了降低学习难度,代码给的是固定方向。

    function render() {
        if (keyStates.W) {
            //先假设W键对应运动方向为z
            const front = new THREE.Vector3(0, 0, 1);
            // 改变玩家速度
            v.add(front.multiplyScalar(a * deltaTime));
        }
    }
    

    # .getWorldDirection()

    Object3D类有一个获取模型局部z轴方向相关的方法.getWorldDirection()。

    obj.getWorldDirection()表示的获取obj对象自身z轴正方向在世界坐标空间中的方向。

    模型没有任何旋转情况,.getWorldDirection()获取的结果(0,0,1)

    const mesh = new THREE.Mesh();
    const dir = new THREE.Vector3();
    mesh.getWorldDirection(dir);
    console.log('dir', dir);
    

    模型绕y旋转90度情况,.getWorldDirection()获取的结果(1,0,0)

    const mesh = new THREE.Mesh();
    mesh.rotateY(Math.PI / 2);
    const dir = new THREE.Vector3();
    mesh.getWorldDirection(dir);
    // 模型没有任何选择打印结果(1,0,0)
    console.log('dir', dir);
    

    # .getWorldDirection()获取玩家角色正前方

    注意:threejs加载的玩家角色gltf模型,自身.rotation没有任何旋转的情况下,注意玩家角色正前方方向最好和z轴方向一致,这样就可以直接用.getWorldDirection()获取的结果表示人的正前方。

    // 按下W键,实时计算当前玩家角色的正前方向
    if (keyStates.W) {
        const front = new THREE.Vector3();
        //获取玩家角色(相机)正前方
        player.getWorldDirection(front);
    }
    

    # S键运动方向

    注意S键运动方向与W的正前方相反,这时候很简单,可以计算方向的时候,把front取反,或者最简单加速度设置一个负号front.multiplyScalar(- a * deltaTime)

    function render() {
        if (v.length() < vMax) {//限制最高速度
            if (keyStates.W) {
                const front = new THREE.Vector3();
                player.getWorldDirection(front);//获取玩家角色(相机)正前方
                v.add(front.multiplyScalar(a * deltaTime));
            }
            if (keyStates.S) {
                const front = new THREE.Vector3();
                player.getWorldDirection(front);
                // - a:与W按键反向相反
                v.add(front.multiplyScalar(- a * deltaTime));
            }
        }
    }    
    
    7. 鼠标左右拖动改变玩家视角
    9. 鼠标上下移动只改变相机视角

    ← 7. 鼠标左右拖动改变玩家视角 9. 鼠标上下移动只改变相机视角→

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