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.WebGPU快速入门

  • 2. 3D几何变换数学基础

    • 1. 数学基础(平移、旋转、缩放矩阵)
    • 2. 模型矩阵
    • 3. gl-matrix数学计算库
    • 4. 顶点着色器矩阵变换
    • 5. WebGPU传递uniform数据
    • 6. gl-matrix生成顶点着色器的矩阵
    • 7. WebGPU动画(uniform旋转矩阵)
    • 8. 绕y轴旋转动画
      • 9. 片元的屏幕坐标
      • 10. 片元深度值、深度缓冲区
      • 11. WebGPU顶点数据插值计算
      • 12. 练习—顶点位置插值
      • 13. 顶点颜色数据插值计算
      • 14. 顶点位置、颜色数据共享缓冲区
      • 15. 练习-顶点颜色
      • 16. 结构体作为WGLSL函数参数
    • WebGPU教程
    • 2. 3D几何变换数学基础
    郭隆邦
    2023-05-20
    目录

    8. 绕y轴旋转动画

    # 绕y轴旋转动画

    上节课给大家演示了矩形平面绕z轴旋转,本节课给大家展示一个绕y轴旋转的案例。

    # 绕y轴旋转

    在上节课代码基础上给大家讲解。

    在渲染循环render函数外面,创建一个uniform的缓冲区用来存储矩阵数据,然后在render里面更新缓冲区中的矩阵数据,没必要重新创建,毕竟每个缓冲区都会占用GPU显存空间。

    const modelMatrixBuffer = device.createBuffer({
        size: 16*4,//旋转矩阵16个元素,每个元素占4个字节
        usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
    });
    
    // .create()创建一个单位矩阵
    const modelMatrix = glMatrix.mat4.create();
    // 在GPU显存上创建一个uniform数据缓冲区
    const modelMatrixBuffer = device.createBuffer({
        size: modelMatrix.byteLength,
        usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
    });
    

    渲染循环函数render每次执行,重新生成对应的绕y轴旋转的矩阵,更新原来uniform缓冲区中的矩阵数据。

    //渲染循环
    let angle = 0.0;
    function render() {
        angle += 0.05;
        const modelMatrix = glMatrix.mat4.create();
        glMatrix.mat4.rotateY(modelMatrix, modelMatrix,angle);
        device.queue.writeBuffer(modelMatrixBuffer, 0, modelMatrix)
        ...
        const commandEncoder = device.createCommandEncoder();
        ...
        renderPass.draw(6);
        ...
        requestAnimationFrame(render);
    }
    render()
    

    # 绕y旋转矩形平面显示不完整

    你会发现上面绕y旋转矩形平面显示不完整,原因很简单,你回顾1.8.WebGPU 3D坐标系(投影) (opens new window)讲解的知识点就会明白。

    具体说就是当矩形平面旋转的时候,矩形z的值不在0~1范围的部分被剪裁了。

    如果你想看到完整的

    //渲染循环
    let angle = 0.0;
    function render() {
        angle += 0.05;
        const modelMatrix = glMatrix.mat4.create();
        // 每次操作(旋转后,再平移)
        glMatrix.mat4.translate(modelMatrix, modelMatrix,[0,0,0.5]);//后平移,不平移矩形平面会被剪裁掉一半
        glMatrix.mat4.rotateY(modelMatrix, modelMatrix,angle);//先旋转
        device.queue.writeBuffer(modelMatrixBuffer, 0, modelMatrix)
        ...
        const commandEncoder = device.createCommandEncoder();
        ...
        renderPass.draw(6);
        ...
        requestAnimationFrame(render);
    }
    render()
    
    7. WebGPU动画(uniform旋转矩阵)
    9. 片元的屏幕坐标

    ← 7. WebGPU动画(uniform旋转矩阵) 9. 片元的屏幕坐标→

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