JavaScript Canvas 实现自由落体与反弹动画
本文详解如何使用 JavaScript 和 Canvas 模拟物体自由落体及反弹效果。文章结合重力势能与动能转换原理,推导下落位移公式 y=(1/2)gt^2,并分享在解决反弹位移计算难题时,采用数组存储下落轨迹数据以优化视觉效果的实战方案。
JavaScript Canvas 自由落体动画实现
本文分享了一段使用 JavaScript 实现自由落体动画效果的具体代码,供读者参考学习。
首先展示最终实现的视觉效果。

实现原理分析
接下来对实现思路进行详细分析。
核心步骤是利用 Canvas 绘制圆球以及地面背景。
下落阶段物理计算
动画分为下落和反弹两个主要阶段。
回顾基础物理知识:在不考虑空气阻力的情况下,物体下落过程是重力势能转化为动能的过程。
重力势能的计算公式为 Ep = mgh。
动能的计算公式为 Ek = (1/2)mv^2。
物体下落时,速度从 0 开始逐渐增加至 gt。
在此过程中,需要计算浏览器每次渲染时圆球的 Y 轴坐标。
根据物理公式,下落位移 Y 的计算公式为 Y = (1/2)gt^2。
反弹阶段的处理方案
第二阶段为反弹过程。
此时动能重新转化为重力势能。
物体的速度逐渐减小,直至变为 0。
作者最初尝试使用公式 Y = (1/2)g(t-t1)^2 来计算反弹位移,其中 t1 代表下落或反弹所消耗的时间。
然而,实际运行效果并不理想,推测是反弹位移的计算逻辑存在偏差。经过反复思考仍未找到完美解决方案,若有更优实现方式,欢迎交流。
因此,最终决定将下落过程中的位移数据保存到一个数组中,在反弹阶段逐一取出并赋值,以此模拟反弹效果。
代码实现与总结
以下是具体的代码实现部分。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body {
padding: 0;
margin: 0;
background-color: rgba(0, 0, 0, 1);
}
#canvas{
display: block;
margin: 10px auto;
}
</style>
</head>
<body>
<canvas id="canvas" width="600" height="600">your browser is not support canvas</canvas>
<script type="text/javascript">
//自由落体 H=(gt^2)/2 动能 Ek=(mv^2)/2 重力势能:Ep = mgh
let x=300,y=60, //圆心坐标
minHeight = 60, //最小下落位移
maxHeight = 446, //最大下落位移
dir = true; //dir true下落,false为弹起
(function(){
let canvas= document.getElementById('canvas');
let ctx = canvas.getContext('2d');
draw(ctx);
})();
function draw(ctx){
let currentTime = new Date().getTime(); //开始毫秒数,折返记录一次currentTime
let arr_y = []; //设置下落位移的数组
window.requestAnimationFrame(function init(){
if(dir){
if(y >= maxHeight){
dir = false;
currentTime = new Date().getTime();
}else{
y = y + Math.pow((new Date().getTime() - currentTime)/1000,2)*10/2;
arr_y.push(y);
}
}else{
if(y <= minHeight){
dir = true;
currentTime = new Date().getTime();
}else{
y = arr_y.splice(-1,1)[0] || 60;
}
}
drawArc(ctx,x,y);
requestAnimationFrame(init);
});
}
//绘制圆球和地面
function drawArc(ctx,x,y){
ctx.clearRect(0, 0, 600, 600);
ctx.beginPath();
ctx.arc(x,y,50,0,Math.PI*2);
ctx.fillStyle='#98adf0';
ctx.fill();
ctx.save();
ctx.beginPath();
ctx.strokeStyle = '#ffffff';
ctx.moveTo(0,500);
ctx.lineTo(600,500);
ctx.lineWidth = 4;
ctx.stroke();
ctx.closePath();
ctx.save();
}
</script>
</body>
</html>
文章最后进行总结。
尽管这只是一个简单的下落与弹起动画,但为了确定反弹位移的正确计算方法,作者花费了整整 6 天时间进行思考与调试。
初期的思路主要集中在位移计算上。
下落位移对应开口向上的抛物线方程。
即公式 Y = (1/2)gt^2。
作者曾思考,反弹位移是否可以通过将抛物线沿 X 轴右移 t1 得到。
由此推导出公式 Y = (1/2)g(t-t1)^2。
有兴趣的读者可以尝试应用该公式查看效果。
由于浏览器渲染该公式下的反弹效果不尽如人意,作者未能找到理想的位移计算方法,最终改用数组存储数据的方式来实现动画。
以上就是本文的全部内容,希望能为读者提供学习上的帮助,也欢迎大家继续支持本站。
JavaScript将图片转换为Base64编码的两种途径
2026-11-05 16:43:05
怎么在 Vue 或 React 项目中正确集成 animate.js
2026-11-05 10:23:38
JS注册事件:addEventListener基础语法与参数详解
2026-11-05 08:44:56
JSP和JS的区别:运行环境与服务端/客户端职责解析
2026-11-04 23:34:36
pdf.js 官方下载地址:GitHub Release 获取预编译包
2026-11-04 23:07:27
