JavaScript Canvas 实现自由落体与反弹动画

作者:流萤时间:2026-10-22 17:23:52浏览:571

本文详解如何使用 JavaScript 和 Canvas 模拟物体自由落体及反弹效果。文章结合重力势能与动能转换原理,推导下落位移公式 y=(1/2)gt^2,并分享在解决反弹位移计算难题时,采用数组存储下落轨迹数据以优化视觉效果的实战方案。

JavaScript Canvas 自由落体动画实现

本文分享了一段使用 JavaScript 实现自由落体动画效果的具体代码,供读者参考学习。

首先展示最终实现的视觉效果。

JavaScript Canvas 自由落体动画实现

实现原理分析

接下来对实现思路进行详细分析。

核心步骤是利用 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。

有兴趣的读者可以尝试应用该公式查看效果。

由于浏览器渲染该公式下的反弹效果不尽如人意,作者未能找到理想的位移计算方法,最终改用数组存储数据的方式来实现动画。

以上就是本文的全部内容,希望能为读者提供学习上的帮助,也欢迎大家继续支持本站。

作者最新文章