首页 > 其他分享 >three动画循环animate使用setAnimationLoop还是requestAnimationFrame

three动画循环animate使用setAnimationLoop还是requestAnimationFrame

时间:2024-08-29 17:37:31浏览次数:6  
标签:动画 requestAnimationFrame three Three renderer animate setAnimationLoop

  初始化render时调用setAnimationLoop

Three.renderer = new THREE.WebGLRenderer({ antialias: true });
Three.renderer.setSize(window.innerWidth, window.innerHeight);
Three.renderer.setAnimationLoop(animate);
animate:
function animate() {
    // requestAnimationFrame(animate);
    Three.controls.update(); //控制器
    Three.renderer.render(Three.scene, Three.camera);
  }

如果你在使用 Three.js 并且需要兼容 VR/AR,setAnimationLoop 是更好的选择;否则,requestAnimationFrame 更通用且适用于更多场景。 

  renderer.setAnimationLoop(animate)requestAnimationFrame(animate) 都可以用来实现动画循环,但它们在使用场景、功能和细节上有所不同,尤其是在涉及 WebGL 和 Three.js 等库时。以下是它们的主要区别:  

1. 用法场景

  • requestAnimationFrame(animate):

    • 原生的 JavaScript 方法,用于在浏览器的下一个重绘周期调用指定的回调函数(通常是动画函数)。
    • 适用于所有类型的动画,包括基于 DOM 的动画、Canvas 动画和 WebGL 动画。
    • 常用于自主控制的动画循环。
  • renderer.setAnimationLoop(animate):

    • 是 Three.js 提供的方法,专门用于与 WebGL 渲染器(如 THREE.WebGLRenderer)配合使用。
    • 主要用于在渲染器与动画同步时,处理虚拟现实(VR)或增强现实(AR)场景,因为它支持 WebXR 设备的帧率管理和帧同步。
    • 适用于需要使用 WebGL 渲染器进行复杂的 3D 场景渲染和动画的场景,尤其是当你需要支持 VR/AR 时。
 

2. 功能与控制

  • requestAnimationFrame(animate):

    • 通过浏览器的刷新率触发回调函数,一般是每秒 60 次(取决于显示器的刷新率)。
    • 完全由开发者控制,可以自由暂停或停止动画循环。
    • 不直接与 Three.js 或 WebGL 渲染器绑定,适用于更多通用场景。
  • renderer.setAnimationLoop(animate):

    • 与 Three.js 的渲染循环紧密集成,可以自动管理帧率,特别是在使用 WebXR 时,能更好地支持设备特定的刷新率和帧同步。
    • 自动处理了 Three.js 中的一些渲染器设置,减少了手动管理渲染过程的需求。
    • 更适合复杂的 3D 渲染场景,因为它会确保在每一帧都与渲染器的状态同步,尤其是当你在使用 VR/AR 时。

3. 支持 VR/AR

  • requestAnimationFrame(animate):

    • 本身不支持 VR/AR,开发者需要手动处理帧率管理和设备同步。
  • renderer.setAnimationLoop(animate):

    • 设计时考虑了 WebXR,支持 VR 和 AR 设备的帧率管理,确保动画和渲染同步。
    • 是在使用 Three.js 构建 VR/AR 应用时的推荐方法。

 4. 代码示例

  使用 requestAnimationFrame:

function animate() {
  // 更新动画状态
  // 渲染场景
  renderer.render(scene, camera);

  // 下一帧继续动画
  requestAnimationFrame(animate);
}

// 开始动画循环
requestAnimationFrame(animate);
 使用 renderer.setAnimationLoop:
function animate() {
  // 更新动画状态
  // 渲染场景
  renderer.render(scene, camera);
}

// 开始动画循环,尤其适合 VR/AR
renderer.setAnimationLoop(animate);

5. 性能与优化(核心)

  • requestAnimationFrame(animate):
    • 完全由浏览器控制帧率,适合通用动画,但需要手动管理帧率和优化渲染流程。
  • renderer.setAnimationLoop(animate):
    • 自动优化了与 Three.js 渲染器的集成,尤其是复杂 3D 场景下的性能表现,减少了需要手动优化的部分。

 

