threejs 绘制球体_【webGl】threejs实现一个简单的动画-弹跳的小球

在这里,我们将动态画面简称为动画(animation)。正如动画片的原理一样,动画的本质是利用了人眼的视觉暂留特性,快速地变换画面,从而产生物体在运动的假象。而对于Three.js程序而言,动画的实现也是通过在每秒中多次重绘画面实现的。

为了衡量画面切换速度,引入了每秒帧数FPS(Frames Per Second)的概念,是指每秒画面重绘的次数。FPS越大,则动画效果越平滑,当FPS小于20时,一般就能明显感受到画面的卡滞现象。

那么FPS是不是越大越好呢?其实也未必。当FPS足够大(比如达到60),再增加帧数人眼也不会感受到明显的变化,反而相应地就要消耗更多资源(比如电影的胶片就需要更长了,或是电脑刷新画面需要消耗计算资源等等)。因此,选择一个适中的FPS即可。

NTSC标准的电视FPS是30,PAL标准的电视FPS是25,电影的FPS标准为24。而对于Three.js动画而言,一般FPS在30到60之间都是可取的。

setInterval方法

如果要设置特定的FPS(虽然严格来说,即使使用这种方法,JavaScript也不能保证帧数精确性),可以使用JavaScript DOM定义的方法:

setInterval(func,msec)

其中,func是每过msec毫秒执行的函数,如果将func定义为重绘画面的函数,就能实现动画效果。setInterval函数返回一个id,如果需要停止重绘,需要使用clearInterval方法,并传入该id,具体的做法为:

requestAnimationFrame方法

大多数时候,我们并不在意多久重绘一次,这时候就适合用requestAnimationFrame方法了。它告诉浏览器在合适的时候调用指定函数,通常可能达到60FPS。

如何取舍

setInterval方法与requestAnimationFrame方法的区别较为微妙。一方面,最明显的差别表现在setInterval可以手动设定FPS,而requestAnimationFrame则会自动设定FPS;但另一方面,即使是setInterval也不能保证按照给定的FPS执行,在浏览器处理繁忙时,很可能低于设定值。当浏览器达不到设定的调用周期时,requestAnimationFrame采用跳过某些帧的方式来表现动画,虽然会有卡滞的效果但是整体速度不会拖慢,而setInterval会因此使整个程序放慢运行,但是每一帧都会绘制出来;

总而言之,requestAnimationFrame适用于对于时间较为敏感的环境(但是动画逻辑更加复杂),而setInterval则可在保证程序的运算不至于导致延迟的情况下提供更加简洁的逻辑(无需自行处理时间)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过在HTML中使用video标签,我们可以将WebGL渲染的内容展示在视频中。具体实现方式如下: 1. 首先,我们需要创建一个WebGL上下文并准备要绘制的场景。 2. 然后,我们需要将WebGL渲染的内容绘制一个布上。 3. 接着,我们需要将布转换为视频帧并将其添加到视频元素中。 4. 最后,我们可以使用JavaScript代码控制视频的播放和暂停等行为。 下面是一些实现步骤的详细说明: 1. 创建WebGL上下文并准备场景 使用WebGL创建场景的步骤与常规的WebGL应用程序类似。我们需要创建一个布、一个WebGL上下文和场景中的各种对象(例如,立方体、球体、平面等)。 2. 将WebGL渲染的内容绘制布上 使用WebGL绘制出场景后,我们需要将其绘制布上。可以使用WebGLRenderingContext的drawArrays或drawElements方法来实现。 3. 将布转换为视频帧并添加到视频元素中 将布转换为视频帧需要使用CanvasRenderingContext2D的drawImage方法。我们需要将布作为参数传递给该方法,并将返回的ImageData对象传递给HTML5 Video API中的addTextTrack方法。这将为视频元素创建一个新的文本轨道,并将视频帧添加到该轨道中。 4. 控制视频的播放和暂停等行为 可以使用HTML5 Video API中提供的各种方法和事件来控制视频元素。例如,我们可以使用play和pause方法来控制视频的播放和暂停,currentTime属性来设置视频的当前时间等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值