总结

  • requestAnimationFrame(animate): 更通用的动画控制方法,适用于所有类型的动画场景。如果你需要更细粒度的控制或不使用 Three.js 进行渲染,这是一个更通用的选择。
  • renderer.setAnimationLoop(animate): 特别适合使用 Three.js 进行 WebGL 渲染,尤其是 VR/AR 应用,提供更好的设备支持和帧同步管理。

如果你在使用 Three.js 并且需要兼容 VR/AR,setAnimationLoop 是更好的选择;否则,requestAnimationFrame 更通用且适用于更多场景。

 

 

 

标签:动画,requestAnimationFrame,three,Three,renderer,animate,setAnimationLoop
From: https://www.cnblogs.com/Simoon/p/18387244

相关文章

  • three.js低代码 编辑器 ,和 相应 3d 功能案例 ,cesium
    开发历程低代码的开发是非常曲折的,尤其是早期根本没有任何参考作品或者相关的一些知识博客去引领我们去做,会经历多次的推到再到重头再来,又需要开发者有很高的知识储备,举步维艰。以下是我的一些的功能分布,希望能对你有一些启发,让你少走一些弯路。预览查看https://z25863......
  • [ARC175E] Three View Drawing
    MyBlogs[ARC175E]ThreeViewDrawing哎,构造。首先考虑\(m=n^2\)怎么做:显然是最上面一层填满第一条主对角线,第二层填满第二条主对角线...(主对角线指可以循环的对角线)。把\(n\)变成满足\(n^2\geqm\)的最小的\(n\)。然后考虑删去\(n^2-m\)个。可以发现(谁能发现啊啊啊......
  • threeJs 修改TransformControls的显示位置
    有的时候模型的原点不是自身中心而是在场景的[0,0,0]位置这个时候想要让TransformControls的位置显示在模型的中心目前找的的处理方式是修改源码找到updateMatrixWorld方法updateMatrixWorld(){...for(leti=0;i<handles.length;i++){ ... if(this......
  • ThreeJS Shader的效果样例雷达图和大气层(二)
    一、雷达图   实现原理:图中是一个旋转的渐变扇形,可以通过先实现一个扇形、然后再实现一个渐变扇形,最后再将扇形旋转来达到最终效果1. 实现一个夹角为O的扇形,已X轴正方向为单位向量M,UV点到(0,0)形成向量N,通过M和N的点乘就可以得到一个夹角,然后判断角度小于O就可以了2. 实......
  • 看了几十篇论文,实现了个专业算法,用threejs做了个三维人员定位系统示例(已开源)
    需求“threejs中能不能给定几组三维坐标(或者CAD绘制的三维多段线),给一个断面形状,直接生成三维管道?”例如原始CAD图如下:要求用threejs获取线的三维坐标数据自动生成的三维管道效果图如下: 分析如果直接对每条线用threejs中的THREE.TubeGeometry去绘制的话,会出现交岔口出......
  • 【Three.JS零基础入门教程】第七篇:材质详解
      前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换【Three.JS零基础入门教程】第五篇:项目规划【Three.JS零基础入门教程】第六篇:物......
  • Nuxt3 使用animate.css来实现页面切换过渡效果
    首先,如果两个page分别在不同的layout下,是无法使用pageTransition来实现切换效果的,这时候需要使用layoutTransition来实现切换效果这里采用npmpackage的方式安装animate.css,当然采用cdn的形式也是可以的npmianimate.css然后在app.vue中导入<scriptsetup>import"anima......
  • 【Three.JS零基础入门教程】第八篇:材质详解
     前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换【Three.JS零基础入门教程】第五篇:项目规划【Three.JS零基础入门教程】第六篇:物体......
  • 【Three.JS零基础入门教程】第六篇:物体详解
     前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换【Three.JS零基础入门教程】第五篇:项目规划下面将进一步详解介绍Threejs中的常用......
  • 【Three.JS零基础入门教程】第五篇:项目规划
     前期回顾:【Three.JS零基础入门教程】第一篇:搭建开发环境【Three.JS零基础入门教程】第二篇:起步案例【Three.JS零基础入门教程】第三篇:开发辅助【Three.JS零基础入门教程】第四篇:基础变换一个three.js的项目由这么几个部分组成场景物体灯光相机渲染器工具这里我们可以......